在C#中计算平均纬度和经度

4

我有一对 (minLatitude,maxLatitude) 和 (minLongitude,maxLongitude) 的十进制度数值,需要计算这个矩形框的平均点,如何获取它们的平均纬度/经度?当使用简单的算术平均值时,会出现相当大的偏差。

谢谢!


3
确认一下,你是如何计算“简单算术平均值”的? - Yuck
@Yuck,世界是圆的,不是平的。 - Chad La Guardia
你所说的“相当大的偏移”是什么意思?你希望大圆距离等于边界框的四个角吗? - Rowland Shaw
@Yuck:像往常一样,只需(纬度 + 经度)/ 2。 - H H
@Evens:你是如何找到/确定那个参考点的? - H H
显示剩余5条评论
2个回答

8
Pierre-Luc Champigny提出的解决方案是错误的。
在下面的图像中,您可以看到两条线:
1. (lat1,lon1) ->(lat2,lon2) 2. (lat1,lon2) ->(lat2,lon1)
每条线的一半为绿色,另一半为蓝色。
您可以看到两条线的中心不是同一点,两个中心都不是多边形的中心。
为了找到多边形的中心:
- 纬度= avrg(lat1,lat2) - 经度= avrg(lon1,lon2)
要获取这些值,您可以使用Pierre-Luc Champigny建议的链接,但是:
- 取(lat1,lon1) -> (lat2,lon1)的中点的纬度 - 取(lat1,lon1) -> (lat1,lon2)的中点的经度

5

来源: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);

谢谢,Pierre-Luc。我尝试了你的代码片段,平均经度似乎是连贯的,但平均纬度不是,我得到了一个非常小的值... - Evenstar
你尝试在网站上的计算器中输入值了吗? - Pierre-Luc Champigny
avgLat和avgLon返回的是弧度而不是角度。lon1应该是以弧度为单位。 - TreyA
@Evenstar,你最终解决了你的问题吗?如果你是通过我的答案解决的,可以把它标记为解决方案吗? - Pierre-Luc Champigny

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