【问题标题】:Determine if a latitude/longitude is within a polygon on Earth's surface确定纬度/经度是否在地球表面的多边形内
【发布时间】:2012-01-01 12:50:18
【问题描述】:

我试图弄清楚纬度/经度点是否包含在由代表地球上的点的顶点定义的多边形内(也包括纬度/经度,按顺时针顺序排列)。这对于可以映射到 2D 纬度/经度空间的多边形来说是微不足道的。

这变得越来越困难的是圆圈(现在切换回 3D),它可能会从一个极点到另一个极点,覆盖半个地球。转换为纬度/经度看起来像一个正弦波。多边形测试中的 2D 点不再适用于这种情况。是否存在解决此问题的算法?

================== 以下关于 cmets 的说明:=================== 多边形定义为以度为单位的 (lon, lat) 对,即 (60, 90), (60, 110), (-30, 110), (-30, 90)。

我确实有实现光线投射算法的代码,并且有效。然而,地球表面的某些多边形并不能转化为二维空间中的封闭多边形。

【问题讨论】:

  • 您能否举例说明您如何定义多边形、点和预期结果?另外,您有任何尝试过的代码吗? (如果可以,请编辑您的问题以包含此信息)
  • 您对顺时针标记点的定义定义了多边形的哪一侧在里面。
  • 这个问题与语言无关——删除了python标签。

标签: latitude-longitude point-in-polygon


【解决方案1】:

如果您在球体表面绘制圆的中心点和半径,请计算中心点和目标点之间的Great-circle distance。如果小于圆的半径,则目标点在圆内。

这不会推广到在您的球体上绘制的任意多边形,但您只询问了圆,所以我不知道这对您是否重要。

【讨论】:

  • 感谢您的回复。是否有任何类型的多边形的通用解决方案?我不一定会被多边形的圆圈所束缚..
【解决方案2】:

如 denniston.t 所述,如果你只对圆感兴趣,并且你有一个半径,你可以简单地检查中心点和点之间的Great Circle Distance 是否小于半径。要查找大圆距离,您通常使用Haversine Formula。以下是我在python中的实现:

from math import radians, sin, cos, asin, sqrt

def haversine(point1, point2):
    """Gives the distance between two points on earth.

    The haversine formula, given two sets of latitude and longitude,
    returns the distance along the surface of the earth in miles,
    ignoring potential changes in elevation. The points must be in
    decimal degrees.
    """
    earth_radius_miles = 3956
    lat1, lon1 = (radians(coord) for coord in point1)
    lat2, lon2 = (radians(coord) for coord in point2)
    dlat, dlon = (lat2 - lat1, lon2 - lon1)
    a = sin(dlat/2.0)**2 + cos(lat1) * cos(lat2) * sin(dlon/2.0)**2
    great_circle_distance = 2 * asin(min(1,sqrt(a)))
    d = earth_radius_miles * great_circle_distance
    return d

【讨论】:

  • 多边形不一定是圆形。我以此为例来简化问题。
【解决方案3】:
containsLocation(point:LatLng, polygon:Polygon)

【讨论】:

    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 2018-09-24
    • 2012-10-30
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    相关资源
    最近更新 更多