首页Python【Shapely矢量数据空...

【Shapely矢量数据空间分析】19.Shapely与其他软件的互操作


本系列文章是根据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.wktshapely.wkb模块提供了dumps()loads()函数,它们的工作原理与picklesimplejson模块的对应函数一样。

要将一个几何对象序列化为二进制或文本字符串,请使用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(00)
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属性,同种类型的几何对象的坐标可以作为标准的Pythonxy值数组。

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.01.0]), array('d', [0.01.0]))

3.Python地理接口:

任何提供类似GeoJSONPython地理接口的对象都可以通过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.00.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.00.0)]
  • shapely.geometry.mapping(ob):

从一个几何体或任何实现__geo_interface__的对象中返回一个类似GeoJSON的映射。

例如,使用相同的GeoThing类:

 1>>> from shapely.geometry import mapping
2
3>>> thing = GeoThing({"type""Point""coordinates": (0.00.0)})
4
5>>> m = mapping(thing)
6>>> m
7{'type''Point''coordinates': (0.00.0)}
8
9>>> m["type"]
10'Point'
11
12>>> m["coordinates"]
13(0.00.0)


END

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments