车载GPS跟踪设备
Posted
技术标签:
【中文标题】车载GPS跟踪设备【英文标题】:Vehicle GPS Tracking Devices 【发布时间】:2014-02-18 14:49:11 【问题描述】:我希望在订单输入系统中添加一项功能,以实时显示订单位置和指定送货车之间的公里距离。
货车有一个来自High Point GPS 的 GPS 跟踪系统,带有一个 API 来查询司机位置,以 LAT/LONG 格式返回,如果有位置地址。
获得位置后,我可以使用网络服务计算两个位置之间的距离,有谁知道使用 LAT/LONG 获取两个位置之间距离的最佳方法是车辆和地址查找以进行交付地点?
【问题讨论】:
您好,Israel,您给 HighPoint GPS 的客户服务部打电话了吗?他们说了什么? 是的,他们确实支持 API 来获取车辆的 LAT/LONG,但我需要为我的应用程序获取到订单位置的距离 您是在寻找直线距离还是行驶距离?由于我们谈论的是车辆和目的地,它看起来更像是后者,这是一个与前者截然不同的问题。面包车可能在 100 码外,但在某些铁轨的错误一侧,必须开几英里才能到达目的地。 两者都很棒。 Bing Maps 提供了一个 API 来查询以公里或英里为单位的距离[这里有一个类似的问题与分辨率][1] [1]:***.com/questions/9856101/… 【参考方案1】:这取决于您已经在使用的其他服务。例如,我们已经使用谷歌地图来显示路线,所以我们使用他们的geocoding service 将地址转换为坐标,并使用their distance service 来计算距离。
【讨论】:
【参考方案2】:您可以使用谷歌地图获取地址的纬度/经度 查看 Thomas Clayson 的回答
How can I get latitude, longitude of a location programmatically or using a api
然后你可以使用余弦定律或Haversine公式计算两组坐标之间的距离 See Law of Cosines
【讨论】:
【参考方案3】:为源点和目标点创建两个 DbGeography 实例 (http://msdn.microsoft.com/en-us/library/system.data.spatial.dbgeography.distance(v=vs.110).aspx)。然后使用DbGeography的距离方法求两点之间的距离。
有关距离单位,请参阅此帖子:System.Data.Spatial DbGeography.Distance units?
【讨论】:
【参考方案4】:我已经这样做了,但在 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);
一点解释:
(plat1, plon1) 是点 1 或原点的纬度和经度 (plat2, plon2) 是点 2 或目的地的纬度和经度 “execute”方法是您调用的方法,它返回一个包含以米为单位的距离的字符串(可以轻松地转换为其他单位) 两个辅助函数被声明为“deg2rad”和“rad2deg”。【讨论】:
【参考方案5】:您可能找到的简单答案是一个简单的公式:
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/
【讨论】:
以上是关于车载GPS跟踪设备的主要内容,如果未能解决你的问题,请参考以下文章