首页软件基础教程GeoPandas【GeoPandas空间数...

【GeoPandas空间数据分析】2.GeoPandas数据结构——GeoSeries


本系列文章是根据GeoPandas官方文档翻译整理,学习任何一个Python第三方库,其官方文档都是最好的学习资料。相比网络搜索得到的一些资料,官方文档是权威的一手资料,其内容全面、准确可靠。通过官方文档入手,能够保证学习认知不会有大偏差。在学习完官方文档后,可以在寻找其他资料进一步学习。

点击“阅读原文”或者直接访问下方链接,查看翻译整理的“GeoPandas 0.12.2 中文文档”。

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/185Qs6RpVhyP2nm9VV39Ehw?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/geopandas




GeoPandas实现了两个主要的数据结构,GeoSeriesGeoDataFrame。它们分别是 pandas.Seriespandas.DataFrame的子类。

GeoSeries本质上是一个向量,向量中的每一个条目都是一组对应于一个观测值的形状。一个条目可能由一个形状组成(比如一个多边形面),也可能由多个形状组成。

GeoPandas具有如下三类基本的几何对象(实际上是shapely对象):

  • Points / Multi-Points

  • Lines / Multi-Lines

  • Polygons / Multi-Polygons。

需要注意的是,GeoSeries所包含的条目不需要具有相同的几何类型,但是可能会导致一些操作失败。
01
实例化GeoSeries对象

GeoSeries所包含的条目具有相同的几何类型:

 1# 几何对象--点
2>>> gpoint = gpd.GeoSeries([Point(i ,i+2) for i in range(5)])
3>>> gpoint
40    POINT (0.00000 2.00000)
51    POINT (1.00000 3.00000)
62    POINT (2.00000 4.00000)
73    POINT (3.00000 5.00000)
84    POINT (4.00000 6.00000)
9dtype: geometry
10
11>>> gpoint.plot()

可视化结果如下图所示:

1# 几何对象——线
2>>> gline = gpd.GeoSeries([LineString([(i,i),(i+4,i+2)]) for i in range(5)])
3>>> gline
4
5>>> gline.plot()

可视化结果如下图所示:

