将跨越多个UTM区域的一组纬度/经度点投影到单个网格中

时间:2019-06-18 11:04:48

标签: python-3.x latitude-longitude coordinate-systems map-projections

我正在做一个项目,其中我需要转换很多地理位置(根据其纬度/经度),所有这些地理位置都在相对较小的区域(一个国家的大小)中(例如Nederlands),请放入网格,以便在其上运行一些聚类算法和其他内容。

我当前的实现使用utmgeopy模块。在某些情况下,它的工作原理就像是一种魅力(韩国很好地集中在单个UTM区域上),但是当这些点跨越几个不同的UTM区域时,不会马上出现(这就是Nederlands的情况) 。

我一直在考虑这样做的笨拙/模糊的方法(例如,将所有点的经度偏移几个度以尝试使其“居中”,或试图使区域彼此“粘在一起”),但是然后我一直在搜索,我意识到实际上存在many坐标系,以及几个处理它们的python模块(pyproj,底图等)。
因此,如果您明白我的意思,我宁愿不要重新发明轮子,尤其是不要重新发明正方形的轮子。

我并不需要很高的准确性,对于我来说,与实际距离相差5%绝对可以接受。但是我需要的是能够将一个地球区域(在经度和纬度范围内)转换为单个连贯的网格。

我认为性能不是问题,因为我最多只有100万点,而且我也不着急(如果要花几分钟的时间来转换,就这样吧)。

您对我有什么建议?
我更喜欢开箱即用的解决方案,而不是自己实现一个coords转换器,并且由于该项目是使用Python3编码的,因此坚持使用该语言绝对是一个加分。

1 个答案:

答案 0 :(得分:1)

请注意,Google Maps的解决方案可以追溯到2005年,当时要解决Web Mercator的这种问题,而EPSG: 3857正是这种情况。

  

我不需要很高的精度,与真实值相差5%   距离对我来说绝对可以接受

在这种情况下,您绝对可以使用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 Mercator的实现比例如UTM简单得多,因此性能会更好。