繁体   English   中英

地图坐标C#

[英]Map Coordinates C#

我有一组纬度经度点。 如果我想测试一个新点是否在现有点的x米以内,这可能吗? 如果使用这种方式,那会是最好的吗?

ForEach(Coordinate coord in Coordinates)
{
     var distance =  GeoCoordinate.GetDistance(lat,lon);
     if(distance <= x)
     {
         addToQualifyingList(coord);
     }
}

并将新坐标与集合中的每个点进行比较,并检查新坐标是否在x米之内?

这是一种计算两个点(lat1,lon1和lat2,lon2)之间距离的方法

public enum DistanceUnit { miles, kilometers, nauticalmiles }
public double GetDistance( double lat1, double lon1 , double lat2 , double lon2, DistanceUnit unit)
{
    Func<double, double> deg2rad = deg => (deg * Math.PI / 180.0);
    Func<double, double> rad2deg = rad => (rad / Math.PI * 180.0);
    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));
    dist = Math.Acos(dist);
    dist = rad2deg(dist);
    dist = dist * 60 * 1.1515;

    if (unit == DistanceUnit.kilometers)
    {
        dist = dist * 1.609344;
    }
    else if (unit == DistanceUnit.nauticalmiles)
    {
        dist = dist * 0.8684;
    }
    return (dist);
}

要确定距离小于1公里的所有坐标,请执行以下操作:

List<Coordinate> result = Coordinates.Where(x => GeoCoordinate.GetDistance(lat,lon, x.lan, x.lon, DistanceUnit.kilometers) < 1).ToList();

纬度和经度都需要知道地球或任何其他球形物体的位置。 这些是从它们各自的零线/点按度给出的。

http://www.movable-type.co.uk/scripts/latlong.html

有Java解决方案

>    var R = 6371e3; // metres
>     var φ1 = lat1.toRadians();
>     var φ2 = lat2.toRadians();
>     var Δφ = (lat2-lat1).toRadians();
>     var Δλ = (lon2-lon1).toRadians();
> 
>     var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
>             Math.cos(φ1) * Math.cos(φ2) *
>             Math.sin(Δλ/2) * Math.sin(Δλ/2);
>     var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
> 
>     var d = R * c;

显然,这是小距离的最佳解决方案之一。

您应该能够将其复制并粘贴到C#中,您必须更改变量名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM