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

3
我正在尝试确定一个由表示地球上点(也是纬度/经度)的顶点定义的多边形中是否包含一个纬度/经度点。对于可以映射到2D纬度/经度空间的多边形,这很简单。但是,当涉及到从极地到极地覆盖半个地球的圆时,情况变得越来越困难(现在切换回3D)。将其转换为纬度/经度看起来像正弦波。2D点在多边形测试不再适用于此情况。是否存在解决此问题的算法?
==================以下是对下面评论的澄清:=================== 该多边形以度数表示为(lon, lat)对,例如(60, 90), (60, 110), (-30, 110), (-30, 90)。
我有实现射线投射算法的代码,并且它有效。然而,地球表面上的某些多边形不能在2D空间中转化为封闭的多边形。

你能举个例子来说明如何定义多边形、点和预期结果吗?另外,你有尝试过的代码吗?(如果可以,请编辑你的问题并包含这些信息) - Wilduck
你对顺时针标记点的定义决定了多边形内部的哪一侧。 - Zak
这个问题与编程语言无关 -- 已删除Python标签。 - John Machin
3个回答

1
根据denniston.t所述,如果您只对圆感兴趣,并且您有一个半径,您可以简单地检查中心点和该点之间的大圆距离是否小于半径。要找到大圆距离,通常使用Haversine公式。以下是我的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

多边形不一定是圆形。我只是用圆作为例子来简化问题。 - BigBrownBear00

0

如果您已经在球面上画出了圆的中心点和半径,请计算中心点和目标点之间的大圆距离。 如果它小于圆的半径,则目标点位于圆内。

这不能推广到在球面上任意绘制的多边形,但是您只询问了圆,因此我不知道它对您是否重要。


谢谢回复。是否有适用于任何类型多边形的通用解决方案?我不一定会将多边形限制在圆形上。 - BigBrownBear00

-1
containsLocation(point:LatLng, polygon:Polygon)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接