先算出某个坐标位置周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。
思路
首先算出“给定坐标附近1000米”这个范围的坐标范围。虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围去搜索数据库。圆形内为要求的搜索范围,方形内为我们能间接得到的结果范围。
先来求东西两侧的的范围边界。在haversin公式中令φ1=φ2,可得
Java实现
/***查找附近的人*@paramradii半径距离(单位km)*@paramlon经度*@paramlat纬度*@return*/@GetMapping("/nearby")publicListgetVicinity(doubleradii,doublelon,doublelat){doubler=6371;//地球半径千米doubledis=radii;doubledlng=2*Math.asin(Math.sin(dis/(2*r))/Math.cos(lat*Math.PI/180));dlng=dlng*180/Math.PI;//角度转为弧度doubledlat=dis/r;dlat=dlat*180/Math.PI;doubleminlat=lat-dlat;doublemaxlat=lat+dlat;doubleminlng=lon-dlng;doublemaxlng=lon+dlng;returnuserService.getVicinity(BigDecimal.valueOf(minlng),BigDecimal.valueOf(maxlng),BigDecimal.valueOf(minlat),BigDecimal.valueOf(maxlat));}mybatis
selectfromuserpositionwherelongitude>=#{minlng}andlongitude<=#{maxlng}andlatitude>=#{minlat}andlatitude<=#{maxlat}Listgetvicinity(@Param("minlng")BigDecimalminlng,@Param("maxlng")BigDecimalmaxlng,@Param("minlat")BigDecimalminlat,@Param("maxlat")BigDecimalmaxlat);测试效果
在地图中找到回龙新村的经纬度,然后测试。
Java代码
/***附近的人排序*@paramlon经度*@paramlat纬度*@return*/@GetMapping("/nearbysort")publicListgetVicinitySort(doublelon,doublelat){returnuserService.getvicinitysort(BigDecimal.valueOf(lon),BigDecimal.valueOf(lat));}mybatis代码
SELECTid,city,position,longitude,latitude,(POWER(MOD(ABS(longitude-#{longitude}),360),2)+POWER(ABS(latitude-#{latitude}),2))ASdistanceFROM`userposition`ORDERBYdistanceLIMIT20Listgetvicinitysort(@Param("longitude")BigDecimallongitude,@Param("latitude")BigDecimallatitude);测试效果
补充,如果需要按距离排序,并返回距离的字段。可以按如下方式实现。