赞
踩
两个点的经纬度
latitude纬度 | longitude经度 | 地点 |
---|---|---|
22.678611 | 113.805695 | 深圳同泰万怡酒店 |
22.716473 | 113.826391 | 深圳宝安中天美景华美达酒店 |
各种计算方式
计算方式 | 距离 |
---|---|
Elasticsearch:7.12.1 | 4715.088099751495 |
自定义公式计算 | 4720.367727793572 |
org.gavaghan/geodesy | 4715.085736444097 |
org.geotools/gt-referencing | 4701.260219872655 |
package com.example.demo.util; public class GeoUtil { /** * 地球半径,单位m */ private static final double EARTH_RADIUS = 6378137; /** * 根据经纬度,计算两点间的距离 * * @param longitude1 第一个点的经度 * @param latitude1 第一个点的纬度 * @param longitude2 第二个点的经度 * @param latitude2 第二个点的纬度 * @return 返回距离,单位m */ public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) { // 纬度 double lat1 = Math.toRadians(latitude1); double lat2 = Math.toRadians(latitude2); // 经度 double lng1 = Math.toRadians(longitude1); double lng2 = Math.toRadians(longitude2); // 纬度之差 double a = lat1 - lat2; // 经度之差 double b = lng1 - lng2; // 计算两点距离的公式 double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2))); // 弧长乘地球半径, 返回单位: 米 return s * EARTH_RADIUS; } public static void main(String[] args) { double distance = GeoUtil.getDistance(113.805695, 22.678611, 113.826391, 22.716473); System.out.println(distance); // 4720.367727793572 } }
依赖
<!--用于计算两点之间的距离-->
<dependency>
<groupId>org.gavaghan</groupId>
<artifactId>geodesy</artifactId>
<version>1.1.3</version>
</dependency>
示例
package com.example.demo; import org.gavaghan.geodesy.Ellipsoid; import org.gavaghan.geodesy.GeodeticCalculator; import org.gavaghan.geodesy.GeodeticCurve; import org.gavaghan.geodesy.GlobalCoordinates; import org.junit.jupiter.api.Test; public class GeoTest { @Test public void testGetDistance3() { //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离 GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve( Ellipsoid.Sphere, new GlobalCoordinates(22.678611, 113.805695), new GlobalCoordinates(22.716473, 113.826391) ); System.out.println(geoCurve.getEllipsoidalDistance()); // WGS84 4701.260219874908 // Sphere 4715.085736444097 } }
文档
依赖
<repositories> <repository> <id>osgeo</id> <name>OSGeo Release Repository</name> <url>https://repo.osgeo.org/repository/release/</url> <snapshots><enabled>false</enabled></snapshots> <releases><enabled>true</enabled></releases> </repository> <repository> <id>osgeo-snapshot</id> <name>OSGeo Snapshot Repository</name> <url>https://repo.osgeo.org/repository/snapshot/</url> <snapshots><enabled>true</enabled></snapshots> <releases><enabled>false</enabled></releases> </repository> </repositories> <dependencies> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-referencing</artifactId> <version>27.2</version> </dependency> </dependencies>
注意:geotools不在central中央仓库,需要配置下载源
如果配置了镜像 ~/.m2/settings.xml
,不能设置为*
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
代码示例
package com.example.demo.util; import org.geotools.referencing.GeodeticCalculator; import org.geotools.referencing.crs.DefaultGeographicCRS; public class DemoUtil { public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) { // 84坐标系构造GeodeticCalculator GeodeticCalculator geodeticCalculator = new GeodeticCalculator(DefaultGeographicCRS.WGS84); // 起点经纬度 geodeticCalculator.setStartingGeographicPoint(longitude1, latitude1); // 末点经纬度 geodeticCalculator.setDestinationGeographicPoint(longitude2, latitude2); // 计算距离,单位:米 return geodeticCalculator.getOrthodromicDistance(); } public static void main(String[] args) { double distance = DemoUtil.getDistance(113.805695, 22.678611, 113.826391, 22.716473); System.out.println(distance); // 4701.260219872655 } }
参考
GeoTools依赖使用Maven下载失败解决办法记录
Java计算两个GPS坐标点之间的距离(可用于计算里程等)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。