Cesium中判断点是否在多边形内的方法(含180°经线与极点)
在Cesium中判断点是否位于多边形内部的方法及特殊场景适配
一、核心判断方法
在Cesium中,可通过内置的Cesium.IntersectionTests.pointInPolygon方法直接判断点是否在多边形内部,步骤如下:
- 将待判断的点P从经纬度转换为Cesium的
Cartesian3坐标; - 获取目标多边形的
PolygonHierarchy层级数据(包含顶点坐标集合); - 调用
pointInPolygon方法传入点和多边形层级,得到布尔结果(true表示在内部,false表示在外部)。
针对你提供的代码示例,添加判断逻辑的完整代码如下:
const viewer = new Cesium.Viewer("cesiumContainer"); const coordinates = [ [45, 40], [135, 40], [-135, 40], [-45, 40], [45, 40] ]; const positions = coordinates.map(coord => Cesium.Cartesian3.fromDegrees(coord[0], coord[1]) ); const result1 = viewer.entities.add({ polygon: { hierarchy: new Cesium.PolygonHierarchy(positions), material: Cesium.Color.RED.withAlpha(0.5), } }); // 示例:判断点P(0°E, 40°N)是否在多边形内 const pointP = Cesium.Cartesian3.fromDegrees(0, 40); // 获取当前时间下的多边形层级(动态多边形需实时获取,静态多边形可直接用初始化的hierarchy) const polygonHierarchy = result1.polygon.hierarchy.getValue(Cesium.JulianDate.now()); // 执行判断 const isInside = Cesium.IntersectionTests.pointInPolygon(pointP, polygonHierarchy.positions); console.log("点P是否在多边形内:", isInside);
二、特殊场景的适配性
1. 跨越180°经线的多边形
该方法完全适用。180°经线只是经纬度坐标系的人为划分,Cesium内部基于三维笛卡尔坐标系处理空间位置,多边形顶点的经纬度(如135°E和-135°W)会被转换为连续的空间坐标,生成的多边形是正确跨经线的形状,pointInPolygon方法会基于空间拓扑关系判断,不受经纬度数值跳变影响。
2. 包含极点的多边形
该方法同样适用。极点经纬度(如90°N)转换为Cartesian3坐标后,是三维空间中的一个顶点,只要多边形顶点正确包围极点,pointInPolygon会基于空间点与多边形的包含关系给出正确结果,无需额外处理。
内容的提问来源于stack exchange,提问作者Keei
相关产品推荐
相关产品推荐

