确定纬度/经度是否在地球表面的多边形内

时间:2011-11-18 19:11:57

标签: latitude-longitude point-in-polygon

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

这变得越来越困难的是圆圈(现在切换回3D),可能从一极到另一极覆盖地球的一半。 lat / lon的翻译看似正弦波。多边形测试中的2D点不再适用于此情况。是否存在可以解决此问题的算法?

==================对以下评论的澄清:=================== 多边形以度为单位定义为(lon,lat)对,即(60,90),(60,110),( - 30,110),( - 30,90)。

我确实有实现光线投射算法的代码,这是有效的。但是,地球表面上的某些多边形不会在2D空间中转换为闭合多边形。

3 个答案:

答案 0 :(得分:1)

如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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

containsLocation(point:LatLng, polygon:Polygon)