本系列文章是根据Shapely
官方文档翻译整理,学习任何一个Python第三方库,其官方文档都是最好的学习资料。相比网络搜索得到的一些资料,官方文档是权威的一手资料,其内容全面、准确可靠。通过官方文档入手,能够保证学习认知不会有大偏差。在学习完官方文档后,可以在寻找其他资料进一步学习。
点击“阅读原文”或者直接访问下方链接,查看翻译整理的“Shapely 2.0.0 中文文档”。
https://www.mizhushare.com/docs/shapely-2-0-0-%e4%b8%ad%e6%96%87%e6%96%87%e6%a1%a3/
-
可以通过百度网盘获取,需要在本地配置代码运行环境:
链接:https://pan.baidu.com/s/1iWGGhB4kra9V7bUj-CWR0w?pwd=mnsj
提取码:mnsj
-
前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Shapely
Shapely
还支持地图投影和其他对几何对象的变换操作。-
shapely.ops.transform(func, geom):
将func
应用于geom
的所有坐标(将x
, y
,和可选的z
映射到输出xp
, yp
, zp
),并根据转换后的坐标返回一个相同类型的新几何对象。
输入参数可以是可迭代的类型,如列表或数组或单个值。输出应是相同的类型:标量输入,标量输出;列表输入,列表输出。
transform
试图通过首先调用func
的n
个坐标迭代变量来确定传递的是哪种函数,其中n
是输入几何对象的维度。如果func
在以迭代变量作为参数调用时引发了TypeError
,那么它将在几何对象中的每个坐标上调用func
。
1>>> from shapely.ops import transform
2
3# 定义一个简单的函数:仅对几何对象的x、y坐标值加1
4>>> def id_func(x , y , z=None):
5... # filter(function or None, iterable)
6... # function:函数,作用是对iterable中的每个元素判断是否符合特定条件。
7... # None:不调用任何函数,只对可迭代对象中的元素本身判断真假,保留为真的元素。
8... return tuple(filter(None , [x+1 , y+1 , z]))
9...
10
11>>> g1 = Point(1,1)
12>>> g2 = transform(id_func , g1)
13>>> list(g2.coords)
14[(2.0, 2.0)]
15
16# 包含z的几何对象
17>>> g1 = Point(1,1,1)
18>>> g2 = transform(id_func , g1)
19>>> list(g2.coords)
也可以直接传递Lambda
表达式:
1>>> g2 = transform(lambda x, y, z=None : (x+1.0, y+1.0), g1)
2>>> list(g2.coords)
3[(2.0, 2.0)]
可以通过transform
投影几何图形:
如果使用pyproj>=2.1.0
,投影几何图形的首选方法是:
需要注意的是,在下面的例子中,需要always_xy参数,因为Shapely只支持X、Y顺序的坐标,而在PROJ6中,WGS84 CRS使用EPSG定义的Lat/Lon坐标顺序,而不是预期的Lon/Lat。
1>>> import pyproj
2
3>>> wgs84_pt = Point(-72.2495, 43.886)
4
5>>> wgs84 = pyproj.CRS('EPSG:4326')
6>>> utm = pyproj.CRS('EPSG:32618')
7
8>>> project = pyproj.Transformer.from_crs(wgs84, utm, always_xy=True).transform
9>>> utm_point = transform(project, wgs84_pt)
10>>> print(utm_point)
11POINT (720944.1103566973 4862889.031679545)
如果使用 pyproj < 2.1
,可以是使用以下方式:
1>>> from functools import partial
2>>> import pyproj
3
4>>> from shapely.ops import transform
5
6>>> wgs84 = pyproj.Proj(init='epsg:4326')
7>>> utm = pyproj.Proj(init='epsg:32618')
8
9>>> project = partial(
10... pyproj.transform,
11... wgs84,
12... utm)
13
14>>> utm_point = transform(project, wgs84_pt)
15>>> print(utm_point)
16POINT (720944.1103566973 4862889.031679545)
END
本篇文章来源于微信公众号: 码农设计师