突然需要这样的一个逻辑判断,然后就开始处理了,这是属于工作上的需要了,果然忙起来就很惨,现在都四点了。
具体代码请参考GITHUB的数据,引用一个判断点在多边形的代码,具体方法就是判断一个点水平和垂直方向有几个焦点,基数即为在内部,相关算法为光线投射算法:
/**
* 判断GPS坐标是否在多边形中
* @param array $list [维度,经度] 的形式,取0,1键值
* @param float $lat 维度
* @param float $lng 经度
* @return bool
*/
public static function IsInsidePolygon($list, $lat, $lng): bool
{
$inside = false;
$prePoint = $list[0];
$length = count($list);
for($i = 1; $i < $length; $i++) {
$nextPoint = $list[$i];
if($lng > min($prePoint[1], $nextPoint[1])
&& $lng <= max($prePoint[1], $nextPoint[1])
&& $lat <= max($prePoint[0], $nextPoint[0])
&& $prePoint[1] != $nextPoint[1]
) {
$xinters = ($lng - $prePoint[1]) * ($nextPoint[0] - $prePoint[0]) / ($nextPoint[1] - $prePoint[1]) + $prePoint[0];
if($prePoint[0] == $nextPoint[0] || $lat <= $xinters)
$inside ^= true;
}
$prePoint = $nextPoint;
}
return (bool)$inside;
}
* 判断GPS坐标是否在多边形中
* @param array $list [维度,经度] 的形式,取0,1键值
* @param float $lat 维度
* @param float $lng 经度
* @return bool
*/
public static function IsInsidePolygon($list, $lat, $lng): bool
{
$inside = false;
$prePoint = $list[0];
$length = count($list);
for($i = 1; $i < $length; $i++) {
$nextPoint = $list[$i];
if($lng > min($prePoint[1], $nextPoint[1])
&& $lng <= max($prePoint[1], $nextPoint[1])
&& $lat <= max($prePoint[0], $nextPoint[0])
&& $prePoint[1] != $nextPoint[1]
) {
$xinters = ($lng - $prePoint[1]) * ($nextPoint[0] - $prePoint[0]) / ($nextPoint[1] - $prePoint[1]) + $prePoint[0];
if($prePoint[0] == $nextPoint[0] || $lat <= $xinters)
$inside ^= true;
}
$prePoint = $nextPoint;
}
return (bool)$inside;
}
原理什么的不多说,太复杂了,参考文章可以去看博客园的文章,参考而来,算法和大部分坐标都是:
http://www.cnblogs.com/Aimeast/archive/2012/08/09/2629614.html
这个东西的应用场景在哪里?
判断坐标是否在中国,然后转换坐标为实际坐标!否则会有偏移
只允许中国区运行,跟抓精灵游戏一样
对啊!具体的运行情形挺多的
会不会有人拿代码跑钓鱼岛去做测试?
肯定会有的!不过这种情况先不考虑!符合当前情形即可
看起来真高级~~
其实这是个苦力活!要一个个打点判断