我希望在订单输入系统中添加一项功能,以实时显示订单位置和指定送货车之间KM的距离。
货车有High Point GPS的GPS跟踪系统,附带一个API来查询驾驶员位置,以LAT / LONG格式返回,以及位置地址(如果有的话)。
一旦我获得了位置,我可以使用网络服务来计算两个位置之间的距离,是否有人知道使用LAT / LONG进行车辆和地址查询以获得2个位置之间距离的最佳方法是什么位置?
答案 0 :(得分:7)
您可以使用Google地图获取Lat / Long地址 见Thomas Clayson的回答
How can I get latitude, longitude of a location programmatically or using a api
然后,您可以使用余弦定律或Haversine公式计算两组坐标之间的距离 See Law of Cosines
答案 1 :(得分:5)
这取决于您已使用的其他服务。例如,我们已经使用谷歌地图显示路线,因此我们使用他们的geocoding service从地址转换为坐标,以及their distance service来计算距离。
答案 2 :(得分:2)
为源点和目标点(http://msdn.microsoft.com/en-us/library/system.data.spatial.dbgeography.distance(v=vs.110).aspx)创建两个DbGeography实例。然后使用DbGeography的距离法找到两点之间的距离。
对于距离单位,请参阅此帖子:System.Data.Spatial DbGeography.Distance units?
答案 3 :(得分:1)
我已经完成了这项工作,但在Java中,您可以毫不费力地将其移植到c#。
这对于短于2000公里的距离非常准确,然后它可以与实际距离稍微变化一点。这是由于地球曲率造成的。但是对于较小的距离,你可以假设它很明显,结果没有或只有非常小的影响。
这是我发现有用的link。
另一个link,C#中的Haversine实现。
希望它有所帮助。
最好的问候,费德里科。
public String execute(String plat1, String plon1, String plat2, String plon2) {
String distance;
double lat1, lon1, lat2, lon2;
try{
lat1 = Double.parseDouble(plat1);
lon1 = Double.parseDouble(plon1);
lat2 = Double.parseDouble(plat2);
lon2 = Double.parseDouble(plon2);
} catch (Exception e){
lat1 = 0.0d;
lon1 = 0.0d;
lat2 = 0.0d;
lon2 = 0.0d;
}
//theta and distance
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
//distance
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
dist = dist * 1.609344;
//convert to meters
dist = dist * 1000;
//output in meters
distance = Double.toString(dist);
return distance;
}
private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
一点解释:
答案 4 :(得分:1)
您可能会找到一个简单的答案,这是一个简单的公式:
Calculate distance between two points in google maps V3
var rad = function(x) {
return x * Math.PI / 180;
};
var getDistance = function(p1, p2) {
var R = 6378137; // Earth’s mean radius in meter
var dLat = rad(p2.lat() - p1.lat());
var dLong = rad(p2.lng() - p1.lng());
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) *
Math.sin(dLong / 2) * Math.sin(dLong / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c;
return d; // returns the distance in meter
};
使用google maps api将是最佳解决方案:
https://developers.google.com/maps/documentation/distancematrix/