二维Web应用开发之空间对象绘制及显示

显示原理

获取/创建矢量要素→设置矢量要素显示风格→加载矢量要素对象到图层
在这里插入图片描述

添加方法

在这里插入图片描述

点对象

  • 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>

  • 交互式绘制操作效果

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值