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

  • 2017-04-23
  • 377
  • 1

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

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

function isPointInPolygon($position,$location,$flag = FALSE){
		$i = count($position) - 1;
		foreach ($position as $key => $value) {
			if(empty(array_diff($value,$location))){
				return !$flag;
			}else{
				if($value['lat'] < $location['lat'] && $position[$i]['lat'] >= $location['lat'] || $value['lat'] >= $location['lat'] && $position[$i]['lat'] < $location['lat']){
					$x = $value['lng'] + ($location['lat'] - $value['lat']) * ($position[$i]['lng'] - $value['lng']) / ($position[$i]['lat'] - $value['lat']);
					if ($x == $location['lng']){
						return !$flag;
					}
					if ($x > $location['lng']){
						$flag = !$flag;
					}
				}
			}
			$i = $key;
		}
		return $flag;
	}

其中传入的参数$position为一群点的数组,$location为传入的点,此处用经纬度,例如:

$position =[
			["lat" => 31.027666666667,"lng" => 121.42277777778],
			["lat" => 31.016361111111,"lng" => 121.42797222222],
			["lat" => 31.023666666667,"lng" => 121.45088888889],
			["lat" => 31.035027777778,"lng" => 121.44575],
		];
$location = ["lat" => 31.023666666667,"lng" => 121.42797222222];
感谢打赏!
微信
支付宝

评论

  • Una回复

    手册没了~~~

发表评论

渝公网安备 50010502001162号