查询坐标在哪些范围内
场景:
查询坐标在哪些范围内
现在是这样处理的
// 坐标
$point = '103.05293,30.69015';
// 坐标范围
$rangeAll = [
['103.05293,30.69015','103.05293,30.69015','103.05293,30.69015'],
['103.05293,30.69015','103.05293,30.69015','103.05293,30.69015'],
['103.05293,30.69015','103.05293,30.69015','103.05293,30.69015'],
['103.05293,30.69015','103.05293,30.69015','103.05293,30.69015']
];
$data = [];
foreach ($rangeAll as $range) {
if (isPointInPolygon($point, $polygon)) {
$data[] = $range;
}
}
function isPointInPolygon($point, $polygon) {
$x = $point[0];
$y = $point[1];
$vertices = count($polygon);
$intersect = false;
for ($i=0, $j=$vertices-1; $i<$vertices; $j=$i++) {
$xi = $polygon[$i][0];
$yi = $polygon[$i][1];
$xj = $polygon[$j][0];
$yj = $polygon[$j][1];
if ( (($yi > $y) != ($yj > $y)) &&
($x < ($xj-$xi) * ($y-$yi) / ($yj-$yi) + $xi) ) {
$intersect = !$intersect;
}
}
return $intersect;
}
但是当范围变多就会很慢才会出结果,有没有什么好的办法可以批量处理或者第三方接口
存redis, 用 Redis GEO
m1的cpu计算一百万次0.3秒,这效率还可以了啊
上面算法满足需求,接口业务太复杂了,仔细查代码发现是之前代码里面有在循环里面查缓存导致接口特别慢
mongodb
高德地图有地理围栏接口,不过范围有限制,范围不太大的免费
packagist.org/packages/mjaschen/ph...
我做过类似需求,使用的是 Elaticsearch 的 _geo_distance 查询,数据源1.7亿,查询效率个人觉得很快