10

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

4

4 回答 4

18

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

我已经在 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";
?>
于 2012-11-10T19:46:18.553 回答
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;
  }
于 2015-12-11T11:28:44.173 回答
1

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

于 2012-11-10T03:09:17.130 回答
0

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

Google-Maps-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);
于 2012-11-10T13:18:21.033 回答