谷歌地图:一个经纬度是否在多边形内?

11
4个回答

19

判断点是否在多边形内的一种方法是计算从该点(沿任意方向)引出的直线与多边形边界相交的次数。如果相交次数为偶数,则该点在多边形外。

我已经将来自Point in Polygon文章的 C 代码转换为 PHP,并使用下面的多边形进行了说明。

polygon

<?php
//Point-In-Polygon Algorithm
$polySides  = 4; //how many corners the polygon has
$polyX    =  array(4,9,11,2);//horizontal coordinates of corners
$polyY    =  array(10,7,2,2);//vertical coordinates of corners
$x = 3.5;
$y = 13.5;//Outside
//$y = 3.5;//Inside

function pointInPolygon($polySides,$polyX,$polyY,$x,$y) {
  $j = $polySides-1 ;
  $oddNodes = 0;
  for ($i=0; $i<$polySides; $i++) {
    if ($polyY[$i]<$y && $polyY[$j]>=$y 
 ||  $polyY[$j]<$y && $polyY[$i]>=$y) {
    if ($polyX[$i]+($y-$polyY[$i])/($polyY[$j]-$polyY[$i])*($polyX[$j]-$polyX[$i])<$x)    {
    $oddNodes=!$oddNodes; }}
   $j=$i; }

  return $oddNodes; }


 if (pointInPolygon($polySides,$polyX,$polyY,$x,$y)){
  echo "Is in polygon!";
}
else echo "Is not in polygon";
?>

+1 非常棒的建议,我已经在生产环境中使用这段代码多年了。这是最流畅的 PHP 实现之一。 - Glenn Plas
谢谢!这对我有用。这是我尝试的第三个解决方案。 - West55

2
非常感谢David Strachan和Darel Rex Finley。我想分享我的PHP版本,它略有不同,因为它将点([lat,lng])作为数组,并将多边形作为点的数组([[lat,lng],[lat,lng],...])。
  function pointInPolygon($point, $polygon){//http://alienryderflex.com/polygon/
     $return = false;
     foreach($polygon as $k=>$p){
        if(!$k) $k_prev = count($polygon)-1;
        else $k_prev = $k-1;

        if(($p[1]< $point[1] && $polygon[$k_prev][1]>=$point[1] || $polygon[$k_prev][1]< $point[1] && $p[1]>=$point[1]) && ($p[0]<=$point[0] || $polygon[$k_prev][0]<=$point[0])){
           if($p[0]+($point[1]-$p[1])/($polygon[$k_prev][1]-$p[1])*($polygon[$k_prev][0]-$p[0])<$point[0]){
              $return = !$return;
           }
        }
     }
     return $return;
  }

1

正如您在问题中所说,这种方法与Google Maps API V3的几何库有关,因此无法从PHP处理对象,可能的解决方案是进行ajax调用服务器,请求您的纬度和经度,返回数据(进入数据库做您的事情),并在成功事件中(已加载google地图库)检查点是否包含该点。如果需要将其保存在某个点上,则可以进行另一个ajax发送当前位置请求的结果。


这个解决方案太复杂了。也许谷歌地图API不是答案。还有其他选项吗? - StackOverflowNewbie
1
嗯,我认为这个解决方案实际上相当简单,但是另一个我想到的解决方案更加复杂,因为它要求你自己计算一切。 - Jorge

0

我认为有几种方法可以做到这一点。第一种是使用此扩展或类似的东西来确定点是否在多边形内:

Google-Maps-Point-in-Polygon Extension

这里有一个射线投射算法的解释,应该能帮助你一些:

Point in polygon

扩展中的简单示例显示它非常直接:

        var coordinate = new google.maps.LatLng(40, -90);                                                                                                                                                                                                       
        var polygon = new google.maps.Polygon([], "#000000", 1, 1, "#336699", 0.3);
        var isWithinPolygon = polygon.containsLatLng(coordinate);

此解决方案已不再受支持。请改用以下链接:https://developers.google.com/maps/documentation/javascript/examples/poly-containsLocation - starshine531

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