本文的使用场景通常出现在地理位置范围的判断,如一个外卖商户在地图上使用多边形的方式勾勒出可达的配送范围,可以根据用户的定位地址判断是否在指定配送范围内。以下给出范围判断的关键算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
/**
 * 判断某个经纬度是否在多边形范围内
 * @param type $polygon
 * @param type $lnglat
 * @return boolean
 */
function isPointInPolygon($polygon$lnglat) {
    $count count($polygon);
    $px $lnglat['lat'];
    $py $lnglat['lng'];
    $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;
}

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
//多边形经纬度
$polygon array(
    0 => array(
            'lng' => 116.397694,
            'lat' => 40.086175
        ),
    1 => array(
            'lng' => 116.585116,
            'lat' => 40.081758
        ),
    2 => array(
            'lng' => 116.548322,
            'lat' => 39.957102
        ),
    3 => array(
            'lng' => 116.232118,
            'lat' => 39.971259
        )
);
//待判断经纬度
$point array(
    'lng' => '116.4322954697',
    'lat' => '40.039914340349'
);
$result = isPointInPolygon($polygon$point);

示例返回结果true,给定经纬度在多边形中。需要说明一下,在使用中,请保证多边形经纬度参数是由多边形各点的经纬度数组按照顺序组成的二维数组,顺序可以是顺时针也可以是逆时针。

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!