我已经模拟了这个算法http://forcefront.github.io/point-in-polygon/point-in-polygon.html。但我认为纬度和经度是球面坐标。该算法适用于Map多边形中的点的判定吗?
vh0rcniy1#
一个通用的点在多边形中的实现不会考虑这样一个事实,即你可以从一个值,如179.999度到-180度,而且我们还没有得到足够的信息,对这个问题的手。(例如,在我的例子中,它被放置在[-180,180]),并且多边形不接触Map边界,那么应该没有问题。当你看像这样的算法时,x和y坐标系是任意的;你可以将它们应用于y和z,x和t,等等(尽管x和t的情况不一定有任何我能很快想到的含义)。如果我的描述不够清楚:如果我给你一个围绕北极的多边形,那么这个多边形是否包含北极,或者它是否包含除北极以外的所有东西,这将是不明确的;还没有明确传达给我。同样,如果您查看球体纬度/经度投影,多边形与纬度或经度= 180相交,多边形中的通用点无法处理该问题。
拿我的世界照片来让事情更清楚。我不知道你会如何定义一个多边形是左边的绿色区域与两个半圆之间的区域(穿过我们和中国)。在我看来,你可以通过将两个圆拆分成两个不同的多边形并分别测试来解决这些问题。你可以将上面的半圆原样表示出来,或者通过一个多边形的顶点和整个Map的四个角来表示它的否定。或者,您可以在每次测试多边形时移动坐标系(使其不缠绕,并且其所有点都被规格化),但这将无法解释多次跨越地球仪的多边形(规格化将破坏多边形)。
yzxexxkh2#
大多数情况下,当你只有-179和180度之间的Angular ,它应该工作。如果你的Angular 更小或更大,那么你需要转换它。你可以使用转换到世界坐标的每个顶点,并将其投影回-179,180度。这里是如何计算一个边界框,例如从纽约在美国。在中国北京:Need to calculate latitude longitude from postal code database when location has multiple codes。下面是如何规范化Angular Easy way to keeping angles between -179 and 180 degrees。您也可以使用带有wrap函数的leaflet JavaScript库。
w8biq8rn3#
它在所有情况下都有效,除了1)重叠基准面界限(经度从180跳到-180的界限)或2)与极点重叠。因此,对于99.99%的应用程序,只需在地理数据导入时检查这两个条件,然后使用链接算法。提供不满足这些条件的多边形将被忽略的信息,并且数据提供者必须在此之前将其拆分。
yvt65v4c4#
如果你有一个Map投影库,并且多边形的点非常接近,你可以使用一个相对简单的系统(为了最小化多边形的边投影所引起的误差,假设是大圆,而不是大圆)。1.使用Azimuthal Equidistant投影法投影多边形和点。使用北极作为投影中心。如果点是南极,则使用南极作为投影中心。或者,始终使用点本身作为投影中心。1.使用标准的多边形中点例程确定投影点是否在投影多边形中。1.就是这样!此方法可以正确处理经度在180度和-180度之间的不连续性,以及多边形包含一个或两个极点的情况。如果你没有Map投影库,当中心是一个极点时,投影公式(使用地球形状的球面近似)非常简单,并在提到的维基百科文章中解释。
4条答案
按热度按时间vh0rcniy1#
一个通用的点在多边形中的实现不会考虑这样一个事实,即你可以从一个值,如179.999度到-180度,而且我们还没有得到足够的信息,对这个问题的手。(例如,在我的例子中,它被放置在[-180,180]),并且多边形不接触Map边界,那么应该没有问题。
当你看像这样的算法时,x和y坐标系是任意的;你可以将它们应用于y和z,x和t,等等(尽管x和t的情况不一定有任何我能很快想到的含义)。
如果我的描述不够清楚:如果我给你一个围绕北极的多边形,那么这个多边形是否包含北极,或者它是否包含除北极以外的所有东西,这将是不明确的;还没有明确传达给我。
同样,如果您查看球体纬度/经度投影,多边形与纬度或经度= 180相交,多边形中的通用点无法处理该问题。
拿我的世界照片来让事情更清楚。我不知道你会如何定义一个多边形是左边的绿色区域与两个半圆之间的区域(穿过我们和中国)。
在我看来,你可以通过将两个圆拆分成两个不同的多边形并分别测试来解决这些问题。你可以将上面的半圆原样表示出来,或者通过一个多边形的顶点和整个Map的四个角来表示它的否定。
或者,您可以在每次测试多边形时移动坐标系(使其不缠绕,并且其所有点都被规格化),但这将无法解释多次跨越地球仪的多边形(规格化将破坏多边形)。
yzxexxkh2#
大多数情况下,当你只有-179和180度之间的Angular ,它应该工作。如果你的Angular 更小或更大,那么你需要转换它。你可以使用转换到世界坐标的每个顶点,并将其投影回-179,180度。这里是如何计算一个边界框,例如从纽约在美国。在中国北京:Need to calculate latitude longitude from postal code database when location has multiple codes。下面是如何规范化Angular Easy way to keeping angles between -179 and 180 degrees。您也可以使用带有wrap函数的leaflet JavaScript库。
w8biq8rn3#
它在所有情况下都有效,除了
1)重叠基准面界限(经度从180跳到-180的界限)或
2)与极点重叠。
因此,对于99.99%的应用程序,只需在地理数据导入时检查这两个条件,然后使用链接算法。
提供不满足这些条件的多边形将被忽略的信息,并且数据提供者必须在此之前将其拆分。
yvt65v4c4#
如果你有一个Map投影库,并且多边形的点非常接近,你可以使用一个相对简单的系统(为了最小化多边形的边投影所引起的误差,假设是大圆,而不是大圆)。
1.使用Azimuthal Equidistant投影法投影多边形和点。使用北极作为投影中心。如果点是南极,则使用南极作为投影中心。或者,始终使用点本身作为投影中心。
1.使用标准的多边形中点例程确定投影点是否在投影多边形中。
1.就是这样!
此方法可以正确处理经度在180度和-180度之间的不连续性,以及多边形包含一个或两个极点的情况。
如果你没有Map投影库,当中心是一个极点时,投影公式(使用地球形状的球面近似)非常简单,并在提到的维基百科文章中解释。