【问题标题】:Google Map: is a lat/lng within a polygon?谷歌地图:多边形内的纬度/经度?
【发布时间】:2012-10-30 09:45:49
【问题描述】:

给定一对 lat/lng 值,我如何确定这对值是否在一个多边形内?我需要在 PHP 中执行此操作。我看到 Google Maps API 有一个 containsLocation 方法:https://developers.google.com/maps/documentation/javascript/reference。有没有办法从 PHP 中利用它?

【问题讨论】:

    标签: php google-maps google-maps-api-3


    【解决方案1】:

    确定一个点是否在多边形中的一种方法是计算从该点(在任何方向)绘制的线与多边形边界相交的次数。如果它们相交偶数次,则该点在外部。

    我已经在php中实现了这篇Point in Polygon文章中的C代码,并用下面的多边形来说明。

    <?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 实现之一。
    • 谢谢!这对我有用。我尝试的第三个解决方案。
    【解决方案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;
      }
    

    【讨论】:

      【解决方案3】:

      正如您在问题中所说,此方法与 Google Maps API V3 的几何库有关,因此无法从 PHP 处理对象,可行的解决方案是向服务器调用 ajax,询问对于您的经纬度,返回数据(转到数据库做您的事情),如果成功(已加载谷歌地图库)检查点是否包含该点。也许如果你需要在某个时候保存它,让另一个 ajax 发送当前位置的结果。

      【讨论】:

      • 解决方案太复杂了。也许 Google Maps API 不是答案。还有其他选择吗?
      • 嗯,我认为这个解决方案实际上很简单,但是我想到的另一个解决方案更加复杂,因为要求你应该自己计算一切
      【解决方案4】:

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

      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);
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多