日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转载】osgeo和pyproj:经纬度坐标和高斯坐标互相转换

發布時間:2024/3/24 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】osgeo和pyproj:经纬度坐标和高斯坐标互相转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言
搞地圖和自動駕駛的都知道,坐標轉換是非常頻繁的事情,有時候需要在各種坐標之間來回的轉換,最近使用python代碼處理地圖數據,在使用osgeo庫中的gdal時,發現了gdal v2和V3的一些不同之處,研究了一下,這里分享出來。

二、問題描述
經緯度轉高斯的過程中,發現3.0一直出現的轉換結果是’inf’,經過查看官方github上的issue,才知道,gdal V3.0以后,轉換需要設置轉換策略,具體看后面代碼中的說明,現象截圖如下:


三、解決后封裝的代碼
下面代碼使用osgeo庫和pyproj庫分別實現,底層調用都是gdal,代碼經過測試。

#!/usr/bin/python3__author__ = 'ISmileLi'from osgeo import gdal, ogr, osr from pyproj import Transformer''' osgeo底層坐標轉換使用的庫還是proj,下面函數中的espg值需要根據自己的需求進行修改, 下文測試使用的是wgs84與中國區高斯-克呂格EPSG碼為21460區的轉換 '''def lonLat_to_gauss(lon, lat, from_epsg=4326, to_epsg=21460):'''經緯度轉高斯:param lon::param lat::param from_epsg::param to_EPSG::return:'''from_spa = osr.SpatialReference()'''gdal版本大于3.0以后必須設置轉換策略才能正確顯示結果,否則結果將會輸出'inf'可以了解官方的這個issue說明:https://github.com/OSGeo/gdal/issues/1546'''if int(gdal.__version__[0]) >= 3:from_spa.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)from_spa.ImportFromEPSG(from_epsg)to_spa = osr.SpatialReference()to_spa.ImportFromEPSG(to_epsg)coord_trans = osr.CoordinateTransformation(from_spa, to_spa)t = coord_trans.TransformPoint(lon, lat)return t[0], t[1]def gauss_to_lonLat(x, y, from_epsg=21460, to_epsg=4326):'''高斯轉經緯度:param x::param y::param from_epsg::param to_EPSG::return:'''from_spa = osr.SpatialReference()#if int(gdal.__version__[0]) >= 3:#from_spa.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)from_spa.ImportFromEPSG(from_epsg)to_spa = osr.SpatialReference()to_spa.ImportFromEPSG(to_epsg)coord_trans = osr.CoordinateTransformation(from_spa, to_spa)t = coord_trans.TransformPoint(x, y)return t[0], t[1]def lonLat_to_gauss_proj(lon, lat, from_epsg="EPSG:4326", to_epsg="EPSG:21460"):'''使用proj庫經緯度轉高斯:param lon::param lat::param from_epsg::param to_epsg::return:'''transfromer = Transformer.from_crs(from_epsg, to_epsg,always_xy=True) # WGS-84對應碼->EPSG:4326, 中國高斯對應碼:EPSG:21460x, y = transfromer.transform(lon, lat)print('lonLat_to_gauss_proj x, y:',x, y)return x, ydef gauss_to_lonLat_proj(x, y, from_epsg="EPSG:21460", to_epsg="EPSG:4326"):'''使用proj庫高斯轉經緯度:param x::param y::param from_epsg::param to_epsg::return:'''transfromer = Transformer.from_crs(from_epsg, to_epsg, always_xy=True) # WGS-84對應碼->EPSG:4326, 中國高斯對應碼:EPSG:21460lon, lat = transfromer.transform(x, y)print('lonLat_to_gauss_proj lon, lat:', lon, lat)return lon, latif __name__ == '__main__':lon = 116.2446370442708300lat = 40.0670713975694400x, y = lonLat_to_gauss(lon, lat)print('x, y: ', x, y)lat_t, lon_t = gauss_to_lonLat(x, y)print('lon_t, lat_t: ', lon_t, lat_t)'''這里要注意pyproj的轉換會交換x/y返回,可以對比osgeo使用打印結果看出來,詳細了解可以參考官網文檔:https://pyproj4.github.io/pyproj/stable/api/transformer.html'''lon_t = 116.2446370442708300lat_t = 40.0670713975694400x_t, y_t = lonLat_to_gauss_proj(lon_t, lat_t)gauss_to_lonLat_proj(x_t, y_t)

運行截圖:

?四、下載地址:
你也可以直接從github上下載文中代碼:https://github.com/toby-King/MapFormat

————————————————
版權聲明:本文為CSDN博主「ISmileLi」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/toby54king/article/details/117599464

總結

以上是生活随笔為你收集整理的【转载】osgeo和pyproj:经纬度坐标和高斯坐标互相转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。