判断某个经纬度是否在指定多边形内
2017-04-19 阅读数:318

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

<?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;
}

使用示例

<?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,给定经纬度在多边形中。需要说明一下,在使用中,请保证多边形经纬度参数是由多边形各点的经纬度数组按照顺序组成的二维数组,顺序可以是顺时针也可以是逆时针。

前方10米有沙发可抢!
大人,请先右上角登个录 ↑
Copyright@2017-2020 www.dongguagua.com All Right Reserived 京ICP备17025269号