You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cesium中判断点是否在多边形内的方法(含180°经线与极点)

在Cesium中判断点是否位于多边形内部的方法及特殊场景适配

一、核心判断方法

在Cesium中,可通过内置的Cesium.IntersectionTests.pointInPolygon方法直接判断点是否在多边形内部,步骤如下:

  1. 将待判断的点P从经纬度转换为Cesium的Cartesian3坐标;
  2. 获取目标多边形的PolygonHierarchy层级数据(包含顶点坐标集合);
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:13:11