有A、B两批名称及经纬度数据(每个名称对应一个经纬度)
A是B的子集,A集有873个点,B集大概是1万3千个点
目的是想以A集的点为中心(遍历A集的点)
查出A集任一点半径1公里内或1.5公里内是否存在B集里的点、存在多少个以及存在哪几个(B集的名称)
要求能批量得出A集所有点的结果,预期结果如下图:
希望能同过sql、mysql或java的方式实现,求助!谢谢
最简单的搞法,通过A点和距离,反推出经纬度范围,
比如A点是100.xxxx,40.xxxx, 反推方圆1公里的经度范围是95.xxxx---105.xxxxx,
纬度范围是35.xxxx----45.xxxxx, 然后循环如下:
for(A点集合){
select count(*), group_concat(B的name) from B集合 where 经度>=95.xxxx and 经度<=105.xxxx and 纬度>=35.xxxx and 纬度<=45.xxxxx ;
}
反推经纬度范围的方法可以优化一下,在A的基础上加减一个偏移量是矩形范围,不是圆型范围,我只是简单打个比方
撇开什么度计算距离,设计师相当不错。
对Afor循环
然后用sql求出已A的经纬度为中心 直线距离为1.5公里的集合 参考sql {A_longitude} {A_latitude} 这是A的经纬度 ,PI是常量π =3.14159..... ,B_latitude是B的经纬度 但是是写一起的 以逗号分割 SUBSTRING_INDEX(B_latitude,',',-1) SUBSTRING_INDEX(B_latitude,',',1) 这两个
就是取出经度和纬度的值。最后的1500是距离 米:
select * from B
WHERE round(6378.138*2*asin(sqrt(pow(sin(({A_longitude}*pi()/180-SUBSTRING_INDEX(B_latitude,',',-1)*pi()/180)/2),2) +
cos ({A_longitude}*pi()/180)*cos(SUBSTRING_INDEX(B_latitude,',',-1)*pi()/180)*
pow(sin( ({A_latitude}*pi()/180-SUBSTRING_INDEX(B_latitude,',',1)*pi()/180)/2),2)))*1000) >= 1500
如果不想返回list 想返回拼接的 mysql中可以用 group_concat