通過一張圖描述清楚TuGraph Analytics的整體架構和關鍵設計,幫助大家快速瞭解TuGraph Analytics項目輪廓。 ...
介紹
pyproj是一個常用的地理坐標轉換python庫,它其實是對proj庫的python封裝,底層調用proj這個c++庫。當我們對大規模地理數據執行坐標轉換時,需要儘可能提高pyproj的運行效率,否則會浪費大量時間。下麵介紹一些常用的方法,可有效提高pyproj運行效率。
方法
首先import pyproj
import pyproj
from pyproj import Transformer
這裡以WSG84地理坐標轉UTM北緯51分帶投影坐標為例
EPSG_WGS84 = 4326
EPSG_WGS84_UTM_51N = 32651
1. 使用全局變數
使用下麵的函數每次執行坐標轉換都會new一個transformer對象,函數運行結束則銷毀對象並回收記憶體,記憶體不斷重覆分配與回收對程式運行效率影響較大。
def lonlat_to_xy(lon, lat, epsg=EPSG_WGS84_UTM_51N):
"""
輸入經度和緯度,返回x和y(單位:m)
"""
transformer = Transformer.from_crs("epsg:{}".format(EPSG_WGS84), "epsg:{}".format(target_epsg), always_xy=True)
return transformer.transform(lon, lat)
我們使用全局變數來避免這一問題。全局變數初始化可以設置area_of_interest參數,含義為當前所關註的坐標經緯度範圍,能進一步提高計算效率。
DEFAULT_TRANS = Transformer.from_crs("epsg:{}".format(EPSG_WGS84), "epsg:{}".format(EPSG_WGS84_UTM_51N), always_xy=True,
area_of_interest=AreaOfInterest(119.504167, 31.093677, 120.610871, 32.005928))
def lonlat_to_xy(lon, lat, epsg):
if epsg == EPSG_WGS84_UTM_51N:
return DEFAULT_TRANS.transform(lat, lon)
transformer = Transformer.from_crs("epsg:{}".format(EPSG_WGS84), "epsg:{}".format(epsg))
return transformer.transform(lon, lat)
2. 開啟gloabal_context
如果代碼確定為單線程執行,可以設置global_context為true。
pyproj.set_use_global_context(active=True)
3. 批量計算,少用迴圈
直接輸入坐標數組批量計算,不要在迴圈體內對單個點進行坐標轉換。
lngs = [119.50, 119.51, 119.52, 119.49, 119.50]
lats = [31.09, 31.10, 31.08, 31.00, 31.04]
xx, yy = lonlat_to_xy(lngs, lats, EPSG_WGS84_UTM_51N)