给定一对lat / lng值,如何确定该对是否在多边形内?我需要在PHP中执行此操作。我发现Google Maps API采用containsLocation
方法:https://developers.google.com/maps/documentation/javascript/reference。有没有办法从PHP中利用它?
答案 0 :(得分:16)
查找点是否在多边形中的一种方法是计算从该点(在任何方向上)绘制的线与多边形边界相交的次数。如果它们相交偶数次,则该点在外面。
我已经在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 :(得分:2)
我想分享我的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;
}
答案 2 :(得分:1)
正如您在问题中所说,此方法与Google Maps API V3的几何库有关,因此无法通过PHP处理这些对象,这个解决方案可以使得ajax调用服务器,询问对于你的纬度和长度,返回数据(转到数据库做你的东西),并在事件成功(谷歌地图库已加载)检查点是否包含该点。也许如果你需要在某些时候保存它,请另外ajax发送当前位置的结果。
答案 3 :(得分:0)
我认为有一种方法可以做到这一点。第一种方法是使用此扩展或类似的东西来确定该点是否在多边形内:
Google-Maps-Point-in-Polygon Extension
以下是关于Ray Cast算法的解释,它也可以帮助你:
扩展程序中的简单示例显示它非常简单:
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);