GeoPandas主要实现两个主要的数据结构, GeoSeries
和 GeoDataFrame
,分别是 Pandas Series
和 DataFrame
的子类。
import geopandas as gpd
gpd.__version__
'1.0.1'
GeoSeries
本质上是一种向量,向量中的每个条目都对应视图的一组形状。
条目可以由一个形状(如单个多边形)组成或由多个形状组成,这些形状被认为是一个视图(例如构成夏威夷州或印度尼西亚等国家的多边形)。
GeoPandas 有三种基本类型的几何对象(实际上是形状对象),这些概念与通常的GIS所介绍的是一致的。
- 点/点集合
- 线/线集合
- 多边形/多边形集合
看起来 GeoSeries
与常见GIS数据中存储的数据集的概念一样,但是有一处巨大的差别。
传统上一般在数据集中存储同样类型的数据,如城市、河流通常分别用点、线类型的数据存储,
但 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)
:其他相交的形状
数据结构:GeoDataFrame
GeoDataFrame是一个包含GeoSeries的表格数据结构。
GeoDataFrame最重要的属性是它总是具有一个保存特殊状态的GeoSeries列。此GeoSeries称为GeoDataFrame的“几何”。 当空间方法应用于GeoDataFrame(或调用类似区域的空间属性)时,这些方法将始终作用于“几何”列。
“geometry”列可通过 geometry
属性( gdf.geometry
)访问,并且可以通过键入 gdf.geometry.name
的方法找到geometry列名称。
GeoDataFrame还可以包含具有几何(形状)对象的其他列,但每次只能有一个列作为活动式几何。
若更改活动式几何列,可使用 set_geometry()
方法。
使用 worlds GeoDataFrame的示例:
import os
# os.environ['PROJ_LIB'] = '/git/usr/miniforge/envs/python312/share/proj'
import geopandas as gpd
关于数据的读取,在旧版本中自带数据,使用如下函数:
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
但在新版本中已经弃用了 gpd.datasets
模块。
读取数据时需要显式指明路径:
wdata_path = './ne-data/ne_110m_admin_0_countries.shp'
world = gpd.read_file(wdata_path)
world.head()
geometry | |
---|---|
0 | MULTIPOLYGON (((180 -16.06713, 180 -16.55522, ... |
1 | POLYGON ((33.90371 -0.95, 34.07262 -1.05982, 3... |
2 | POLYGON ((-8.66559 27.65643, -8.66512 27.58948... |
3 | MULTIPOLYGON (((-122.84 49, -122.97421 49.0025... |
4 | MULTIPOLYGON (((-122.84 49, -120 49, -117.0312... |
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()
<Axes: >
注意: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。
import fiona
一般来说,read_file很有用的,通常会生成你想要的参数,但如果遇到瓶颈,请输入:
help(fiona.open)
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'}