WMap
Библиотека карт на основе openlayers6
WMap: Wonderful Map Блог: https://blog.csdn.net/qq_39404437/article/details/123628440 CSDN: 林大大哟, есть bug/предложения? Пожалуйста, подпишитесь на меня и напишите в личные сообщения / создайте issue на Gitee.
Локальная среда разработки: проект запускается с помощью vite, зависимости устанавливаются с использованием pnpm/npm install, pnpm/npm run dev. После запуска добавьте /demos/home.html для перехода к соответствующему примеру demo. Например: http://localhost:3000/demos/home.html.
Производственная среда: для сборки используйте pnpm/npm run build, затем используйте пакеты umd.js/es.js и импортируйте таблицу стилей index.css в соответствии с вашими потребностями.
Спонсорство
Надеюсь, что вы сможете поддержать проект. Как независимый разработчик, это очень сложно... Я сразу же опубликую список спонсоров в журнале.
-1. GPS (широта и долгота шифрования)
Примечание: в Китае требуется класс GPS для преобразования координат WGS в координаты GCJ (независимо от того, используется ли Baidu или другие карты).
const point = [116.482301, 39.99639] const encPoint = new WMap.GPS().gcj_encrypt(point[0], point[1]) // Шифрование данных const decPoint = new WMap.GPS().gcj_decrypt(encPoint.lng, encPoint.lat) // Расшифровка данных
При преобразовании класса GPS метод должен использовать широту в качестве первого параметра и долготу в качестве второго параметра. В других местах карты используются сначала долгота, а затем широта.
Подробности метода:
gcj_encrypt(wgsLon, wgsLat) — WGS-84 to GCJ-02 gcj_decrypt(gcjLon, gcjLat) — GCJ-02 to WGS-84
0. LngLat (класс широты и долготы)
Примечание. Все широты и долготы, передаваемые на локальную карту, должны быть преобразованы с использованием класса широты и долготы перед использованием.
const point = [116.477648,39.997149] // Исходные координаты // По умолчанию карта использует систему координат 'EPSG:3857', переданные значения — 'EPSG:4326'
// Параметры lng: number // Долгота lat: number // Широта
// Выходные данные { this.olat: number // 'EPSG:3857' Ниже широта this.olng: number // 'EPSG:3857' Ниже долгота this.lat: number // Переданная широта this.lng: number // Переданная долгота }
// Подробности метода fromLonLat(coordinate: {lng: number, lat: number}, projection: string = 'EPSG:3857') — Преобразование координат EPSG:4326 в проекцию 'EPSG:3857'. toLonLat(coordinate: {lng: number, lat: number}, projection: string = 'EPSG:3857') — Проекция 'EPSG:3857' в координаты EPSG:4326. getLng() — Получить переданную долготу. getLat() — Получить переданный широту. offset(x: number, y: number) — Текущие координаты широты и долготы перемещаются на w по долготе и s по широте, чтобы получить новые координаты. Долгота перемещается вправо как положительное значение, широта перемещается вверх как положительное значение. Единица измерения — метры. distance(lnglat: {lng: number, lat: number}) — Расстояние между текущей широтой и долготой и переданной широтой и долготой или массивом широт и долгот. Единица измерения — метр. outOfChina(lat: number, lng: number) — Определить, находится ли координата за пределами Китая.
1. Map (класс карты)
const map = new WMap.Map(target, options)
Параметры: target: 'map', — По умолчанию привязано к dom options: { center: new WMap.LngLat(97.848297, 35.49053), — Центр карты zoom: 6, — Уровень масштабирования карты minZoom: 0, — Минимальный уровень масштабирования maxZoom: 18, — Максимальный уровень масштабирования doubleClickZoom: false, — Включить ли двойное нажатие для увеличения zoomShow: true, — Отображать ли элементы управления масштабированием rotateShow: false, — Отображать ли элемент управления поворотом и сбросом fullScreen: true, — Отображать ли полноэкранный элемент управления maxExtent: false, — Ограничивать ли диапазон перемещения карты mouseMoveExtent: boundingExtent([ — Диапазон отображения по умолчанию [55.923433618652325, 3.359091468750009], [171.31664592155698, 81.65358702968221] ]) }
Метод: map.getCenter() — Получить центр карты. map.getMaxZoom() — Получить максимальный уровень масштабирования, установленный картой. map.getMinZoom() — Получить минимальный уровень масштабирования, установленный картой. map.updateSize() — Принудительно обновить размер окна просмотра карты. map.getCoordinateFromPixel() — Получить текущую координату точки нажатия. map.getPixelFromCoordinate() — Получить пиксель текущей координаты широты и долготы. map.getZoom() — Получить текущий уровень масштабирования. map.setZoom(zoom: number) — Установить текущий уровень масштабирования. map.setCenter(coord: Array[number], zoom: number = 0) — Установите центр карты. map.panTo(coord: Array[number]) — Направьте на целевую позицию. map.setBaseLayer(layerName: string = standard) — satellite — Спутниковый слой карты, standard — Стандартный слой карты. map.add(markers: Array[Marker] | Marker | INFOWINDOW | ContextMenu | POLYLINE) — Добавить один или несколько объектов (включая, но не ограничиваясь объектами, информационными окнами, контекстными меню, полилиниями). map.remove(markers: Array[Marker] | Marker | INFOWINDOW | ContextMenu | POLYLINE) — Удалить один или несколько объектов (включая, но не ограничиваясь объектами, информационными окнами, контекстными меню, полилиниями). map.setFitView() — Карта автоматически адаптируется ко всем объектам или векторным графикам для достижения наилучшего окна просмотра. map.setZoomOut(zoomNum: number = 1) — Уменьшить масштаб карты. map.setZoomIn(zoomNum: number = 1) — Увеличить масштаб карты. map.removeGraph(draw: VectorGraph) — Удалите интерактивный график. map.addGraph(draw: VectorGraph) — Добавьте интерактивный график. map.getInteractions() — Получите все интерактивные графики. map.clear() — Очистите объекты всех типов на карте (включая, помимо прочего, агрегированные/обычные объекты/векторные графики/исторические траектории). map.getMarkerById(id) — Получить объект из совокупности. map.calculateCenter(Array[Marker]) — Вычислить центр кластера объектов. map.setBaseMap(mapName: 'amap', token?: 'xxx') — Динамически установить набор слоёв. Для Baidu setBaseMap('amap'), для Tianditu setBaseMap('tianditu', token). map.getBaseMap() — Получить отображаемый в данный момент базовый слой. map.addLayer(layer) — Добавить слой. map.getMarkerClusterer() — Получить слой агрегации. map.setMarkerClusterer() — Установите слой агрегации. map.setTop() — Установить верхний уровень. Поддерживаются события: ['complete', 'moveend', 'click', 'dblclick', 'contextmenu', 'moving', 'pointermove']. Параметры:
Методы:
Поддержка событий:
['modifyend'].
# Point (класс точки фигуры)
```bash
let point = new WMap.Point({
map: map,
center: new WMap.LngLat(116.479662, 39.996956),
extData: {'name': 'точка'}
})
// Левое нажатие кнопки мыши
point.on('click', e => {
console.log(e.target.getExtData())
})
// Правое нажатие кнопки мыши
point.on('contextmenu', e => {
console.log(e.target.getExtData())
})
// Двойное нажатие левой кнопки мыши
point.on('dblclick', e => {
console.log(e.target.getExtData())
})
// Параметры:
map: напрямую передаётся экземпляр карты, если этот параметр не заполнить, то можно добавить с помощью map.add;
center: координаты широты и долготы;
extData: пользовательские данные.
// Методы:
point.show() — показать точку на карте;
point.hide() — скрыть точку на карте;
point.getExtData() — получить пользовательские данные.
let line= new WMap.Line({
map: map,
path: [new WMap.LngLat(116.477648, 39.997149), new WMap.LngLat(116.480078, 39.996506)],
extData:{'name': 'линия'}
})
// Левое нажатие кнопки мыши
line.on('click', e => {
console.log(e.target.getExtData())
})
// Правое нажатие кнопки мыши
line.on('contextmenu', e => {
console.log(e.target.getExtData())
})
// Двойное нажатие левой кнопки мыши
line.on('dblclick', e => {
console.log(e.target.getExtData())
})
// Параметры:
map: напрямую передаётся экземпляр карты, если этот параметр не заполнить, то можно добавить с помощью map.add;
path: массив координат широты и долготы;
extData: пользовательские данные.
// Методы:
line.show() — показать линию на карте;
line.hide() — скрыть линию на карте;
line.getExtData() — получить пользовательские данные;
line.setPath() — изменить отрезок линии.
const circle = new WMap.Circle({
map: map,
center: new WMap.LngLat(116.47614550262452, 39.99763225396728),
radius: 81.7,
extData:{'name': 'круг'},
option: { // Пользовательские параметры стиля
fillColor: '#264df6', // Цвет заливки
strokeColor: '#264df6', // Цвет контура
strokeWidth: 2, // Ширина контура
lineCap: 'round', // Стиль линии: butt, round или square
lineJoin: 'round', // Стиль соединения линий: bevel, round или miter
imageRadius: 7, // Размер точки в стиле
imageFill: '#264df6' // Заполнение точки в стиле
}
})
// Левое нажатие кнопки мыши
circle.on('click', e => {
console.log(e.target.getExtData())
})
// Правое нажатие кнопки мыши
circle.on('contextmenu', e => {
console.log(e.target.getExtData())
})
// Двойное нажатие левой кнопки мыши
circle.on('dblclick', e => {
console.log(e.target.getExtData())
})
// Параметры:
map: напрямую передаётся экземпляр карты, если этот параметр не заполнить, то можно добавить с помощью map.add;
center: координаты широты и долготы центра;
radius: длина радиуса;
extData: пользовательские данные.
// Методы:
circle.show() — показать круг на карте;
circle.hide() — скрыть круг на карте;
circle.getExtData() — получить пользовательские данные.
const polygon = new WMap.Polygon({
map: map,
path: [new WMap.LngLat(116.47699844509125, 39.9982652552948), new WMap.LngLat(116.47721838623048, 39.997278202377316), new WMap.LngLat(116.47869360118867, 39.99738549073791), new WMap.LngLat(116.47857558399201, 39.9979058392868), new WMap.LngLat(116.47837710052491, 39.99842618783569)],
extData: {'name': 'многоугольник'},
option: { // Пользовательские параметры стиля
fillColor: '#264df6', // Цвет заливки
strokeColor: '#264df6', // Цвет контура
strokeWidth: 2, // Ширина контура
lineCap: 'round', // Стиль линии: butt, round или square
lineJoin: 'round', // Стиль соединения линий: bevel, round или miter
imageRadius: 7, // Размер точки в стиле
imageFill: '#264df6' // Заполнение точки в стиле
}
})
// Левое нажатие кнопки мыши
polygon.on('click', e => {
console.log(e.target.getExtData())
})
// Правое нажатие кнопки мыши
polygon.on('contextmenu', e => {
console.log(e.target.getExtData())
})
// Двойное нажатие левой кнопки мыши
polygon.on('dblclick', e => {
console.log(e.target.getExtData())
})
// Параметры:
map: напрямую передаётся экземпляр карты, если этот параметр не заполнить, то можно добавить с помощью map.add;
path: массив координат широты и долготы вершин многоугольника;
extData: пользовательские данные.
// Методы:
polygon.show() — показать многоугольник на карте;
polygon.hide() — скрыть многоугольник на карте;
polygon.getExtData() — получить пользовательские данные.
const rectangle = new WMap.Rectangle({
map: map,
path: [new WMap.LngLat(116.48053896099091,39.99640916665649), new WMap.LngLat(116.48225557476044, 39.99715482076263)],
extData: {'name': 'прямоугольник'},
option: { // Пользовательские параметры стиля
fillColor: '#264df6', // Цвет заливки
strokeColor: '#264df6', // Цвет контура
strokeWidth: 2, // Ширина контура
lineCap: 'round', // Стиль линии: butt, round или square
lineJoin: 'round', // Стиль соединения линий: bevel, round или miter
imageRadius: 7, // Размер точки в стиле
imageFill: '#264df6' // Заполнение точки в стиле
}
})
// Левое нажатие кнопки мыши
rectangle.on('click', e => {
console.log(e.target.getExtData())
})
// Правое нажатие кнопки мыши
rectangle.on('contextmenu', e => {
console.log(e.target.getExtData())
})
// Двойное нажатие левой кнопки мыши
rectangle.on('dblclick', e => {
console.log(e.target.getExtData())
})
// Параметры:
map: напрямую передаётся экземпляр карты, если этот параметр не заполнить, то можно добавить с помощью map.add;
path: массив координат широты и долготы сторон прямоугольника;
extData: пользовательские данные. **Методы: подробности**
rectangle.show() — на карте отображается многоугольник.
rectangle.hide() — на карте скрывается многоугольник.
rectangle.getExtData() — получение пользовательских данных.
**11. InfoWindow (класс информационного окна)**
Существует несколько способов создания экземпляра класса информационного окна:
* Способ 1: обычный режим.
let Single1 = new WMap.InfoWindow({
title: 'Метка',
content: 'Это метка.',
offset: [0, 0],
width: 200,
height: 100
});
* Способ 2: пользовательский режим с передачей DOM.
let Single2 = new WMap.InfoWindow({
content: document.querySelector('#single'),
offset: [0, 0],
width: 200,
height: 100
});
* Способ 3: пользовательский режим с передачей HTML-строки.
let Single = new WMap.InfoWindow({
content: `<div>123</div>`,
offset: [0, 0],
width: 200,
height: 100
});
Параметры:
content: (string | HTMLDivElement | HtmlString) — содержимое.
title: string = 'Информационное окно' — заголовок в обычном режиме.
offset: Array[number] = [0, 0] — второй сдвиг.
position: string = 'top-left' — первый сдвиг.
width = 200 — ширина информационного окна по умолчанию (box-sizing: border-box).
height = 100 — высота информационного окна по умолчанию (box-sizing: border-box).
Поддерживаются события: ['click', 'dblclick', 'contextmenu'].
**12. Polyline (класс траектории)**
В основном класс траектории используется для отслеживания траектории движения транспортного средства и включает три типа экземпляров:
* исторические экземпляры двойной траектории;
* исторические экземпляры одиночной траектории;
* экземпляры текущей траектории.
Каждый тип экземпляра состоит из класса Polyline и класса Marker.
Класс Polyline:
mode: 'all' — режим траектории.
path: [] — массив координат точек.
zIndex: 2 — порядок наложения объектов.
showDir: true — показывать ли белый указатель направления.
strokeOpacity: 0.9 — прозрачность линии.
strokeWeight: 10 — толщина линии.
strokeStyle: 'solid' — стиль контура линии (сплошная линия: solid, пунктирная линия: dashed).
strokeDasharray: [] — интервал контура линии.
lineCap: 'butt' — способ обработки концов ломаной линии, по умолчанию — без головы (butt), другие варианты: round (с круглой головкой), square (с квадратной головкой).
lineJoin: 'round' — метод обработки углов ломаной линии, по умолчанию — скруглённые углы (round), другие варианты: round (скруглённые углы), bevel (скошенные углы).
isOutline: false — есть ли контур у линии, по умолчанию — нет.
borderWeight: 10 — ширина контура, по умолчанию равна 1.
outlineColor: '#000000' — цвет контура линии, этот параметр действует только при isOutline = true, по умолчанию: #000000.
extData: null — пользовательские данные.
segmentLength: 50 — обработка пути на сегменты, чтобы предотвратить слишком большие промежутки между путями, по умолчанию равно 50 м.
strokeColor?: '#28F' — цвет линии.
activeStrokeColor?: 'green' — цвет активной линии, по умолчанию зелёный.
segmentLength: 2 — минимальная длина подпути.
units: 'meters' — единицы измерения минимальной длины подпути.
Общие методы класса Polyline:
polyline.setPath() — установить текущий путь координат.
polyline.clearHistoryPath() — очистить исторический путь траектории.
polyline.clearRealPath() — очистить текущий путь траектории.
polyline.getHistoryPath() — получить исторический путь траектории.
polyline.getRealPath() — получить текущий путь траектории.
polyline.setVisible(type: boolean) — скрыть или показать историческую траекторию (только для режима исторической траектории).
Класс Marker:
marker.move(polyline, curPath) — начало движения по текущей траектории при движении транспортного средства.
marker.getIndex() — исходный индекс пути движения в исторической траектории.
marker.getMoveIndex() — виртуальный индекс пути движения в исторической траектории.
marker.getRatio() — текущая скорость движения транспортного средства в исторической траектории.
marker.updateMoveDistance(radio: Number) — обновление текущего расстояния движения транспортного средства (используется для перетаскивания индикатора выполнения), параметр — число с плавающей запятой от 0 до 1.
marker.updateMoveSpeed(radio: Number) — обновить текущую скорость движения транспортного средства, параметр — число с плавающей запятой.
marker.moveAlong(path = [], angleFixed = false, speed = 60, lockScope = true) — начать движение транспортного средства вдоль пути, рекомендуется использовать четвёртый параметр для достижения лучшего эффекта.
marker.stopMove() — остановить движение транспортного средства.
marker.resumeMove() — возобновить движение транспортного средства после остановки.
marker.pauseMove() — приостановить движение транспортного средства.
Как определить нужный экземпляр?
При создании экземпляра класса Polyline можно определить:
* наличие параметров strokeColor и activeStrokeColor означает двойную историческую траекторию;
* наличие параметра strokeColor означает одиночную историческую траекторию;
* наличие параметра activeStrokeColor означает текущую траекторию.
**13. ContextMenu (класс контекстного меню)**
Пример экземпляра класса контекстного меню:
const contextMenu = new WMap.ContextMenu();
По умолчанию:
this.defaultMenuList = [ // меню по умолчанию
{
title: 'Увеличить уровень',
callBack: () => {
this.map.setZoomIn()
}
},
{
title: 'Уменьшить уровень',
callBack: () => {
this.map.setZoomOut()
}
}
];
Методы:
* добавить подменю: contextMenu.addMenu({title: string, callBack: Function});
* удалить подменю: contextMenu.removeMenu(title: string);
* отобразить контекстное меню: contextMenu.open(map: Map, coordinate: Array[lng: number, lat: number]).
**14. Tool (класс инструмента)**
Пример создания инструмента:
let tools = new WMap.Tool(map, {style: 样式, unit: 进制单位(km | m)});
Параметры класса Tool:
map — экземпляр карты.
style — стиль, если не установлен, будет использоваться общий стиль.
unit — единица измерения (км или м), при измерении длины или площади результат будет отображаться в км или м, по умолчанию км.
Методы класса Tool:
tools.setStyle() — установка стиля отображения.
tools.getStyle() — получение стиля отображения.
tools.close() — прекращение использования инструмента.
tools.distance() — начало измерения расстояния.
tools.area() — начало измерения площади. ```
tools.remove(featrue) // 删除对应的矢量图形, feature 为下面 done 事件返回的 feature
// 监听工具类完成返回结果
tools.on('done', e => {
console.log(e)
feature = e.feature
})
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )