【问题标题】:Point in Polygon algorithm giving wrong results for negative points多边形算法中的点对负点给出错误的结果
【发布时间】:2020-08-01 18:27:54
【问题描述】:

我正在尝试检查 lat,lon 是否在多边形中。 这是我的数组:

$vertices_x : 
Array
(
    [0] => -32.581189
    [1] => -38.785885
    [2] => -39.26384
    [3] => -34.919383
    [4] => -32.284464
)

$vertices_y:
Array
(
    [0] => 170.643905
    [1] => 170.424179
    [2] => -178.15004
    [3] => -176.524063
    [4] => -178.325821
)

$longitude_x : 173.5385
$latitude_y : -34.472
$points_polygon = count($vertices_x) - 1;

我正在使用以下功能进行检查:

 function is_in_polygon($points_polygon, $vertices_x, $vertices_y, $longitude_x, $latitude_y) {
        $i = $j = $c = 0;
        for ($i = 0, $j = $points_polygon; $i < $points_polygon; $j = $i++) {
            if ((($vertices_y[$i] > $latitude_y != ($vertices_y[$j] > $latitude_y)) &&
                    ($longitude_x < ($vertices_x[$j] - $vertices_x[$i]) * ($latitude_y - $vertices_y[$i]) / ($vertices_y[$j] - $vertices_y[$i]) + $vertices_x[$i])))
                $c = !$c;
        }
        return $c;
    }

这个函数总是给我 0(不在多边形中),但如果你检查,那么我的点 $longitude_x : 173.5385 , $latitude_y : -34.472 就在那个多边形区域中。

我认为函数中的上述算法仅适用于正值。

【问题讨论】:

  • 如您所见here 该算法存在负值问题。该线程上提供了替代方案和解决方案
  • 那个帖子也没有用

标签: php polygon point-in-polygon


【解决方案1】:

我认为您的观点 (173.5385,-34.472) 不在多边形中。

您的 x 值远大于最大的 x 顶点。如果你绘制它,你可以看到这一点。您可以从橙色点看到,即使您只是混淆了纬度/经度,它仍然不在多边形中。

编辑:

在第一次检查新多边形和点时,看起来这个多边形更有可能包含在多边形中(x_min

-36.236432, 176.467563
-37.936530, 172.688266
-39.801068, 177.895786
-35.345287,-177.446011
-34.625208,-177.907437 

点:

(-37.0278,176.6158)

但是,再次绘制此图显示该点位于多边形之外:

...和放大...


我在 python 中使用matplotlib 绘制了这些,我建议您在调试此类事情时做类似的事情。如果你想继续使用 php、html 等,你可以使用 svg polygonshtml canvas 代替。

【讨论】:

  • 那么这个多边形呢:-36.236432,176.467563|-37.93653,172.688266|-39.801068,177.895786|-35.345287,-177.446011|-34.625208,-177.907437 和点是-37.0278,176.6158
  • 感谢您的回答,但如果您查看谷歌地图,那么它会在新的多边形中显示这一点。我只从谷歌地图中获取了这个多边形。
  • 啊,我们实际上是在 3D 意义上谈论纬度/经度......我以为它们只是你的变量名......这是一个完全不同的球类游戏。这篇文章有帮助吗:gis.stackexchange.com/a/46720?
猜你喜欢
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2011-12-19
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多