>>> from env_helper import info; info()
页面更新时间: 2024-03-04 14:24:17
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

11.1. 了解数据结构与数据读写方法

GeoPandas主要实现两个主要的数据结构,GeoSeries和GeoDataFrame,分别是pandas系列和DataFrame的子类。

11.1.1. 数据结构:GeoSeries

GeoSeries本质上是一种向量,向量中的每个条目都对应观察的一组形状。 条目可以由一个形状(如单个多边形)组成或由多个形状组成,这些形状被认为是一个观察(例如构成夏威夷州或印度尼西亚等国家的许多多边形)。

geopandas有三个基本类的几何对象(实际上是形状对象):

  • 点/点集合

  • 线/线集合

  • 多边形/多边形集合

请注意,GeoSeries中的所有条目并不是必须为相同的几何类型,但如果类型不同,可能会导致某些操作失败。

属性和方法概述

GeoSeries 类几乎实现了Shapely对象的所有属性和方法。 当应用于GeoSeries时,它们将以元素方式应用于GeoSeries中的所有几何。 在两个GeoSeries之间可以应用二进制操作,在这种情况下,操作是按元素进行的。 这两个系列将通过匹配索引完成对齐。二进制操作也可以应用于单个几何,在这种情况下,对具有该几何系列的每个元素执行操作。 在任一情况下,将酌情返回一个Series或一个GeoSeries。

此处介绍的只是GeoSeries的几个属性和方法的简短摘要,可在所有属性和方法页面中找到完整列表。还有用于扩展现有形状或应用集合理论的一系列操作(例如几何操作中描述的“联合”)来创建新形状。

属性

  • area :形状面积(投影单位)

  • bounds :每个轴的每个形状的最大与最小坐标元组

  • total_bounds :整个GeoSeries的每个轴上的最大与最小坐标元组

  • geom_type :几何类型。

  • is_valid :测试坐标是否形成合理的几何形状。

基本方法

  • distance(other) :返回每个条目到其他条目最小距离的序列

  • centroid() :返回质心的GeoSeries

  • representative_point() :返回位于每个几何中点的GeoSeries。它不返回质心。

  • to_crs() :更改坐标参考系。

  • plot() :绘制GeoSeries。

关系测试

  • geom_almost_equals(other) :形状几乎和其他的一样(由于浮点精度问题导致的形状略有不同,效果还是不错的)

  • contains(other) :其他包含的形状

  • intersects(other) :其他相交的形状

11.1.2. 数据结构:GeoDataFrame

GeoDataFrame是一个包含GeoSeries的表格数据结构。

GeoDataFrame最重要的属性是它总是具有一个保存特殊状态的GeoSeries列。此GeoSeries称为GeoDataFrame的“几何”。 当空间方法应用于GeoDataFrame(或调用类似区域的空间属性)时,这些方法将始终作用于“几何”列。

“geometry”列可通过 geometry 属性( gdf.geometry )访问,并且可以通过键入 gdf.geometry.name 的方法找到geometry列名称。

GeoDataFrame还可以包含具有几何(形状)对象的其他列,但每次只能有一个列作为活动式几何。 若更改活动式几何列,可使用 set_geometry() 方法。

使用worlds GeoDataFrame的示例:

>>> %matplotlib inline
>>> import geopandas as gpd
>>>
>>> world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
>>> world.head()
pop_est continent name iso_a3 gdp_md_est geometry
0 889953.0 Oceania Fiji FJI 5496 MULTIPOLYGON (((180.00000 -16.06713, 180.00000...
1 58005463.0 Africa Tanzania TZA 63177 POLYGON ((33.90371 -0.95000, 34.07262 -1.05982...
2 603253.0 Africa W. Sahara ESH 907 POLYGON ((-8.66559 27.65643, -8.66512 27.58948...
3 37589262.0 North America Canada CAN 1736425 MULTIPOLYGON (((-122.84000 49.00000, -122.9742...
4 328239523.0 North America United States of America USA 21433226 MULTIPOLYGON (((-122.84000 49.00000, -120.0000...
>>> world.plot();
_images/sec1_data_6_0.png

目前,带有国界的名为“geometry”的列是活动几何列:

>>> world.geometry.name
'geometry'

我们也可以将此列重命名为“borders”:

>>> world = world.rename(columns={'geometry': 'borders'}).set_geometry('borders')
>>>
>>> world.geometry.name
'borders'

现在,我们创建质心并使其成为几何列:

>>> world['centroid_column'] = world.centroid
>>> world = world.set_geometry('centroid_column')
>>> world.plot()
/tmp/ipykernel_128382/3602087863.py:1: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.

  world['centroid_column'] = world.centroid
<AxesSubplot: >
_images/sec1_data_12_2.png

注意:GeoDataFrame可根据名称跟踪活动列,因此若重命名活动几何列,则还必须重置几何项:

gdf = gdf.rename(columns={'old_name': 'new_name'}).set_geometry('new_name')

默认情况下,当您使用 read_file 命令时,文件中的空间对象列在默认情况下被命名为“geometry”,并将其设置为活动几何列。 但是,尽管对列的名称和跟踪活动列的特殊属性名称使用的是相同术语,但其实它们是不同的。 您可以使用 set_geometry 命令将活动几何列转移到不同的GeoSeries。 此外, gdf.geometry 将始终返回活动几何列,而不是返回 geometry 列。 如果想调用“geometry”的列,并且是不同的活动几何列,请使用 gdf['geometry'] ,而不是 gdf.geometry

GeoSeries所描述的任何属性调用或方法都可以在GeoDataFrame上工作,实际上,它们只是应用于“几何”GeoSeries。

11.1.3. 读取空间数据

geopandas可以读取任意基于矢量的空间数据格式,包括ESRI shapefile,GeoJSON文件等命令:

gpd.read_file()

它返回一个GeoDataFrame对象。 (这是可能的,因为geopandas利用的是fiona库,并且利用的是大规模的开源程序GDAL / OGR,以促进空间数据转换)。

read_file() 文件后输出的任何参数将被输出列 fiona.open() 中,其实是数据导入的工作。

>>> import fiona

一般来说,read_file很有用的,通常会生成你想要的参数,但如果遇到瓶颈,请输入:

help(fiona.open)

其中,可以使用 driver 关键字显式设置格式驱动(shapefile,GeoJSON),或者使用 layer 关键字从多层文件中筛选中单个图层。

GeoPandas 也可以使用 read_postgis() 命令从PostGIS数据库中获取数据。

11.1.4. 写入空间数据

GeoDataFrames可以使用 GeoDataFrame.to_file() 方法导出许多不同的标准格式。 若查看支持的完整格式列表,请键入:

>>> import fiona; fiona.supported_drivers
{'DXF': 'rw',
 'CSV': 'raw',
 'OpenFileGDB': 'raw',
 'ESRIJSON': 'r',
 'ESRI Shapefile': 'raw',
 'FlatGeobuf': 'raw',
 'GeoJSON': 'raw',
 'GeoJSONSeq': 'raw',
 'GPKG': 'raw',
 'GML': 'rw',
 'OGR_GMT': 'rw',
 'GPX': 'rw',
 'Idrisi': 'r',
 'MapInfo File': 'raw',
 'DGN': 'raw',
 'PCIDSK': 'raw',
 'OGR_PDS': 'r',
 'S57': 'r',
 'SQLite': 'raw',
 'TopoJSON': 'r'}