>>> 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()
:返回质心的GeoSeriesrepresentative_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();
目前,带有国界的名为“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: >
注意: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'}