在開(kāi)始之前,有必要了解一下相關(guān)名詞:
關(guān)于地理坐標(biāo)系和投影坐標(biāo)系更詳細(xì)的解釋可以查看這篇文章:你必須知道的地理坐標(biāo)系和投影坐標(biāo)系
地理坐標(biāo)系統(tǒng)有不同的基準(zhǔn)和方法,比如:Xian_1980,Beijing_1954,WGS_1984等。投影坐標(biāo)系統(tǒng)也有不同的基準(zhǔn)和方法,UTM和UPS等。每一個(gè)地理坐標(biāo)系統(tǒng)(GCS)和投影坐標(biāo)系統(tǒng)(PCS)都有一個(gè)獨(dú)特的EPSG代碼,代碼可在 EPSG 網(wǎng)站查詢。
有一篇介紹Pyproj進(jìn)行地理投影坐標(biāo)系轉(zhuǎn)換的文章3,但不夠全面。其中提到arcgis網(wǎng)站上查詢 地理坐標(biāo)系 和 投影坐標(biāo)系 的方法很實(shí)用但不全。
整理使用Python的第三方庫(kù) Pypro4 轉(zhuǎn)換經(jīng)緯度表示的地理坐標(biāo)系統(tǒng)和米(或千米等其他單位)表示的投影坐標(biāo)系統(tǒng)。
Pypro模塊共有兩個(gè)函數(shù):
函數(shù) | 描述 |
---|---|
test() | 運(yùn)行模塊測(cè)試 |
transform(p1, p2, x, y, z=None, radians=False) | 用法:x2, y2, z2 = transform(p1, p2, x1, y1, z1, radians=False),將在坐標(biāo)系統(tǒng)p1下的點(diǎn)(x1, y1, z1)轉(zhuǎn)換到p2坐標(biāo)系統(tǒng)下 |
轉(zhuǎn)換經(jīng)緯度到的投影坐標(biāo)系統(tǒng);轉(zhuǎn)換一個(gè)投影坐標(biāo)系統(tǒng)到另一個(gè)投影坐標(biāo)系統(tǒng);反向轉(zhuǎn)換,把投影坐標(biāo)系統(tǒng)上的點(diǎn)轉(zhuǎn)換到地理坐標(biāo)系統(tǒng):
>>> p1 = pyproj.Proj(init='epsg:26915') # 一個(gè)投影坐標(biāo)系統(tǒng)EPSG Code>>> p2 = pyproj.Proj(init='epsg:26715') # 另一個(gè)投影坐標(biāo)系統(tǒng)EPSG Code>>> x1, y1 = p1(-92.199881,38.56694) # 投影到EPSG Code為26915的投影坐標(biāo)系統(tǒng)>>>> '%9.3f %11.3f' % (x1,y1)'569704.566 4269024.671'>>> x2, y2 = pyproj.transform(p1,p2,x1,y1) # 轉(zhuǎn)換一個(gè)投影坐標(biāo)系統(tǒng)到另一個(gè)投影坐標(biāo)系統(tǒng)>>> '%9.3f %11.3f' % (x2,y2)'569722.342 4268814.027'>>> '%8.3f %5.3f' % p2(x2,y2,inverse=True) # 反向轉(zhuǎn)換' -92.200 38.567'
用元組傳入多個(gè)點(diǎn)
>>> lats = (38.83,39.32,38.75) # 所有緯度組成的元組>>> lons = (-92.22,-94.72,-90.37) # 所有精度組成的元組>>> x1, y1 = p1(lons,lats) # 轉(zhuǎn)換經(jīng)緯度到投影坐標(biāo)系統(tǒng)>>> x2, y2 = pyproj.transform(p1,p2,x1,y1) # 轉(zhuǎn)換一個(gè)投影坐標(biāo)系統(tǒng)到另一個(gè)投影坐標(biāo)系統(tǒng)>>> lons, lats = p2(x2,y2,inverse=True) # 反向轉(zhuǎn)換
除了使用EPSG Code之外,還可以顯示指定坐標(biāo)系統(tǒng)名稱
>>> p1 = pyproj.Proj(proj='latlong',datum='WGS84') # WGS84,GPS使用的地理坐標(biāo)系統(tǒng),EPSG Code為4326>>> x1 = -111.5; y1 = 45.25919444444>>> p2 = pyproj.Proj(proj='utm',zone=10,datum='NAD27') # 投影坐標(biāo)系統(tǒng)NAD27 / UTM zone 10N,EPSG Code為26710>>> x2, y2 = pyproj.transform(p1, p2, x1, y1)>>> '%s %s' % (str(x2)[:9],str(y2)[:9])'1402285.9 5076292.4'
如果僅僅是需要把經(jīng)緯度轉(zhuǎn)換為米為單位的話,可直接按照下邊來(lái):
>>> p1 = pyproj.Proj(init='epsg:4326') # 定義數(shù)據(jù)地理坐標(biāo)系 WGS84>>> p2 = pyproj.Proj(init='epsg:3857') # 定義轉(zhuǎn)換投影坐標(biāo)系>>> x, y = pyproj.transform(p1, p2, lon, lat) # lon 和lat 可以是元組
聯(lián)系客服