2025-04-06 01:30:00 +00:00
|
|
|
|
<!--********************************************************************
|
|
|
|
|
* by jiawanlong
|
|
|
|
|
*********************************************************************-->
|
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8" />
|
|
|
|
|
<link rel="stylesheet" href="./../../libs/cesium/Cesium1.98/Widgets/widgets.css">
|
|
|
|
|
<script type="text/javascript" src="./../../libs/cesium/Cesium1.98/Cesium.js"></script>
|
|
|
|
|
<script src="./turf.min.js"></script>
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body style="margin: 0; overflow: hidden; background: #fff; width: 100%; height: 100%; position: absolute; top: 0">
|
|
|
|
|
<div id="map3" style="margin: 0 auto; width: 100%; height: 100%;float: left;"></div>
|
|
|
|
|
|
|
|
|
|
<script type="text/javascript">
|
|
|
|
|
// 三维
|
2025-05-29 02:59:44 +00:00
|
|
|
|
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIyNDMxOTA2NS1lY2Q3LTQ0YmUtOTE1Mi1iNWE2OGYwZjc0MjkiLCJpZCI6MjM1NjMwLCJpYXQiOjE3MzA3MjQzMTJ9.Xhu-9FyVEyqBKWEr0V9Sybt-elTCWHt9peL9-mNh-4E'
|
2025-04-06 01:30:00 +00:00
|
|
|
|
const viewer = new Cesium.Viewer('map3', {});
|
|
|
|
|
|
|
|
|
|
// 全局事件监听
|
|
|
|
|
var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas)
|
|
|
|
|
|
|
|
|
|
// 移入三维
|
|
|
|
|
handler.setInputAction(function (event) {
|
|
|
|
|
open3d()
|
|
|
|
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
|
|
|
|
|
|
|
|
|
|
// 关闭之前所有事件
|
|
|
|
|
function closeO() {
|
|
|
|
|
try {
|
|
|
|
|
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)
|
|
|
|
|
handler.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL)
|
|
|
|
|
} catch (error) { }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 进入3d,监听3d事件
|
|
|
|
|
function open3d() {
|
|
|
|
|
closeO()
|
|
|
|
|
handler.setInputAction(function (event) {
|
|
|
|
|
liandong3D2D()
|
|
|
|
|
}, Cesium.ScreenSpaceEventType.WHEEL)
|
|
|
|
|
handler.setInputAction(function (event) {
|
|
|
|
|
liandong3D2D()
|
|
|
|
|
}, Cesium.ScreenSpaceEventType.LEFT_UP)
|
|
|
|
|
}
|
|
|
|
|
// 3d联动2d
|
|
|
|
|
function liandong3D2D() {
|
|
|
|
|
var rectangle = viewer.camera.computeViewRectangle()
|
|
|
|
|
var west = (rectangle.west / Math.PI) * 180
|
|
|
|
|
var north = (rectangle.north / Math.PI) * 180
|
|
|
|
|
var east = (rectangle.east / Math.PI) * 180
|
|
|
|
|
var south = (rectangle.south / Math.PI) * 180
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function calculateCellSide(bbox, N, units = 'kilometers') {
|
|
|
|
|
const bboxPolygon = turf.bboxPolygon(bbox);
|
|
|
|
|
const areaMeters = turf.area(bboxPolygon);
|
|
|
|
|
|
|
|
|
|
let area;
|
|
|
|
|
switch (units) {
|
|
|
|
|
case 'kilometers': area = areaMeters / 1e6; break;
|
|
|
|
|
case 'miles': area = areaMeters / 2589988.1103; break;
|
|
|
|
|
default: area = areaMeters;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const hexArea = area / N;
|
|
|
|
|
return Math.sqrt((2 * hexArea) / (3 * Math.sqrt(3)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var bbox = [west , north , east , south ];
|
|
|
|
|
|
|
|
|
|
const desiredCount = 100; // 目标生成100个六边形
|
|
|
|
|
const units = 'kilometers';
|
|
|
|
|
|
|
|
|
|
const cellSide = calculateCellSide(bbox, desiredCount, units);
|
|
|
|
|
|
|
|
|
|
const hexGrid = turf.hexGrid(bbox, cellSide, { units });
|
|
|
|
|
|
|
|
|
|
viewer.scene.primitives.removeAll();
|
|
|
|
|
const geometryInstances = [];
|
|
|
|
|
|
|
|
|
|
hexGrid.features.forEach((hex) => {
|
|
|
|
|
let boundary = hex.geometry.coordinates
|
|
|
|
|
const positions = boundary.map(([lat, lon]) =>
|
|
|
|
|
Cesium.Cartesian3.fromDegrees(lon, lat)
|
|
|
|
|
);
|
|
|
|
|
const height = 1;
|
|
|
|
|
const polygon = new Cesium.PolygonOutlineGeometry({
|
|
|
|
|
polygonHierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray(boundary.flat().flat())),
|
|
|
|
|
extrudedHeight: height,
|
|
|
|
|
height: 0,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const instance = new Cesium.GeometryInstance({
|
|
|
|
|
geometry: polygon,
|
|
|
|
|
attributes: {
|
|
|
|
|
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
|
|
|
|
|
Cesium.Color.fromBytes(220, 20, 60, 200)
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
geometryInstances.push(instance);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const primitive = new Cesium.Primitive({
|
|
|
|
|
geometryInstances: geometryInstances,
|
|
|
|
|
appearance: new Cesium.PerInstanceColorAppearance({
|
|
|
|
|
flat: true,
|
|
|
|
|
translucent: true,
|
|
|
|
|
renderState: {
|
|
|
|
|
// 禁用抗锯齿
|
|
|
|
|
lineSmooth: false,
|
|
|
|
|
// 直接设置线条宽度
|
|
|
|
|
lineWidth: 10,
|
|
|
|
|
},
|
|
|
|
|
}),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
viewer.scene.primitives.add(primitive);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
</body>
|
|
|
|
|
|
|
|
|
|
</html>
|