PHP判断点是否在一个任意多边形内部

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


发表评论

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