计算两个 GeoLocation 之间的距离
Calculate distance between two GeoLocation
我正在尝试计算两个地理位置之间的距离。我遇到的问题如下:我尝试使用像这样的库:Geocalc 和 Haversine 公式,像这样:
public static final double RKilometers = 6371;
public static double calculationByDistance(double lat1, double lon1, double lat2, double lon2) {
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
lat1 = Math.toRadians(lat1);
lat2 = Math.toRadians(lat2);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.asin(Math.sqrt(a));
return RKilometers * c;
}
但是我对所有这些选项都得到了相同的错误值。对于短距离,它工作得很好,但对于长距离,它就不行了。
这是我做的测试:
//distance between Barrow Island(Australia) and Tavatave(Madagascar)
assertEquals(calculationByDistance(20.82, 115.4, 18.15, 49.4), 6885, 20);
//get 6875.965169284442
//here is the problem
//distance between Rio Grande and Glasgow
assertEquals(calculationByDistance(32.05, 52.11, 55.83, 4.25), 10744, 20);
//get 4522.502442756569
有人知道我的错误在哪里吗?谢谢!
这段代码我很久以前就有了,我什至不记得是我自己写的还是从别人那里得到的。据我记得它给出了一个很好的估计,你可以试试看它是否适合你。 (欢迎编辑)
public static double distFrom(double lat1, double lng1, double lat2, double lng2) {
double earthRadius = 3958.75; //this is in miles I believe
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double sindLat = Math.sin(dLat / 2);
double sindLng = Math.sin(dLng / 2);
double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
* Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
return dist;
}
很难向您推荐任何代码片段或现有的工具和服务。只是因为计算距离取决于特定的任务。有很多种地图投影和对应的公式。
例如,如果您使用 Google 地图,您可能可以在考虑高度差异的情况下进行更精确的计算。例如,OpenStreetMap 不提供(至少几年前)任何高度信息,因此您的精度可能会有所不同(例如,比较东欧和旧金山 'flat' 城市使用 OpenStreetMap 获得的精度)。
我对 https://code.google.com/p/simplelatlng/ 很满意。它非常简单,可以让您免于编写样板代码。
对于长距离,特定的 Web 服务可以做得很好(尤其是当服务聚合来自其他几个服务的数据时)。
我发现了错误。问题是纬度和经度的值是错误的。我从 Wolframalpha 获取数据,它们没有显示值的符号。我测试的权利值是:
assertEquals(calculationByDistance(-32.05, 52.11, 55.83, -4.25), 10744, 20);
感谢您抽出宝贵时间!!!对于愚蠢的错误深表歉意:)
public static float distFrom(float lat1, float lng1, float lat2, float lng2)
{
// Earth Radius in meters
double earthRadius = 6371000;
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Math.toRadians(lat1)) *
Math.cos(Math.toRadians(lat2)) *
Math.sin(dLng/2) * Math.sin(dLng/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
float dist = (float) (earthRadius * c);
System.out.println("Distance is : " + dist);
return dist; // distance in meters
}
我正在尝试计算两个地理位置之间的距离。我遇到的问题如下:我尝试使用像这样的库:Geocalc 和 Haversine 公式,像这样:
public static final double RKilometers = 6371;
public static double calculationByDistance(double lat1, double lon1, double lat2, double lon2) {
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
lat1 = Math.toRadians(lat1);
lat2 = Math.toRadians(lat2);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.asin(Math.sqrt(a));
return RKilometers * c;
}
但是我对所有这些选项都得到了相同的错误值。对于短距离,它工作得很好,但对于长距离,它就不行了。
这是我做的测试:
//distance between Barrow Island(Australia) and Tavatave(Madagascar)
assertEquals(calculationByDistance(20.82, 115.4, 18.15, 49.4), 6885, 20);
//get 6875.965169284442
//here is the problem
//distance between Rio Grande and Glasgow
assertEquals(calculationByDistance(32.05, 52.11, 55.83, 4.25), 10744, 20);
//get 4522.502442756569
有人知道我的错误在哪里吗?谢谢!
这段代码我很久以前就有了,我什至不记得是我自己写的还是从别人那里得到的。据我记得它给出了一个很好的估计,你可以试试看它是否适合你。 (欢迎编辑)
public static double distFrom(double lat1, double lng1, double lat2, double lng2) {
double earthRadius = 3958.75; //this is in miles I believe
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double sindLat = Math.sin(dLat / 2);
double sindLng = Math.sin(dLng / 2);
double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
* Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
return dist;
}
很难向您推荐任何代码片段或现有的工具和服务。只是因为计算距离取决于特定的任务。有很多种地图投影和对应的公式。
例如,如果您使用 Google 地图,您可能可以在考虑高度差异的情况下进行更精确的计算。例如,OpenStreetMap 不提供(至少几年前)任何高度信息,因此您的精度可能会有所不同(例如,比较东欧和旧金山 'flat' 城市使用 OpenStreetMap 获得的精度)。
我对 https://code.google.com/p/simplelatlng/ 很满意。它非常简单,可以让您免于编写样板代码。
对于长距离,特定的 Web 服务可以做得很好(尤其是当服务聚合来自其他几个服务的数据时)。
我发现了错误。问题是纬度和经度的值是错误的。我从 Wolframalpha 获取数据,它们没有显示值的符号。我测试的权利值是:
assertEquals(calculationByDistance(-32.05, 52.11, 55.83, -4.25), 10744, 20);
感谢您抽出宝贵时间!!!对于愚蠢的错误深表歉意:)
public static float distFrom(float lat1, float lng1, float lat2, float lng2)
{
// Earth Radius in meters
double earthRadius = 6371000;
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Math.toRadians(lat1)) *
Math.cos(Math.toRadians(lat2)) *
Math.sin(dLng/2) * Math.sin(dLng/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
float dist = (float) (earthRadius * c);
System.out.println("Distance is : " + dist);
return dist; // distance in meters
}