PHP判断点是否在任意多边形内部(经纬度适用)

开发GPS定位的时候,需要判断用户是在哪一个区域范围内,这就涉及到判断点是否在一个多边形内部。理想情况是任意多边形均可(点按顺时针或逆时针排列)。使用数学上的射线法可以用很短的代码实现。

原文提供的是JavaScript代码,进行转换后的代码如下:

function isPointInPolygon($polygon,$lnglat){
$count = count($polygon);
$py = $lnglat[‘lat’];
$px = $lnglat[‘lng’];

$flag = FALSE;

for ($i = 0, $j = $count – 1; $i < $count; $j = $i, $i++) {
$sy = $polygon[$i][‘lat’];
$sx = $polygon[$i][‘lng’];
$ty = $polygon[$j][‘lat’];
$tx = $polygon[$j][‘lng’];

if ($px == $sx && $py == $sy || $px == $tx && $py == $ty)
return !$flag;

if ($sy < $py && $ty >= $py || $sy >= $py && $ty < $py) {
$x = $sx + ($py – $sy) * ($tx – $sx) / ($ty – $sy);
if ($x == $px)
return !$flag;
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
);

发表评论

电子邮件地址不会被公开。 必填项已用*标注