在C#中计算两个点之间的距离。

6

我正在尝试找出一种在c#中计算两点之间距离的方法。

这是我一直在尝试的代码,但我担心得到的答案不正确。

static void Main()
    {
        //postcode australia 2600 -> 3000
        float latA = -31.997976f;
        float longA = 115.762877f;
        float latB = -31.99212f;
        float longB = 115.763228f;
        decimal distance = (DistanceBetween(latA, latB, longA, longB));
        Console.WriteLine("Distance is" + distance);
        Console.ReadLine();
    }

    static decimal DistanceBetween(float latA, float longA, float latB, float longB)
    {
        var RadianLatA = Math.PI * latA / 180;
        var RadianLatb = Math.PI * latB / 180;
        var RadianLongA = Math.PI * longA / 180;
        var RadianLongB = Math.PI * longB / 180;

        double theDistance = (Math.Sin(RadianLatA)) *
                Math.Sin(RadianLatb) +
                Math.Cos(RadianLatA) *
                Math.Cos(RadianLatb) *
                Math.Cos(RadianLongA - RadianLongB);

        return Convert.ToDecimal(((Math.Acos(theDistance) * (180.0 / Math.PI)))) * 69.09M * 1.6093M;
    }

这是从这里找到的回答改编而来:地址之间的距离 有没有关于出了什么问题的想法?
谢谢 Ryan

这个网站总是帮助我计算两点之间的距离。http://www.movable-type.co.uk/scripts/latlong.html - woutervs
谢谢,好的链接。我要将这个应用于asp.net程序来计算邮编之间的距离,所以必须正确实现这段代码! - user1672867
我的第一个猜测是你的三角函数转换中存在符号问题。打开WolframAlpha或计算器,逐步执行代码,并查看每个Math.Sin(或其他三角函数)的结果,看看结果是否匹配。 在将角度转换为弧度时,在使用三角函数时也必须考虑符号。 - Daniel Kotin
4个回答

18

我通常使用的类是GeoCoordinate

double latA = -31.997976f;
double longA = 115.762877f;
double latB = -31.99212f;
double longB = 115.763228f;

var locA = new GeoCoordinate(latA, longA);
var locB = new GeoCoordinate(latB, longB);
double distance = locA.GetDistanceTo(locB ); // metres

我昨天尝试过这个,但是如果我写了"using System.Device.Location",它就会出现错误。我需要手动添加这个类吗? - user1672867
1
你需要添加一个项目引用到 System.Device dll,这个不是默认包含的。 - Liath
非常感谢。我现在就开始做 :) - user1672867
完美运行并已整合到我的代码中。我无法向您解释您为我提供了多少帮助!!! - user1672867
@user1672867 不用担心。您能否接受最终使用的答案呢? - Liath

6
double lat1 = {};
double lat2 = {};
double lon1 = {};
double lon2 = {};

var R = 6376.5000; //Km
lat1 = lat1.ToRad();
lat2 = lat2.ToRad();
lon1 = lon1.ToRad();
lon2 = lon2.ToRad();
var dLat = lat2 - lat1;
var dLon = lon2 - lon1;
var a = Math.Pow(Math.Sin(dLat / 2), 2) + (Math.Pow(Math.Sin(dLon / 2), 2) * Math.Cos(lat1) * Math.Cos(lat2));
var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
var distance = R * c;

public double ToRad(this double degs) {
    return degs * (Math.PI/180.0);
}

输入应为双精度浮点数。

这是哈弗赛恩公式,它用于计算地球上两点之间的距离。这是直线距离,如果您需要路径上的距离,则需要找到该路径上的所有点,然后计算每两个点之间的距离,然后将其总和。


谢谢,我现在开始尝试 :) - user1672867
1
由于您是新用户,请不要忘记给这个答案点赞/标记为有帮助的答案。 - woutervs
尽管这种方法是完全有效的(假设公式是正确的),但我更喜欢在可能的情况下使用内置方法,因为它被世界各地的用户使用-出错的可能性较小! - Liath
@Liath,你在说哪些内置方法? - woutervs
@woutervs 我自己使用GeoCoordinate.GetDistanceTo() - Liath
显示剩余3条评论

2

没见过这个,我通常使用GeoCoordinate - http://msdn.microsoft.com/en-us/library/system.device.location.geocoordinate(v=vs.110).aspx - Liath
请原谅我的愚蠢。我尝试了Geocoordinate,但无法使其工作。我对编程非常陌生。我现在要尝试这个。我需要定义"using System.Data.Spatial"才能使用该方法吗? - user1672867
@user1672867 我想在我的以前的一个问题中有一个例子。我会试着找出来 - 我只是好奇GeoCoordinate和DBGeography之间的区别... - Liath

-6

距离公式:给定两个点(x1,y1)和(x2,y2),这些点之间的距离由以下公式给出:

enter image description here

根据需要使用它


2
这只适用于平面表面,而不是地球 :) - woutervs
请尝试使用此链接,希望能有所帮助。其他链接:http://www.calculatorsoup.com/calculators/geometry-solids/distance-two-points.php - suku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接