【问题标题】:Calculate average latitude and longitude in C#在C#中计算平均纬度和经度
【发布时间】:2011-08-31 15:02:19
【问题描述】:

我有十进制度的 (minLatitude,maxLatitude) 和 (minLongitude,maxLongitude) 对,我需要计算这些对定义的框的平均点,我怎样才能得到它们的平均纬度/经度?计算简单算术平均值时,我得到了一个相当大的偏移量。

谢谢!

【问题讨论】:

  • 只是为了确定,你是如何计算“简单算术平均值”的?
  • @Yuck,世界是圆的,不是平的
  • 你所说的“相当大的偏移”是什么意思?您是否希望大圆距离等于边界框的所有四个角?
  • @Yuck: 像往常一样,只是 (lat + lon) / 2
  • @Henk - 你是说(lat1 + lat2) / 2

标签: c# algorithm latitude-longitude average


【解决方案1】:

Pierre-Luc Champigny 提出的解决方案是错误的。

在下图中,您可以看到两行:

  1. (lat1,lon1) --> (lat2,lon2)
  2. (lat1,lon2) --> (lat2,lon1)

每行的一半长度为绿色,另一半为蓝色。

可以看到两条线的中心不是同一个点,两个中心都不是多边形的中心。

为了找到多边形的中心:

  • lat= avrg(lat1,lat2)
  • lon= avrg(lon1,lon2)

要获取这些值,您可以使用 Pierre-Luc Champigny 建议的链接,但是:

  • 取 (lat1,lon1) 中点的 lat --> (lat2,lon1)
  • 取 (lat1,lon1) 中点的 lon --> (lat1,lon2)

【讨论】:

    【解决方案2】:

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

    你的值应该都是弧度,所以使用中点公式:

    var lat1 = minLatitude;  // In radian
    var lat2 = maxLatitude;  // In radian
    var lon1 = minLongitude; // In radian
    var lon2 = maxLongitude; // In radian
    
    var dLon = (lon2-lon1); 
    
    
    var Bx = Math.Cos(lat2) * Math.Cos(dLon);
    var By = Math.Cos(lat2) * Math.Sin(dLon);
    var avgLat = Math.Atan2(
               Math.Sin(lat1) + 
               Math.Sin(lat2), 
               Math.Sqrt((
               Math.Cos(lat1)+Bx) * (Math.Cos(lat1)+Bx) + By*By));
    
    var avgLong = lon1 + Math.Atan2(By, Math.Cos(lat1) + Bx);
    

    【讨论】:

    • 谢谢,皮埃尔-卢克。我试过你的代码 sn-p 平均经度似乎是连贯的,但平均纬度却不是,我得到一个非常小的值......
    • 您是否尝试在网站上的计算器中输入您的值?
    • avgLat 和 avgLon 返回 RADIANS 而不是度数。 lon1 应该是弧度。
    • @Evenstar 你终于解决了你的问题吗?如果你用我的回答解决了,你能把它标记为解决方案吗?
    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多