前言
引擎下载地址:[添加链接描述](http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id=2524)
绘制缓冲区主要依赖[turfjs](https://turfjs.org/docs/#buffer)
先根据点线面的数据+turfjs计算得到缓冲区的坐标数据,再行绘制
效果
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<title></title>
<link href="https://www.supermapol.com/webgl/Build/SuperMap3D/Widgets/widgets.css" rel="stylesheet">
<link href="https://www.supermapol.com/webgl/examples/webgl/css/pretty.css" rel="stylesheet">
<link href="https://www.supermapol.com/webgl/examples/webgl/style/colorCorrection.css" rel="stylesheet">
<link href="https://www.supermapol.com/webgl/examples/webgl/css/bootstrap-select.min.css" rel="stylesheet">
<script src="https://www.supermapol.com/webgl/examples/webgl/js/jquery.min.js"></script>
<script src="https://www.supermapol.com/webgl/examples/webgl/js/bootstrap.min.js"></script>
<script src="https://www.supermapol.com/webgl/examples/webgl/js/bootstrap-select.min.js"></script>
<script src="https://www.supermapol.com/webgl/examples/webgl/js/tooltip.js"></script>
<script src="https://www.supermapol.com/webgl/examples/webgl/js/slider.js"></script>
<script src="https://www.supermapol.com/webgl/examples/webgl/js/config.js"></script>
<script type="text/javascript" src="https://www.supermapol.com/webgl/Build/SuperMap3D/SuperMap3D.js"></script>
<link rel="stylesheet" href="https://www.supermapol.com/webgl/web/libs/bootstrap/css/bootstrap.min.css">
<link href="https://www.supermapol.com/webgl/examples/webgl/style/flood.css" rel="stylesheet">
<script src="https://unpkg.com/@turf/turf/turf.min.js"></script>
<style>
.circle {
position: fixed;
left: 100px;
top: 100px;
}
.circle.active {
color: red;
}
.custom-panel {
position: fixed;
left: -1000px;
top: -1000px;
z-index: 1;
border-radius: 10px;
display: none;
color: #fff;
background-color: rgba(0, 0, 0, 0.3);
}
.tips {
position: fixed;
left: 100px;
top: 200px;
color: #fff;
}
input {
color: #000;
}
</style>
</head>
<body>
<div id="Container"></div>
<script type="text/javascript">
let viewer, handler
const initMouseOperate = {}
const customPanel = document.querySelector('.custom-panel')
const circle = document.querySelector('.circle')
function onload (SuperMap3D) {
var EngineType = getEngineType()
viewer = new SuperMap3D.Viewer('Container', {
navigation: false,
animation: true,
contextOptions: {
contextType: Number(2)
}
})
viewer.scenePromise.then(function (scene) {
init(SuperMap3D, scene, viewer)
eventHandler()
drawPointBufferHandler()
drawLineBufferHandler()
drawPolygonBufferHandler()
setTimeout(() => {
flyTo({
x: -1520391.2517026903,
y: 4801874.506984832,
z: 3926626.7742098756,
heading: 0.24220323846765268,
pitch: -1.570572787555335,
roll: 0,
duration: 2
})
}, 2000);
})
}
function init (SuperMap3D, scene, viewer) {
viewer.imageryLayers.addImageryProvider(new SuperMap3D.BingMapsImageryProvider({
url: 'https://dev.virtualearth.net',
mapStyle: SuperMap3D.BingMapsStyle.AERIAL,
key: URL_CONFIG.BING_MAP_KEY
}))
}
function eventHandler () {
handler = new SuperMap3D.ScreenSpaceEventHandler(viewer.scene.canvas)
handler.setInputAction((e) => {
const panelPosition = viewer.scene.pickPosition(e.position)
console.log(panelPosition);
}, SuperMap3D.ScreenSpaceEventType.LEFT_CLICK)
}
function drawPointBufferHandler () {
const point = viewer.entities.add({
point: {
color: new SuperMap3D.Color(255, 0, 0, 255),
pixelSize: 2
},
position: { x: -1512322.4558270602, y: 4787938.387670586, z: 3919903.201159994 },
disableDepthTestDistance: Number.POSITIVE_INFINITY
})
const latlng = turf.point(convertion1({ x: -1512322.4558270602, y: 4787938.387670586, z: 3919903.201159994 }))
const buffered = turf.buffer(latlng, 1, { units: 'kilometers' });
const result = []
buffered.geometry.coordinates[0].forEach(c => {
result.push(convertion2(c[0], c[1]))
})
viewer.entities.add({
polygon: {
hierarchy: result,
material: new SuperMap3D.StripeMaterialProperty({
evenColor: SuperMap3D.Color.BLUE.withAlpha(0.5),
oddColor: SuperMap3D.Color.BLUE.withAlpha(0.5),
offset: 0.0,
repeat: 5.0
})
}
})
}
function drawLineBufferHandler () {
const poss = [
{ x: -1522237.9046121538, y: 4786234.572753863, z: 3918152.515072906 },
{ x: -1522612.688882305, y: 4786790.672703787, z: 3917332.84709323 }
]
const line = viewer.entities.add({
polyline: {
positions: poss,
material: SuperMap3D.Color.RED,
width: 3
},
disableDepthTestDistance: Number.POSITIVE_INFINITY
})
const latlngs = []
poss.forEach((c) => {
latlngs.push(convertion1(c))
})
const polyline = turf.lineString(latlngs)
const buffered = turf.buffer(polyline, 100 / 1000, { units: 'kilometers' });
const result = []
buffered.geometry.coordinates[0].forEach(c => {
result.push(convertion2(c[0], c[1]))
})
viewer.entities.add({
polygon: {
hierarchy: result,
material: new SuperMap3D.StripeMaterialProperty({
evenColor: SuperMap3D.Color.BLUE.withAlpha(0.5),
oddColor: SuperMap3D.Color.BLUE.withAlpha(0.5),
offset: 0.0,
repeat: 5.0
})
}
})
}
function drawPolygonBufferHandler () {
const poss = [
{ x: -1512123.7645718136, y: 4793263.7218275955, z: 3913503.8097187434 },
{ x: -1513447.674567177, y: 4792746.065483553, z: 3913627.80841923 },
{ x: -1513407.4898382805, y: 4793516.069820738, z: 3912703.06333416 },
{ x: -1512816.7021667513, y: 4793679.2934803255, z: 3912731.690398276 },
{ x: -1512231.997214621, y: 4793643.150004599, z: 3913000.318535814 },
{ x: -1512123.7645718136, y: 4793263.7218275955, z: 3913503.8097187434 }
]
const polygon = viewer.entities.add({
polygon: {
hierarchy: poss,
material: new SuperMap3D.StripeMaterialProperty({
evenColor: SuperMap3D.Color.RED,
oddColor: SuperMap3D.Color.RED,
offset: 0.0,
repeat: 5.0
})
}
})
const latlngs = []
poss.forEach((c) => {
latlngs.push(convertion1(c))
})
const polygonLatlng = turf.polygon([latlngs])
const buffered = turf.buffer(polygonLatlng, 100 / 1000, { units: 'kilometers' });
const result = []
buffered.geometry.coordinates[0].forEach(c => {
result.push(convertion2(c[0], c[1]))
})
viewer.entities.add({
polygon: {
hierarchy: result,
material: new SuperMap3D.StripeMaterialProperty({
evenColor: SuperMap3D.Color.BLUE.withAlpha(0.5),
oddColor: SuperMap3D.Color.BLUE.withAlpha(0.5),
offset: 0.0,
repeat: 5.0
})
}
})
}
function convertion1 ({ x, y, z }) {
const ellipsoid = viewer.scene.globe.ellipsoid
const cartesian3 = new SuperMap3D.Cartesian3(x, y, z)
const cartographic = ellipsoid.cartesianToCartographic(cartesian3)
const lat = SuperMap3D.Math.toDegrees(cartographic.latitude)
const lon = SuperMap3D.Math.toDegrees(cartographic.longitude)
const alt = cartographic.height
return [lon, lat]
}
function convertion2 (lat, lng) {
return SuperMap3D.Cartesian3.fromDegrees(lat, lng)
}
function flyTo (viewParams) {
const { x, y, z, heading, pitch, roll, duration } = viewParams
viewer.camera.flyTo({
destination: new SuperMap3D.Cartesian3(x, y, z),
orientation: {
heading,
pitch,
roll
},
duration,
complete: () => {
console.log('complete');
},
cancel: () => {
console.log('cancel');
}
});
}
if (typeof SuperMap3D !== 'undefined') {
window.startupCalled = true
onload(SuperMap3D)
}
</script>
</body>
</html>