将跨越多个 UTM 区域的一组 lat/lon 点投影到单个网格中
Projecting a set of lat/lon points that spans on multiple UTM zones into a single grid
我正在做一个项目,我需要转置很多地理位置(由他们的 latitude/longitude 给出),所有这些都在一个相对较小的区域(例如像荷兰这样的国家的大小),进入网格以便运行一些聚类算法和其他东西。
我当前的实现 使用 utm and geopy 模块。它在某些情况下就像一个魅力(韩国很好地以单个 UTM 区域为中心),但是 不会在点跨越几个不同的 UTM 区域时立即起作用 (就是这种情况荷兰)。
我一直在考虑 clumsy/inelegant 这样做的方法(比如将所有点的经度移动几度以尝试 'recenter' 它,或者尝试 'stick back'区域彼此),但后来我一直在搜索,我意识到确实存在 many 坐标系统,以及几个 python 模块(pyproj,底图,......)处理他们。
所以我宁愿不重新发明轮子,如果你明白我的意思,尤其是不要重新发明一个方形的。
我不需要很高的精度,与实际距离相差5%对我来说绝对可以接受。但我需要的是能够将地球的一个区域(给定纬度和经度的界限)转换成一个单一的连贯网格。
我认为性能不会成为问题,因为我最多有大约 100 万点,而且我并不着急(如果转换需要几分钟,那就这样吧)。
你有什么建议?
我更喜欢开箱即用的解决方案,而不是自己实现一个坐标转换器,并且由于该项目是用 Python3 编码的,坚持使用该语言肯定是一个优势。
请注意,解决方案 Google 地图早在 2005 年就出现了,为了解决这些限制,创建了所谓的 Web Mercator, currently known by the EPSG: 3857。
I do not need a great accuracy, a variation of 5% from the real
distances is definitely acceptable for me
在这种情况下,您绝对可以使用 Web Mercator。
可能在 Python 中实施:
import math
def merc_x(lon):
r_major=6378137.000
return r_major*math.radians(lon)
def merc_y(lat):
if lat>89.5:lat=89.5
if lat<-89.5:lat=-89.5
r_major=6378137.000
r_minor=6356752.3142
temp=r_minor/r_major
eccent=math.sqrt(1-temp**2)
phi=math.radians(lat)
sinphi=math.sin(phi)
con=eccent*sinphi
com=eccent/2
con=((1.0-con)/(1.0+con))**com
ts=math.tan((math.pi/2-phi)/2)/con
y=0-r_major*math.log(ts)
return y
请注意,Web 墨卡托实现比 UTM 等实现简单得多,因此性能会好得多。
我正在做一个项目,我需要转置很多地理位置(由他们的 latitude/longitude 给出),所有这些都在一个相对较小的区域(例如像荷兰这样的国家的大小),进入网格以便运行一些聚类算法和其他东西。
我当前的实现 使用 utm and geopy 模块。它在某些情况下就像一个魅力(韩国很好地以单个 UTM 区域为中心),但是 不会在点跨越几个不同的 UTM 区域时立即起作用 (就是这种情况荷兰)。
我一直在考虑 clumsy/inelegant 这样做的方法(比如将所有点的经度移动几度以尝试 'recenter' 它,或者尝试 'stick back'区域彼此),但后来我一直在搜索,我意识到确实存在 many 坐标系统,以及几个 python 模块(pyproj,底图,......)处理他们。
所以我宁愿不重新发明轮子,如果你明白我的意思,尤其是不要重新发明一个方形的。
我不需要很高的精度,与实际距离相差5%对我来说绝对可以接受。但我需要的是能够将地球的一个区域(给定纬度和经度的界限)转换成一个单一的连贯网格。
我认为性能不会成为问题,因为我最多有大约 100 万点,而且我并不着急(如果转换需要几分钟,那就这样吧)。
你有什么建议?
我更喜欢开箱即用的解决方案,而不是自己实现一个坐标转换器,并且由于该项目是用 Python3 编码的,坚持使用该语言肯定是一个优势。
请注意,解决方案 Google 地图早在 2005 年就出现了,为了解决这些限制,创建了所谓的 Web Mercator, currently known by the EPSG: 3857。
I do not need a great accuracy, a variation of 5% from the real distances is definitely acceptable for me
在这种情况下,您绝对可以使用 Web Mercator。
可能在 Python 中实施:
import math
def merc_x(lon):
r_major=6378137.000
return r_major*math.radians(lon)
def merc_y(lat):
if lat>89.5:lat=89.5
if lat<-89.5:lat=-89.5
r_major=6378137.000
r_minor=6356752.3142
temp=r_minor/r_major
eccent=math.sqrt(1-temp**2)
phi=math.radians(lat)
sinphi=math.sin(phi)
con=eccent*sinphi
com=eccent/2
con=((1.0-con)/(1.0+con))**com
ts=math.tan((math.pi/2-phi)/2)/con
y=0-r_major*math.log(ts)
return y
请注意,Web 墨卡托实现比 UTM 等实现简单得多,因此性能会好得多。