本系列文章是根据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
内部使用了自建的数据结构和方法,并且提供了4种与其他软件互操作的方式。
Shapely
支持WKT数据格式、Numpy和Python数组、Python地理接口三种主要的数据互操作方法。
1.WKT数据格式:
任何几何对象的文本字符串(WKT
)或二进制(WKB
)表达可以通过其wkt或wkb属性获得。该数据格式可以与许多GIS
程序相互转换。例如,PostGIS
就使用十六进制编码的WKB
。
1>>> Point(0,0).wkt
2'POINT (0 0)'
3
4>>> Point(0,0).wkb
5b'x01x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00'
shapely.wkt
和shapely.wkb
模块提供了dumps()
和loads()
函数,它们的工作原理与pickle
和simplejson
模块的对应函数一样。
要将一个几何对象序列化为二进制或文本字符串,请使用dumps()
。
要反序列化一个字符串并获得一个相同的新几何对象,使用load()
。
wkt
属性和shapely.wkt.dumps()
函数的默认设置是不同的。默认情况下,属性的值会被修剪掉多余的小数,而dumps()
则不是这种情况,不过可以通过设置trim=True
来复制。
函数支持Shapely的所有几何对象类型。
-
shapely.wkb.dumps(ob):
返回几何对象的WKB表达。
-
shapely.wkb.loads(wkb):
从WKB表达返回一个几何对象。
1>>> from shapely import wkb
2
3>>> pt = Point(0,0)
4
5>>> wkb.dumps(pt)
6b'x01x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00'
7
8>>> pt.wkb
9b'x01x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00'
10
11>>> wkb.loads(pt.wkb).wkt
12'POINT (0 0)'
-
shapely.wkt.dumps(ob):
返回几何对象的WKT表达。
-
shapely.wkt.loads(wkt):
从WKT表达返回一个几何对象。
1>>> from shapely import wkt
2
3>>> pt = Point(0, 0)
4
5>>> thewkt = wkt.dumps(pt)
6>>> thewkt
7'POINT (0.0000000000000000 0.0000000000000000)'
8
9>>> pt.wkt
10'POINT (0 0)'
11
12>>> wkt.dumps(pt , trim=True)
13'POINT (0 0)'
2.Numpy和Python数组:
所有具有坐标序列的几何对象(Point
, LinearRing
, LineString
)都提供了Numpy
数组接口,因此可以转换为Numpy
数组。
1>>> import numpy as np
2
3>>> np.asarray(Point(0,0).coords)
4array([[0., 0.]])
5
6>>> np.asarray(LineString([(0,0) , (1,1)]).coords)
7array([[0., 0.],
8 [1., 1.]])
通过xy
属性,同种类型的几何对象的坐标可以作为标准的Python
的x
、y
值数组。
1>>> Point(0,0).xy
2(array('d', [0.0]), array('d', [0.0]))
3
4>>> LineString([(0,0) , (1,1)]).xy
5(array('d', [0.0, 1.0]), array('d', [0.0, 1.0]))
3.Python地理接口:
任何提供类似GeoJSON
的Python
地理接口的对象都可以通过shapely.geometry.shape()
函数转换为Shapely
几何对象。
-
shapely.geometry.shape(context):
返回一个新的、独立的几何对象,其坐标是从context中复制的。
例如,对一个字典对象进行转换:
1>>> from shapely.geometry import shape
2
3>>> data = {"type":"Point" , "coordinates":(0,0)}
4
5>>> geom = shape(data)
6>>> geom
7<POINT (0 0)>
8
9>>> geom.geom_type
10'Point'
11
12>>> list(geom.coords)
13[(0.0, 0.0)]
进一步说明的话,如下所示:
1# 首先建立一个GeoThing类,这个类接收字典参数,并通过 __geo_interface__ 属性返回。
2>>> class GeoThing:
3... def __init__(self , d):
4... self.__geo_interface__ = d
5...
6
7# 进行实例化,生成 thing 对象
8>>> thing = GeoThing({"type":"Point" , "coordinates":(0,0)})
9
10# 通过 shape()函数进行转换
11>>> geom = shape(data)
12>>> geom
13<POINT (0 0)>
14>>> geom.geom_type
15'Point'
16>>> list(geom.coords)
17[(0.0, 0.0)]
-
shapely.geometry.mapping(ob):
从一个几何体或任何实现__geo_interface__
的对象中返回一个类似GeoJSON
的映射。
例如,使用相同的GeoThing
类:
1>>> from shapely.geometry import mapping
2
3>>> thing = GeoThing({"type": "Point", "coordinates": (0.0, 0.0)})
4
5>>> m = mapping(thing)
6>>> m
7{'type': 'Point', 'coordinates': (0.0, 0.0)}
8
9>>> m["type"]
10'Point'
11
12>>> m["coordinates"]
13(0.0, 0.0)
END
本篇文章来源于微信公众号: 码农设计师