项目中leafleft使用方法整理
2023-12-28 12:30:38
leaftlet地图使用文档
一、文件结构
|- map/
| |- draw # 内置绘制方法
| |- heatMap # 热力图
| |- leaflet # leaflet
| |- minimap # 小地图
| |- pruneCluster # 通用场景 点聚合
| |- track # 卷帘
| |- jquery.min.js # jquery
| |- L.Menu.css # 菜单
| |- Leaflet.Marker.SlideTo.js # marker标记
| |- map.js # 自定义地图方法
| |- Menu.js # 菜单相关
| |- Semicircle.js # 圆相关
| |- transform.js # 变换
二、具体方法
1.?参数配置(options)
名称 | 类型 | 描述 |
id | String | 地图容器ID |
url | String | 电子地图服务地址 |
satelliteUrl | String | 卫星服务地址 |
mapCenter | Array | 地图中心位置 [纬度,经度] |
mapZoom | Number | 放大层级 |
minZoom | Number | 最小缩放级别 |
maxZoom | Number | 最大缩放级别 |
mapId | String | 地图视图 |
imgUrl | String | 图片路径 |
serviceUrl | String(‘/api’) | 接口服务 |
markerDraggable | Boolean | 设备标注拖动 |
loadDevice | Boolean | 加载设备 |
markerCluster | Boolean | 是否点聚合 |
deviceStatus | Boolean | 设备显示状态 |
2. 初始化地图
加载地图底层对象:new L.Map(id,{配置项})
监听地图点击: this.map.on(‘click’, function(e){
// [ e.latlng.lat, e.latlng.lng ]
latlngs = e.latlng
}, this);
监听地图鼠标抬起: this.map.on(‘mouseup’,function(){}, this)
信息通知:
window.top.portMessage({
type:’’ ,
data:’’
},’*’)
接收消息:
window.addEventListen(‘message’,() =>{} )
3.关闭菜单( closeMenu() ?)
this.map.closeMenu()
4.?清除图层(removeLayer(图层实体))
this.map.removeLayer(实体)
5.?绘制可编辑圆
data.radius = Number(data.radius) || 20
// 创建圆
this.circle = L.circle(data.latLng, data.radius);
// 开启编辑
this.circle.editing.enable();
// 将圆添加到指定图层
this.circle.addTo(this.drawDotLayer)
// 监听编辑,获取半径
this.circle.on('edit', (e) => {
this.drawDotData.radius = Math.round(e.target._mRadius)
this.filterDevice(this.drawDotData.radius, data.latLng)
});
6. 声明图层组(new L.layerGroup())
let layer = new L.layerGroup();
// 将图层添加到地图
layer.addTo(this.map)
7. 绘制点图标(L.divIcon({}))
图片图标 (new L.icon({}))
// 绘制元素图标
let icon = L.divIcon({
className: 'my-div-icon',
html: `<div class="dot-content">${this.drawDotIdx+1}</div>`,
html: `<div class="live" style="margin-left:-9px;margin-top:-25px">
<img src="` + iconImg + `">
<div class="name" style="width:100px;text-align:center;transform: translate(-38px, -5px);background: rgba(255,255,255,0.5);display:` + nameShowHidden + `">` + data.name + `</div>
</div>`
}})
// 绘制图片图标
let icon = new L.icon({
iconUrl: 'static/images/address.png',
iconSize: [35, 54],
iconAnchor: [15,35],
rotate:false,
iconUrl:'/static/images/people.png'
})
8.绘制marker图标(L.marker(坐标,{}))
移动marker图标(marker.slideTo([], {}))
悬浮marker显示提示(marker.bindTooltip(string))
marker 更新icon图标(marker.setIcon(icon))
// 创建marker图标
// latlng:[lat, lng]
let marker = L.marker(latlng, {
icon: icon, // 图标
draggable: true,
autoPan: true,
name:'',
id:'',
data:''
})
// marker 监听拖动
marker.on('dragend', (e) =>{
console.log(e.target._latlng)
// 获取纬度
let lat = e.target.getLatLng().lat
// 获取经度
let lng = e.target.getLatLng().lng
})
// marker 监听点击
marker.on('click', function(e) {})
// marker 鼠标右击菜单
marker.on('contextmenu',function(e) {})
// 移动marker
marker.slideTo([lat, lng], {
duration: 500, // 时间
})
// 悬浮marker显示提示
marker.bindTooltip(name)
9.绘制轨迹线(L.polyline(坐标),{})
// 生成线,并添加到图层
let line = L.polyline(latlngs,{
weight: 8,
}).addTo(layer)
10.绘制轨迹方向箭头,轨迹装饰(L.polylineDecorator(line,{}))
// 生成轨迹箭头,并添加到图层
let decorator = L.polylineDecorator(line,{
patterns: [{
repeat: 50,
// 箭头
symbol: L.Symbol.arrowHead({
pixelSize: 5,
headAngle: 75,
polygon: false,
pathOptions: {
stroke: true,
weight: 2,
color: '#FFFFFF'
}
})
}]
}).addTo(layer)
11.更新轨迹线(line.setLatLngs(latlngs))
line.setLatLngs(latlngs)
12.更新轨迹箭头(decorator.setPaths(line))
decorator.setPaths(line)
13.判断地图是否具有图层(this.map.hasLayer)
this.map.hasLayer(marker)
14.设置视图(this.map.setView([lat, lng], 16))
this.map.setView([lat,lng],16)
15.添加电子底图地图(L.tileLayer(url, {}))
// 创建底图
// url: "/GisMap/GaodeMap/{z}/{y}/{x}.png"
let electronics = L.tileLayer(url, {
maxZoom: maxZoom,
minZoom: minZoom,
id:'electron'
})
// 显示地图
electronics.addTo(this.map)
16.创建鹰眼地图 (new L.Control.MiniMap(electronics, {}))
let miniMap = new L.Control.MiniMap(electronics, {
toggleDisplay: true,
zoomAnimation: true, // 动画缩放
maxZoom: 10, // 最大图层
minZoom: 2, // 最小图层
// 矩形框选移动图形
aimingRectOptions:{
color:'red',
weight: 1,
fillColor: 'blue'
}
})
miniMap.addTo(this.map)
17.加载楼层底图(L.tileLayer(url, {}))
let floor = L.tileLayer(url, {
worldCopyJump: false,
noWrap: true
})
18,图层遍历循环(this.map.eachLayer(function(layer) {}))
this.map.eachLayer(function (layer) {
if (!layer._container || ('' + $(layer._container).attr('class')).replace(/\s/g, '') != 'leaflet-layer') {
layer.remove();
}
})
19.点聚合
创建点聚合实体( new PruneClusterForLeaflet())
// 创建点聚合实体
let markerCluster = new PruneClusterForLeaflet()
// 设置聚合大小
markerCluster.Cluster.Size = 1;
// 创建点聚合 marker
let marker = new PruneCluster.Marker(lat,lon,{
data:data
})
// 注册 marker
markerCluster.RegisterMarker(marker)
// 监听聚合变化
this.markerCluster.PrepareLeafletMarker = function (leafletMarker, data) {
// 点聚合设备图标重置
_this.resetMark(leafletMarker, data.data)
}
// 重绘图标
markerCluster.RedrawIcons()
// 点聚合移除
markerCluster.RemoveMarkers(marker)
// 执行视图进程
markerCluster.ProcessView()
// 点聚合实体添加到地图
markerCluster.addTo(this.map)
20.经纬度转成地图坐标(L.latLng(lat,lon))
// 经纬度坐标转换
let latlng = L.latLng(lat,lon)
21.添加到图层(layers.addLayer(marker))
layers.addLayer(marker)
22.地图设置边界(map.fitBounds([]))
let latlngs = []
// 地图设置边界
map.fitBounds(latlngs)
23.地图两点之间的距离(map.distance(latlng,latlng1))
// 计算两点之间的距离
let distance = map.distance(latlng, latlng1)
24.获取轨迹线的经纬度集合(line.getLatLngs())
let latlngs = line.getLatLngs()
25.创建动态marker( L.animatedMarker(latlngs, {}) )
let animatedMarker = L.animatedMarker(latlngs, {
// speedList: speedList,
interval: 300, // 默认为100mm
icon: icon, // 图标
// 行走回调, 更新路线
playCall: (latlng) => this.updateRealLine(latlng, this.latlngs, realRouteLine, decorator),
// 结束回调, 删除动态marker
playEnd: () => { layer.removeLayer(animatedMarker) }
}).addTo(layer)
this.trackMarkers.push(animatedMarker)
// 开始运动
animatedMarker.start();
// 停止运动
animatedMarker.stop();
// 暂停运动
animatedMarker.pause()
/**
* 回调:绘制已行走轨迹线
* @param {*} latlng 绘制坐标
* @param {*} latlngs 轨迹原始坐标
* @param {*} realRouteLine 实时轨迹线对象
* @param {*} decorator 轨迹方向箭头对象
*/
updateRealLine(latlng, latlngs, realRouteLine, decorator) {
// 更新实时轨迹线
let newLatlngs = realRouteLine.getLatLngs()
newLatlngs.push(latlng)
realRouteLine.setLatLngs(newLatlngs)
// 更新箭头指向路径
decorator.setPaths(realRouteLine)
}
26.地图放大(map.zoomIn())
map.zoomIn()
27.地图缩小(map.zoomOut())
map.zoomOut()
28.添加draw控件(L.FeatureGroup)
// 创建控件
let drawnItem = new L.FeatureGroup()
// 添加到地图
map.addLayer(drawnItem)
// 监听绘制创建完成
map.on(L.Draw.Event.CREATED, function(e) {
let layer = e.layer
drawnItems.addLayer(layer);
// 进行逻辑处理
})
// 监听绘制清除(保存)
map.on(L.Draw.Event.DELETED, function() {})
29.绘制直线( new L.Draw.Polyline(map,{}) )
let polylineHandler = new L.Draw.Polyline(map,{
showLength: true,
metric:true
})
// 禁用所有绘制
polylineHandler.disable()
rectangleHandler.disable()
circleHandler.disable()
polygonHandler.disable()
// 启用直线绘制
polylineHandler.enable()
30.绘制矩形(new L.Draw.Rectangle(map,true))
let rectangleHandler = new L.Draw.Rectangle(map, true);
// 禁用所有绘制
polylineHandler.disable()
rectangleHandler.disable()
circleHandler.disable()
polygonHandler.disable()
// 启用绘制
rectangleHandler.enable()
31.绘制多边形(new L.Draw.Polygon(map,{}))
let polygonHandler = new L.Draw.Polygon(map, {
allowIntersection: false,
showArea: true,
showLength: true
});
// 禁用所有绘制
polylineHandler.disable()
rectangleHandler.disable()
circleHandler.disable()
polygonHandler.disable()
// 启用绘制
polygonHandler.enable()
32.绘制圆形(new L.Draw.Circle(map, true))
let circleHandler = new L.Draw.Circle(this.map, true);
// 禁用所有绘制
polylineHandler.disable()
rectangleHandler.disable()
circleHandler.disable()
polygonHandler.disable()
// 启用绘制
circleHandler.enable()
33.清除绘制( new L.EditToolbar.Delete(map,{}) )
let deleteHandler = new L.EditToolbar.Delete(this.map, {
featureGroup: this.layers.drawnItems
})
// 清除绘制 启用
deleteHandler.enable()
34.绘制扇形(new L.semiCircle(latlng,{}))
/**
* 绘制扇形
* @param latlng 坐标
* @param radius 半径
* @param startAngle 开始角度
* @param endAngle 结束角度
* */
let semiCircle = L.semiCircle(latlng, {
radius: radius,
fill: true,
fillColor:'#f03',
fillOpacity: 0.5,
color: '#f03',
opacity: 0.5,
startAngle: Number(startAngle),
stopAngle: Number(endAngle)
})
semiCircle.addTo(map);
35.热力图 图层 (new HeatmapOverlay(cfg))
var cfg = {
// radius should be small ONLY if scaleRadius is true (or small radius is intended)
"radius": 26,
"maxOpacity": .8,
// scales the radius based on map zoom
"scaleRadius": false,
// if set to false the heatmap uses the global maximum for colorization
// if activated: uses the data maximum within the current map boundaries
// (there will always be a red spot with useLocalExtremas true)
"useLocalExtrema": true,
// which field name in your data represents the latitude - default "lat"
latField: 'lat',
// which field name in your data represents the longitude - default "lng"
lngField: 'lng',
// which field name in your data represents the data value - default "value"
valueField: 'count'
};
// 创建热力图
let heatmapLayer = new HeatmapOverlay(cfg);
// 将热力图添加到地图
heatmapLayer.addTo(this.map)
// 给热力图设置数据
let max = 8;
heatmapLayer.setData({
max: max,
data: data
})
// 设置边界范围
map.fitBounds(latlngs)
36.地图菜单 ( new L.menu( [],{} ))
// 创建菜单
let menu = L.menu([], {
offset: [2, 0]
})
// 监听鼠标右键
map.on('contextmenu',function(e) {
// 打开菜单
map.openMenu(menu, e.latlng, ["显示名称", '隐藏名称'], {
attach: e
});
})
menu.on('itemclick', function(e) {
let target = e.attach.target;
switch(e.text) {
case '显示名称' :
// 控制元素创建的icon显示
$('.live .name').css('display','block')
break;
case '隐藏名称' :
// 控制元素创建的icon隐藏
$('.live .name').css('display','none')
break;
}
})
37. 获取地图中心(map.getCenter())
// 获取地图中心位置
map.getCenter()
38.获取地图层级大小(map.getZoom())
// 获取地图层级大小
map.getZoom()
39.设置地图最小层级(map.setMinZoom())
map.setMinZoom(8)
40.设置地图最大层级( map.setMaxZoom() )
map.setMaxZoom(18)
41.创建dom元素(L.DomUtil.create('元素名称','className',document.createElement('div')))
let moveMarker = document.createElement("div");
moveMarker.id = "x_map_id_movedevice";
moveMarker.style.cssText = "text-align:center; position:absolute; left:0px; top:0px; z-index:1001; display:none; cursor:pointer"
let img = L.DomUtil.create("img", null, moveMarker);
img.src = imgSrc;
// img.style.width = "30px";
let textDiv = L.DomUtil.create("div", "x_map_device_name", moveMarker);
textDiv.innerHTML = text;
document.getElementById('mapContainer').appendChild(moveMarker);
文章来源:https://blog.csdn.net/weixin_46054156/article/details/135262661
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!