python gis 经纬度 库_入门-Python-GIS坐标转换
前言
做GIS數據處理的同仁,不可避免的都會遇到坐標轉換的問題,也許很多人遇到該問題,馬上會使用各類GIS坐標轉換的工具軟件,甚至是GIS平臺,比如ArcGIS,其實除非代轉數據是未知坐標系(必須通過控制點進行配準),只要是已知坐標系,都可采用proj4的開源實現來完成批處理轉換,本文即以Python+pyproj來闡述如何進行批處理坐標轉換。
Python
開始之前,提幾句Python這門語言。這門語言像網紅,一夜之間突然變成了全民語言,除了本職程序員,在全民學編程背景下首選都會選擇Python,為什么?Python再次變成一等公民的原因,很大的功勞要算在近幾年日益成熟的機器學習和深度學習平臺,很多平臺(比如TensorFlow)都會支持Python來做開發,而機器學習和人工智能又是未來熱點,因此越來越多非科班的編程人員投身到這個行業,自然而然就會導致Python的興起;
Python是非常容易入門和學習的,以TensorFlow為例,當它支持C++和Python的情況下,二選一,對于一個非科班人士,答案顯而易見;
Python的出身是什么,就是主打數據批處理,而這點是提高生產效率的關鍵,除了IT,任何傳統行業在日常工作中越來越多的需要進行數據處理尤其是批處理,當Excel完成不了時,也許Python是可能的出路。注意:Python并非唯一出路,例如坐標轉換,當然也有java,.net,javascript(proj4.js)對應的proj4類庫實現,這里不多贅述。
環境搭建
如果是從無到有的搭建步驟如下:Python安裝,推薦Python3以上,當前Python37(與Python27,有大量不兼容的函數和API,注意ArcGIS10.X平臺安裝,默認會安裝Python27,但不會沖突)官網
IDE環境安裝,推薦VS Code(Free),Pycharm(Buy)。
在VS Code下,安裝Python擴展。
設置VS Code對應的Python編譯器,此步在安裝有多個Python版本編譯器時,必須。
安裝pyproj類庫,pip3 install pyproj。
應用場景
為了說明如何利用proj4來完成批處理轉換,暫將場景設置如下:
記錄一組當地坐標系的坐標的文本文件(此處暫考慮文本文件,其實只要是有格式說明的或白皮書的GIS格式,都可以采用批處理來完成,只不過添加相應的格式讀取類庫來進行數據預處理,比如shp,geojson等等,選擇文本文件的原因,是本文關注點是坐標轉換。),如何將這組坐標疊加到高德地圖上?(高德地圖其實是web mercator,但按國測局要求進行了偏移,網絡上大家稱為國測局gcj02)
坐標轉換流程
地方坐標系->WGS84->WGS84偏移(GCJ02 經緯度)->Web Mercator偏移(GCJ02 投影后平面坐標,這步其實可選)
腳本代碼
import os
from pyproj import CRS
from pyproj import Transformer
from converter import wgs84_to_gcj02 #參見注意事項
input_file = './input.txt'
output_file = './output.txt'
#當地坐標系轉WGS84
from_crs = CRS.from_wkt('PROJCS["local",GEOGCS["GCS_Xian_1980",DATUM["D_Xian_1980",SPHEROID["Xian_1980",6378140.0,298.257]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",135005.0014],PARAMETER["False_Northing",-1999781.9795],PARAMETER["Central_Meridian",109.75],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]')
to_crs = CRS.from_epsg(4326)
transformer = Transformer.from_crs(from_crs, to_crs, always_xy=True)
#WGS84轉Web Mercator
from_crs_2 = CRS.from_epsg(4326)
to_crs_2 = CRS.from_epsg(3857)
transformer_2 = Transformer.from_crs(from_crs_2, to_crs_2, always_xy=True)
with open(output_file, "w") as fo:
with open(input_file, "r") as fi:
while True:
line = fi.readline() # 逐行讀取
if not line:
break
else:
array = line.split(",") # x,y 逗號分隔
x1,y1 = transformer.transform(array[0], array[1]) # 當地坐標系轉WGS84
x2,y2 = wgs84_to_gcj02(x1, y1) # gcj02 坐標偏移
x3,y3 = transformer_2.transform(x2, y2) # WGS84轉Web Mercator
fo.write(",".join(["{:.6f}".format(x3),"{:.6f}".format(y3),'\n'])) # 輸出到新文件
print('All Done!')
注意:此處借用github上WGS84轉GCJ02的Python腳本,請自行下載。
定義坐標系
常用兩種方式:
API: CRS.from_wkt
wkt坐標系描述字符串,適合自定義,也可來源于prj文件。
API: CRS.from_epsg
epsg請查詢epsg官網,可以認為官方給通用坐標系頒發的一個唯一編碼,請記住WGS84為4326,Web Mercator為3857。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python gis 经纬度 库_入门-Python-GIS坐标转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: micropython开发idethon
- 下一篇: python idea控制台中文乱码_p