查询坐标在哪些范围内

场景:
查询坐标在哪些范围内
现在是这样处理的

// 坐标
$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;
}

但是当范围变多就会很慢才会出结果,有没有什么好的办法可以批量处理或者第三方接口

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 12

存redis, 用 Redis GEO

1年前 评论

file Reids GEO没有获取坐标和范围是否重叠的方法,是获取指定范围的坐标集合,或者计算距离 @Alone88

1年前 评论
Alone88 1年前
LearnMore (作者) (楼主) 1年前

m1的cpu计算一百万次0.3秒,这效率还可以了啊

1年前 评论
LearnMore (楼主) 1年前
//用 PostgreSQL的PostGIS扩展很方便
ST_Contains(geometry,point)  //bool
1年前 评论

上面算法满足需求,接口业务太复杂了,仔细查代码发现是之前代码里面有在循环里面查缓存导致接口特别慢

1年前 评论

高德地图有地理围栏接口,不过范围有限制,范围不太大的免费

1年前 评论

我做过类似需求,使用的是 Elaticsearch 的 _geo_distance 查询,数据源1.7亿,查询效率个人觉得很快

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!