显示原理
获取/创建矢量要素→设置矢量要素显示风格→加载矢量要素对象到图层
添加方法
- GeoJSON,可以描述点、线、面等矢量要素类型
L.geoJSON().addTo(map)——geoJSON Extends FeatureGroup
https://leafletjs.com/reference-1.6.0.html#geojson
点对象
- Marker
L.marker([lat, lng]).addTo(map)
通过设置Icon的属性信息,规定点对象的风格样式,例如图片来源、大小等
var myIcon = L.icon({
// 点图标图片来源
iconUrl: 'my-icon.png',
// 图标的大小
iconSize: [38, 95],
})
L.marker([lat, lng], {icon: myIcon}).addTo(map)
https://leafletjs.com/reference-1.6.0.html#marker
本地代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="dist/leaflet/include-leaflet.js"></script>
</head>
<body>
<div id="map" style="position: absolute; top: 0; left: 0;width: 100%;height: 100%;"></div>
<script type="text/javascript">
var map
var url = "http://localhost:8090/iserver/services/map-world/rest/maps/World"
map = L.map("map", {
crs: L.CRS.EPSG4326,
center: [0, 0],
maxZoom: 18,
zoom: 1
})
L.supermap.tiledMapLayer(url).addTo(map)
L.marker([50.5, 30.5]).addTo(map)
</script>
</body>
</html>
本地代码效果
线对象
- 现对象的显示效果,即Polyline在地图上的呈现
依据线的折点经纬度位置坐标信息进行创建,并将其叠加到map中
显示风格是通过设置Polyline的参数,例如color、weight、opacity等
// 根据线的端点经纬度坐标创建线
var latlngs = [
[25, 102],
[40, 116]
]
// 设置线条的颜色,将线叠加到map上面
var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map)
https://leafletjs.com/reference-1.6.0.html#polyline
本地代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="dist/leaflet/include-leaflet.js"></script>
</head>
<body>
<div id="map" style="position: absolute; top: 0; left: 0;width: 100%;height: 100%;"></div>
<script type="text/javascript">
var map
var url = "http://localhost:8090/iserver/services/map-world/rest/maps/World"
map = L.map("map", {
crs: L.CRS.EPSG4326,
center: [0, 0],
maxZoom: 18,
zoom: 1
})
L.supermap.tiledMapLayer(url).addTo(map)
var latlngs = [
[45.51, -122.68],
[37.77, -122.43],
[34.04, -118.2]
]
var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map)
</script>
</body>
</html>
本地效果
面对象
- 面对象的显示效果,即Polygon在地图上的呈现
依据面的边折点经纬度位置坐标系进行创建,并将其叠加到map中
面对象的风格通过设置path的属性进行修改,例如color、opacity、fill、fillColor等
// 根据面的边折点经纬度坐标创建
var polygon = L.polygon([[0, 20], [-30, 20], [-10, 50], [0, 20]], {color: 'red'})
// 将面对象叠加到map上面
polygon.addTo(map)
https://leafletjs.com/reference-1.6.0.html#polygon
本地代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="dist/leaflet/include-leaflet.js"></script>
</head>
<body>
<div id="map" style="position: absolute; top: 0; left: 0;width: 100%;height: 100%;"></div>
<script type="text/javascript">
var map
var url = "http://localhost:8090/iserver/services/map-world/rest/maps/World"
map = L.map("map", {
crs: L.CRS.EPSG4326,
center: [0, 0],
maxZoom: 18,
zoom: 1
})
L.supermap.tiledMapLayer(url).addTo(map)
var latlngs = [
[37, -109.05],
[41, -109.03],
[41, -102.05],
[37, -102.04]
]
var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map)
</script>
</body>
</html>
本地效果
属性信息显示
-
气泡窗口主要用于显示数据信息
-
气泡窗口主要接口
实例化L.popup
添加气泡popup.openOn(map)
****注意添加气泡是openOn不再是addTo -
向需要弹窗的对象添加绑定
添加弹窗*.bindPopup(DOM元素字符串)
展示弹窗openPopup()
// 绑定气泡显示属性内容
L.geoJSON.bindPopup("popupContent").openPopup()
https://iclient.supermap.io/examples/leaflet/editor.html#01_measure_distance
本地代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="dist/leaflet/include-leaflet.js"></script>
</head>
<body>
<div id="map" style="position: absolute; top: 0; left: 0;width: 100%;height: 100%;"></div>
<script type="text/javascript">
var map
var resultLayer
var url = "http://localhost:8090/iserver/services/map-world/rest/maps/World"
map = L.map("map", {
preferCanvas: true,
crs: L.CRS.EPSG4326,
center: [34, 108],
maxZoom: 18,
zoom: 3
})
L.supermap.tiledMapLayer(url).addTo(map)
resultLayer = L.featureGroup().addTo(map)
measureDistance()
function measureDistance () {
var polyLine = L.polyline([
[25, 102],
[40, 116]
],{
color: 'red',
})
var marker1 = L.marker([25, 102])
var marker2 = L.marker([40, 116])
resultLayer.addLayer(polyLine)
resultLayer.addLayer(marker1)
resultLayer.addLayer(marker2)
var distanceMeasureParam = new SuperMap.MeasureParameters(polyLine)
L.supermap
.measureService(url)
.measureDistance(distanceMeasureParam, function (serviceResult) {
var content = '距离' + ":" + serviceResult.result.distance + '米'
marker1.bindPopup(content).openPopup(marker1.getLatLng())
})
}
</script>
</body>
</html>
本地效果
交互式绘制对象
- Leaflet的Draw插件
include=“leaflet.draw”
<script include="leaflet.draw" src="dist/leaflet/include-leaflet.js"></script>
Handler:如L.Draw.Polygon(map)
空间启用:handler.enable()
添加监听:map.on(L.Draw.Event.CREATED, function (e) {})
var editableLayers = new L.FeatureGroup() // 创建矢量图层
editableLayers.addTo(map) // 添加到当前地图
var handler = new L.Draw.Polygon(map)
handler.enable() // 启动控件
map.on(L.Draw.Event.CREATED, function (e) { // 添加监听事件
editableLayers.addLayer(e.layer)
})
坐标转换
- Leaflet开发,叠加点线面对象仅支持经纬度
- Leaflet开发,可视化展示仅支持经纬度
非经纬度数据需要用到坐标转换L.Util.transform
实例
- 绘制多边形,显示查询对象
- 数据:China(EPSG:3857)
- 查询对象:各个省份的飞机场的位置
- 主要接口:
L.Draw.Polygon
map.on(L.Draw.Event.CREATED, function (e) {})
L.supermap.queryService(url).queryByGeometry
实现代码
- 创建客户端矢量图层
var editableLayers = new L.featureGroup()
editableLayers.addTo(map)
- 启用控件,开启监听事件
var handler = new L.Draw.Polygon(map) // 实例化绘制的控件Polygon
handler.enable()
map.on(L.Draw.Event.CREATED, function (e) {
editableLayers.addLayer(e.layer)
})
- 绘制结果进行坐标转换,几何查询
// 坐标转换
var geo = L.Util.transform(e.layer, L.CRS.EPSG4326, L.CRS.EPSG3857)
// 几何查询
var param = new SuperMap.QueryByGeometryParameters({
queryParams: {name: "Airport_pt@China.1"},
geometry: geo
})
L.supermap.queryService(url)
.queryByGeometry(param, function (serviceResult) {})
- 再次坐标转换,与leaflet叠加显示
var result = serviceResult.result
// 坐标转换,与leaflet叠加
var features = L.Util.transform(result.recordsets[0].features, L.CRS.EPSG3857, L.CRS.EPSG4326)
resultLayer = L.geoJSON(features).addTo(map)
本机代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script include="leaflet.draw" src="dist/leaflet/include-leaflet.js"></script>
</head>
<body style="position: absolute;top: 0;left: 0;width: 100%;height: 100%;">
<input type="button" name="" id="" value="geomery" onclick="geoQuery()" />
<div id="map" style="width: 100%;height: 100%;"></div>
<script type="text/javascript">
// 获取地图,添加到窗口
var map
var resultLayer
var url = "http://localhost:8090/iserver/services/map-china400/rest/maps/China"
map = L.map('map', {
crs: L.CRS.EPSG3857,
center: [40, 118],
maxZoom: 18,
zoom: 2
})
L.supermap.tiledMapLayer(url).addTo(map)
// 创建矢量图层
var editableLayers = new L.FeatureGroup()
editableLayers.addTo(map)
function geoQuery() {
// 清空矢量图层
editableLayers.clearLayers()
// 创建绘制控件并启用
var handler = new L.Draw.Polygon(map);
handler.enable();
// 开启监听事件
map.on(L.Draw.Event.CREATED, function (e) {
editableLayers.addLayer(e.layer)
// 坐标转换,与服务器端坐标系一致
var geo = L.Util.transform(e.layer, L.CRS.EPSG4326, L.CRS.EPSG3857)
// 集合查询
var param = new SuperMap.QueryByGeometryParameters({
queryParams: {name: 'Airport_pt@China.1'},
geometry: geo
})
L.supermap
.queryService(url)
.queryByGeometry(param, function (serviceResult) {
var result = serviceResult.result
// 再次进行坐标转换,转换成4325坐标系,与leaflet叠加
var features = L.Util.transform(result.recordsets[0].features, L.CRS.EPSG3857, L.CRS.EPSG4326)
resultLayer = L.geoJSON(features).addTo(map)
})
})
}
</script>
</body>
</html>
- 交互式绘制操作效果