cesium画矩形区域并显示长宽
爱编程的小透明 2024-09-16 16:03:01 阅读 53
1.viewer.value.scene.screenSpaceCameraController.enableRotate = false; //禁止地图拖拽
2.存储矩形各点坐标 westSouthEastNorth
3.监听鼠标事件
4.计算两点的距离
5.计算两点的中点坐标
6.westSouthEastNorth坐标数组包括五组坐标(第一个和最后一个坐标相同,方向分别是左上、左下、右下、右上)
代码如下
const drawRectangleInfo = () => { -- -->
viewer.value.scene.screenSpaceCameraController.enableRotate = false; //禁止地图拖拽
/**
* 矩形四点坐标
*/
let westSouthEastNorth: any = [];
/**实体的唯一标注 */
let id: any = null;
/**地图点击对象 */
handler.value = new Cesium.ScreenSpaceEventHandler(
viewer.value.scene.canvas
);
handler.value.setInputAction((click: any) => {
/**点击位置笛卡尔坐标 */
let cartesian = viewer.value.camera.pickEllipsoid(
click.position,
viewer.value.scene.globe.ellipsoid
);
/**笛卡尔转弧度坐标 */
let cartographic = Cesium.Cartographic.fromCartesian(
cartesian,
viewer.value.scene.globe.ellipsoid,
new Cesium.Cartographic()
);
/**点击位置经度 */
let lng1: any = Cesium.Math.toDegrees(cartographic.longitude);
/**点击位置维度 */
let lat1: any = Cesium.Math.toDegrees(cartographic.latitude);
/**边框坐标 */
westSouthEastNorth = [lng1, lat1];
id = new Date().getTime();
if (westSouthEastNorth) {
handler.value.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);
}
/**面实例对象 */
rectangleId.value = viewer.value.entities.add({
name: "rectangle",
id: "rectangle",
polygon: {
hierarchy: new Cesium.CallbackProperty(function () {
return {
positions: Cesium.Cartesian3.fromDegreesArray(westSouthEastNorth),
};
}, false),
height: 0,
// 填充的颜色,withAlpha透明度
material: Cesium.Color.GREEN.withAlpha(0.0),
// 是否被提供的材质填充
fill: true,
// 是否显示
show: true,
},
polyline: {
positions: new Cesium.CallbackProperty(function () {
return Cesium.Cartesian3.fromDegreesArray(westSouthEastNorth);
}, false),
material: config.borderColor,
width: config.borderWidth,
zIndex: 1,
},
});
handler.value.setInputAction((move: any) => {
let cartesian = viewer.value.camera.pickEllipsoid(
move.endPosition,
viewer.value.scene.globe.ellipsoid
);
let cartographic = Cesium.Cartographic.fromCartesian(
cartesian,
viewer.value.scene.globe.ellipsoid,
new Cesium.Cartographic()
);
let lng: any = Cesium.Math.toDegrees(cartographic.longitude);
let lat: any = Cesium.Math.toDegrees(cartographic.latitude);
if (width.value) {
width.value.label.show = false;
}
if (height.value) {
height.value.label.show = false;
}
width.value = viewer.value.entities.add({
position: measureCenterByCartesian(
Cesium.Cartesian3.fromDegrees(lng1, lat1),
Cesium.Cartesian3.fromDegrees(lng1, lat)
),
name: "text",
label: {
show: true,
text: getTwoPointDistance([lng1, lat1], [lng1, lat]),
font: "18px sans-serif",
fillColor: Cesium.Color.GOLD,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
},
});
height.value = viewer.value.entities.add({
position: measureCenterByCartesian(
Cesium.Cartesian3.fromDegrees(lng1, lat1),
Cesium.Cartesian3.fromDegrees(lng, lat1)
),
name: "text",
label: {
show: true,
text: getTwoPointDistance([lng1, lat1], [lng, lat1]),
font: "18px sans-serif",
fillColor: Cesium.Color.GOLD,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
},
});
westSouthEastNorth = [
lng1,
lat1,
lng1,
lat,
lng,
lat,
lng,
lat1,
lng1,
lat1,
];
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}, Cesium.ScreenSpaceEventType.LEFT_DOWN);
handler.value.setInputAction(() => {
infoDetail.value.rectangle.push({ id: id, position: westSouthEastNorth });
// handler.value.destroy()
handler.value.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
viewer.value.scene.screenSpaceCameraController.enableRotate = true; //允许地图拖拽
}, Cesium.ScreenSpaceEventType.LEFT_UP);
}
/**计算出两点的中点 */
const measureCenterByCartesian = (from: any, to: any) => {
// 转换为Cartographic
let carto1 = Cesium.Ellipsoid.WGS84.cartesianToCartographic(from);
let carto2 = Cesium.Ellipsoid.WGS84.cartesianToCartographic(to);
// 计算中心点的经纬度
let lon = (carto1.longitude + carto2.longitude) / 2;
let lat = (carto1.latitude + carto2.latitude) / 2;
let center = Cesium.Cartographic.fromRadians(lon, lat);
// 将中心点的经纬度转换回Cartesian3
let centerPoint = Cesium.Ellipsoid.WGS84.cartographicToCartesian(center);
return centerPoint;
};
/**计算两点距离 */
const getTwoPointDistance = (position: any, position2: any) => {
let textDisance: any = "";
//叠加测量点
let distance = Cesium.Cartesian3.distance(
Cesium.Cartesian3.fromDegrees(position[0], position[1]),
Cesium.Cartesian3.fromDegrees(position2[0], position2[1])
);
if (distance > 10000) {
textDisance = (distance / 1000).toFixed(2) + "km";
} else {
textDisance = distance.toFixed(2) + "m";
}
return textDisance;
};
欢迎补充,一起进步。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。