谷歌有专门的Jar包,先导入包
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>22.0</version> </dependency>
写一个方法
public double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid) { //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离 GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo); return geoCurve.getEllipsoidalDistance(); } 可以看到参数是两个经纬度和一个坐标系。 写个方法实验一下 //此处可以传入用户经纬度 GlobalCoordinates source = new GlobalCoordinates(23.697775,112.991604); //此处可以传入另一个地址经纬度 GlobalCoordinates source2 = new GlobalCoordinates(23.758648,112.68745); //调用方法算出距离 double meter1 = getDistanceMeter(source, source1, Ellipsoid.Sphere);
这里使用了Sphere的坐标系 比较出名的还有一个WGS84,坐标系不同距离可能有一点误差。
最后返回的meter1就是两个经纬度之间的距离了。
小建议:可以将Pojo类给定一个字段,这个字段显示用户到商家之间的距离。查询出列表之后使用流遍历,将两个坐标之间的距离赋值给这个变量,最小的变量距离最近,最后根据变量升序返回。(如果不是很严谨的数据,这里可以忽略掉线程安全。)