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