开发GPS定位的时候,需要判断用户是在哪一个区域范围内,这就涉及到判断点是否在一个多边形内部。理想情况是任意多边形均可(点按顺时针或逆时针排列)。使用数学上的射线法可以用很短的代码实现。
具体算法思路参见:判断一个点是否在多边形内部 [2] 射线法实现
原文提供的是JavaScript代码,我在开发时使用的是PHP,进行转换后的代码如下:
function isPointInPolygon($polygon,$lnglat){ $count = count($polygon); $px = $lnglat['lng']; $py = $lnglat['lat']; $flag = FALSE; for ($i = 0, $j = $count - 1; $i < $count; $j = $i, $i++) { $sy = $polygon[$i]['lng']; $sx = $polygon[$i]['lat']; $ty = $polygon[$j]['lng']; $tx = $polygon[$j]['lat']; if ($px == $sx && $py == $sy || $px == $tx && $py == $ty) return TRUE; if ($sy < $py && $ty >= $py || $sy >= $py && $ty < $py) { $x = $sx + ($py - $sy) * ($tx - $sx) / ($ty - $sy); if ($x == $px) return TRUE; if ($x > $px) $flag = !$flag; } } return $flag; }
其中传入的参数$polygon为一群点的数组,$lnglat为传入的点,此处用经纬度,例如:
$polygon = array( array( "lat" => 31.027666666667, "lng" => 121.42277777778 ), array( "lat" => 31.016361111111, "lng" => 121.42797222222 ), array( "lat" => 31.023666666667, "lng" => 121.45088888889 ), array( "lat" => 31.035027777778, "lng" => 121.44575 ) ); $lnglat = array( "lat" => 31.037666666667, "lng" => 121.43277777778 );