本文的使用场景通常出现在地理位置范围的判断,如一个外卖商户在地图上使用多边形的方式勾勒出可达的配送范围,可以根据用户的定位地址判断是否在指定配送范围内。以下给出范围判断的关键算法:
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,给定经纬度在多边形中。需要说明一下,在使用中,请保证多边形经纬度参数是由多边形各点的经纬度数组按照顺序组成的二维数组,顺序可以是顺时针也可以是逆时针。
上一篇:
php对图片二进制流的处理
下一篇:
限制页面只能在微信浏览器打开
友情提示:垃圾评论一律封号...