给定一组纬度和经度点,如何计算该集合中心点的纬度和经度(也就是将所有点的视图居中的点)?
编辑:我用过的Python解决方案:
Convert lat/lon (must be in radians) to Cartesian coordinates for each location.
X = cos(lat) * cos(lon)
Y = cos(lat) * sin(lon)
Z = sin(lat)
Compute average x, y and z coordinates.
x = (x1 + x2 + ... + xn) / n
y = (y1 + y2 + ... + yn) / n
z = (z1 + z2 + ... + zn) / n
Convert average x, y, z coordinate to latitude and longitude.
Lon = atan2(y, x)
Hyp = sqrt(x * x + y * y)
Lat = atan2(z, hyp)
13 回答
只需平均它们的简单方法就有奇怪的边缘情况,当它们从359'回到0'时会有角度 .
A much earlier question on SO询问是否找到一组罗盘角度的平均值 .
对于球面坐标推荐的方法的扩展将是:
将每个纬度/经度对转换为单位长度的3D矢量 .
对每个向量求和
标准化生成的矢量
转换回球面坐标
谢谢!这是使用度数的OP解决方案的C#版本 . 它使用System.Device.Location.GeoCoordinate类
我发现这篇文章非常有用所以这里是PHP的解决方案 . 我一直在成功使用它,只是想在一段时间内保存另一个开发者 .
非常有用的帖子!我已经用JavaScript实现了这个,特此是我的代码 . 我成功地使用了这个 .
为了节省一两分钟的时间,这里是Objective-C而不是python中使用的解决方案 . 这个版本需要一个包含MKMapCoordinates的NSValues NSArray,在我的实现中需要它:
Javascript版本的原始功能
如果您有兴趣获得点的非常简化的“中心”(例如,简单地将 Map 居中到您的gmaps多边形的中心),那么这是一个适合我的基本方法 .
这将返回多边形中心的中间lat / lng坐标 .
非常好的解决方案,正是我的快速项目所需要的,所以这里's a swift port. thanks & here'也是一个游乐场项目:https://github.com/ppoh71/playgounds/tree/master/centerLocationPoint.playground
在Django中,这是微不足道的(实际上有效,我遇到了许多解决方案没有正确返回纬度的负面问题) .
例如,假设您正在使用django-geopostcodes(其中我是作者) .
point
是一个DjangoPoint
实例,可用于执行诸如检索距该中心点10km范围内的所有对象之类的事情;将其更改为原始Python是微不足道的;
在引擎盖下Django正在使用GEOS - 更多细节在https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/
这与所有权重相同的加权平均问题相同,并且存在两个维度 .
求出中心纬度的所有纬度的平均值以及中心经度的所有经度的平均值 .
警告Emptor:这是近距离近似,当由于地球的曲率而偏离平均值超过几英里时,误差将变得难以驾驭 . 请记住,纬度和经度都是度数(不是真正的网格) .
如果你想考虑使用的椭球,你可以在这里找到公式http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf
见附件B.
该文件包含许多其他有用的东西
乙
如果您希望图像中显示所有点,则需要纬度和经度的极值,并确保您的视图包含具有您想要的任何边界的值 .
(根据Alnitak的回答,你如何计算极值可能有点问题,但如果它们在经度的两边都有几度,那么你就会调用射击并采取正确的射程 . )
如果您不想扭曲这些点所在的任何 Map ,请调整边界框的纵横比,使其适合您分配给视图但仍包含极值的任何像素 .
若要将点保持在某个任意缩放级别的中心,请计算边界框的中心,使其“适合”上述点,并将该点保持为中心点 .
PHP中的对象 . 给定坐标对的数组,返回中心 .
摘自#4的想法