翼度科技»论坛 编程开发 python 查看内容

pyproj运行效率优化

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
介绍

pyproj是一个常用的地理坐标转换python库,它其实是对proj库的python封装,底层调用proj这个c++库。当我们对大规模地理数据执行坐标转换时,需要尽可能提高pyproj的运行效率,否则会浪费大量时间。下面介绍一些常用的方法,可有效提高pyproj运行效率。
方法

首先import pyproj
  1. import pyproj
  2. from pyproj import Transformer
复制代码
这里以WSG84地理坐标转UTM北纬51分带投影坐标为例
  1. EPSG_WGS84 = 4326
  2. EPSG_WGS84_UTM_51N = 32651
复制代码
1. 使用全局变量

使用下面的函数每次执行坐标转换都会new一个transformer对象,函数运行结束则销毁对象并回收内存,内存不断重复分配与回收对程序运行效率影响较大。
  1. def lonlat_to_xy(lon, lat, epsg=EPSG_WGS84_UTM_51N):
  2.     """
  3.     输入经度和纬度,返回x和y(单位:m)
  4.     """
  5.     transformer = Transformer.from_crs("epsg:{}".format(EPSG_WGS84), "epsg:{}".format(target_epsg), always_xy=True)
  6.     return transformer.transform(lon, lat)
复制代码
我们使用全局变量来避免这一问题。全局变量初始化可以设置area_of_interest参数,含义为当前所关注的坐标经纬度范围,能进一步提高计算效率。
  1. DEFAULT_TRANS = Transformer.from_crs("epsg:{}".format(EPSG_WGS84), "epsg:{}".format(EPSG_WGS84_UTM_51N), always_xy=True,
  2.                                 area_of_interest=AreaOfInterest(119.504167, 31.093677, 120.610871, 32.005928))
  3. def lonlat_to_xy(lon, lat, epsg):
  4.     if epsg == EPSG_WGS84_UTM_51N:
  5.         return DEFAULT_TRANS.transform(lat, lon)
  6.     transformer = Transformer.from_crs("epsg:{}".format(EPSG_WGS84), "epsg:{}".format(epsg))
  7.     return transformer.transform(lon, lat)
复制代码
2. 开启gloabal_context

如果代码确定为单线程执行,可以设置global_context为true。
  1. pyproj.set_use_global_context(active=True)
复制代码
3. 批量计算,少用循环

直接输入坐标数组批量计算,不要在循环体内对单个点进行坐标转换。
  1. lngs = [119.50, 119.51, 119.52, 119.49, 119.50]
  2. lats = [31.09, 31.10, 31.08, 31.00, 31.04]
  3. xx, yy = lonlat_to_xy(lngs, lats, EPSG_WGS84_UTM_51N)
复制代码
参考


来源:https://www.cnblogs.com/greyxy/p/17649111.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具