1# 几何对象——面
2>>> gpolygon = gpd.GeoSeries(Polygon([(i,i) , (i+4,i+2) , (6,0)]) for i in range(5))
3>>> gpolygon
4
5>>> gpolygon .plot(alpha=0.5# 设置透明度=0.5

可视化结果如下图所示:

GeoSeries所包含的条目也可以是不同的几何类型:

 1# 几何对象--点+线+面
2>>> gm = gpd.GeoSeries([Point(0,0),
3...                     LineString([(1,1) , (6,3)]),
4...                    Polygon([(2,3),(6,5),(3,6)])])
5>>> gm
60                              POINT (0.00000 0.00000)
71        LINESTRING (1.00000 1.000006.00000 3.00000)
82    POLYGON ((2.00000 3.000006.00000 5.000003....
9dtype: geometry
10
11>>> gm.plot()

可视化结果如下图所示:

GeoSeries类实现了Shapely对象中几乎所有的属性和方法。当应用于 GeoSeries时,会将按元素应用于所有几何图形。可以在两个 GeoSeries之间应用二元操作,在这种情况下,操作是按元素执行的。这两个GeoSeries将通过匹配索引对齐。二元操作也可以应用于单个几何,在这种情况下,将对具有该几何的系列中的每个元素执行运算。在任何一种情况下,都会根据需要返回 Series 或 GeoSeries

下面是一些 GeoSeries的属性和方法,完整列表可在官方文档页面中找到。

1https://geopandas.org/en/stable/docs/reference/geoseries.html

此外,还有一系列方法可以通过扩展现有形状或应用集合论操作(如几何操作中描述的“联合”)来创建新形状。

02
属性

一些常用属性如下:

  • GeoSeries.x: 点的x坐标。
  • GeoSeries.y: 点的y坐标。
  • GeoSeries.length: 形状长度。
  • GeoSeries.area: 形状面积。
  • GeoSeries.bounds: 每个形状的每个轴上的最大和最小坐标组成的元组。
  • GeoSeries.boundary: 返回一个代表每个几何体的集合理论边界的低维GeoSeries。
  • GeoSeries.geom_type: 几何类型。

1# 获取点的x坐标
2>>> gpoint.x
30    0.0
41    1.0
52    2.0
63    3.0
74    4.0
8dtypefloat64
9
10# 获取线段长度
11>>> gline.length
120    4.472136
131    4.472136
142    4.472136
153    4.472136
164    4.472136
17dtypefloat64
18
19# 获取面的面积
20>>> gpolygon.area
210     6.0
221     7.0
232     8.0
243     9.0
254    10.0
26dtypefloat64
27
28# 获取面的边界
29>>> gpolygon.bounds
30   minx  miny  maxx  maxy
310   0.0   0.0   6.0   2.0
321   1.0   0.0   6.0   3.0
332   2.0   0.0   6.0   4.0
343   3.0   0.0   7.0   5.0
354   4.0   0.0   8.0   6.0
36
37# 获取每个几何对象的类型
38>>> gm.geom_type
390         Point
401    LineString
412       Polygon
42dtypeobject
43
44# 获取每个几何体的边界
45>>> gm.boundary
460                             GEOMETRYCOLLECTION EMPTY
471        MULTIPOINT (1.00000 1.00000, 6.00000 3.00000)
482    LINESTRING (2.00000 3.00000, 6.00000 5.00000, ...
49dtypegeometry


03
方法

  • distance(): 计算最小距离。
  • centroid:计算质心点。
  • convex_hull:包含对象中所有点的最小凸包。
  • envelope: 包含该对象的点或最小的外包矩形(边与坐标轴平行)。
  • representative_point(): 返回保证在每个几何图形中的点,不返回质心。
  • to_crs(): 改变坐标参考系。
  • plot(): 绘图。

  • centroid:

1centroid: 计算质心点
2>>> gpolygon.centroid
30    POINT (3.33333 0.66667)
41    POINT (4.00000 1.33333)
52    POINT (4.66667 2.00000)
63    POINT (5.33333 2.66667)
74    POINT (6.00000 3.33333)
8dtypegeometry

结果如下图所示:

  • distance():

1# distance(): 计算最小距离
2>>> gpoint
30    POINT (0.00000 2.00000)
41    POINT (1.00000 3.00000)
52    POINT (2.00000 4.00000)
63    POINT (3.00000 5.00000)
74    POINT (4.00000 6.00000)
8dtype: geometry
9
10>>> point = Point(0,4)
11
12>>> gpoint.distance(point)
130    2.000000
141    1.414214
152    2.000000
163    3.162278
174    4.472136
18dtype: float64

几何对象的相对关系图如下图所示:

  • buffer()、convex_hull()、envelope():

1>>> x = np.random.randn(20)
2>>> y = np.random.randn(20)
3>>> gpoints = gpd.GeoSeries(MultiPoint(list(zip(x,y))))
4>>> gpoints
50    MULTIPOINT (0.90928 0.06214, -0.66392 -0.49282...
6dtype: geometry
7
8# 缓冲区分析
9>>> gpoints.buffer(0.5)
100    MULTIPOLYGON (((3.24204 0.09461, 3.23963 0.045...
11dtype: geometry
12
13# 最小凸包
14>>> gpoints.convex_hull
150    POLYGON ((1.53592 -1.20652, -0.48794 -1.18227,...
16dtype: geometry
17
18# 最小外包矩形(边与坐标轴平行)
19>>> gpoints.envelope
200    POLYGON ((-1.78206 -1.206522.74204 -1.20652,...
21dtype: geometry

结果如下图所示:


03
关系判断

  • geom_almost_equals(other): 形状与其他形状几乎相同(浮点精度问题使形状略有不同时使用)。

  • contains(other): 形状是否包含在other内。

  • intersects(other): 形状是否与other相交。

1>>> gpolygon = gpd.GeoSeries(Polygon([(i,i) , (i+4,i+2) , (6,0)]) for i in range(5))
2>>> gpolygon
30    POLYGON ((0.00000 0.000004.00000 2.000006....
41    POLYGON ((1.00000 1.000005.00000 3.000006....
52    POLYGON ((2.00000 2.000006.00000 4.000006....
63    POLYGON ((3.00000 3.000007.00000 5.000006....
74    POLYGON ((4.00000 4.000008.00000 6.000006....
8dtype: geometry
9>>> point = Point(6.5,4)
10>>> line = LineString([(0,4) , (8,4)])
11
12# contains
13>>> gpolygon.contains(point)
140    False
151    False
162    False
173     True
184     True
19dtype: bool
20
21# intersects
22>>> gpolygon.intersects(point)
230    False
241    False
252    False
263     True
274     True
28dtype: bool

几何对象的相对关系图如下图所示:


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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments