【问题标题】:Projecting a set of lat/lon points that spans on multiple UTM zones into a single grid将跨越多个 UTM 区域的一组纬度/经度点投影到单个网格中
【发布时间】:2019-06-18 11:04:48
【问题描述】:

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

我当前的实现使用utmgeopy 模块。在某些情况下,它就像一个魅力(韩国很好地集中在一个 UTM 区域),但 只要这些点跨越多个不同的 UTM 区域(荷兰就是这种情况),它就不会起作用.

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

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

我认为性能不是问题,因为我最多有大约 100 万个点,而且我并不着急(如果转换需要几分钟,那就这样吧)。

你有什么建议?
我更喜欢开箱即用的解决方案,而不是自己实现一个坐标转换器,而且由于该项目是用 Python3 编码的,所以坚持使用该语言肯定是一个加分项。

【问题讨论】:

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


    【解决方案1】:

    请注意,谷歌地图早在 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 等简单得多,因此性能会好得多。

    【讨论】:

    • Web 墨卡托正是我所需要的。至于你在答案中写的函数:复制粘贴函数,修改4行代码,它就像一个魅力。非常感谢:-)
    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2021-12-25
    • 2013-09-09
    相关资源
    最近更新 更多