车载GPS跟踪设备

时间:2014-01-27 16:39:05

标签: c# winforms web-services gps

我希望在订单输入系统中添加一项功能,以实时显示订单位置和指定送货车之间KM的距离。

货车有High Point GPS的GPS跟踪系统,附带一个API来查询驾驶员位置,以LAT / LONG格式返回,以及位置地址(如果有的话)。

一旦我获得了位置,我可以使用网络服务来计算两个位置之间的距离,是否有人知道使用LAT / LONG进行车辆和地址查询以获得2个位置之间距离的最佳方法是什么位置?

5 个答案:

答案 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);
    }

一点解释:

  • (plat1,plon1)是第1点或原点
  • 的lat和lng
  • (plat2,plon2)是第2点或目标
  • 的lat和lng
  • 方法"执行"是你调用的那个,它返回一个包含以米为单位的距离的字符串(可以很容易地转换为其他单位)
  • 两个辅助功能被声明为" deg2rad"和" rad2deg"。

答案 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/