Pythoner GIS 开发里最核心的4个基础组件(理论+实操篇)
文章目录
- 1. GeoPandas
- 2. Shapely
- 3. Fiona
- 4. PyProj
- 5,总结
Geopandas、Shapely、Fiona和 Pyproj 这四个库是 Python GIS 开发里最核心的基础组件,它们关系密切,但分工不同。
1. GeoPandas
- Python 中的 空间数据分析库,相当于 Pandas + GIS 功能。
-
基于 Pandas DataFrame 扩展,支持空间几何数据类型(点、线、面),存储在 geometry 列里。
-
内置与 Shapely、Fiona、Pyproj 紧密结合,完成数据读取、几何计算、坐标转换。
-
支持常见 GIS 格式(Shapefile、GeoJSON、GPKG、PostGIS 等)。
-
与 Matplotlib 集成,可以快速可视化地理数据。
- 用途:
-
读取/保存矢量数据(shp、geojson)
-
空间操作:缓冲区、叠加、裁剪、空间连接
-
属性表操作:类似 Pandas 的数据处理(groupby、merge)
-
快速可视化地图
- 示例:
import geopandas as gpdgdf = gpd.read_file("roads.shp")
print(gdf.head())
gdf.plot()
2. Shapely
- 几何对象与空间运算库。
-
提供 Python 里的几何对象(Point、LineString、Polygon 等)。
-
实现各种 几何操作:缓冲区(buffer)、并集(union)、交集(intersection)、差集(difference)、长度/面积计算。
-
GeoPandas 的 geometry 列底层就是 Shapely 对象。
-
不关心数据存取,只负责几何计算。
- 用途:
-
判断几何关系(相交、包含、相离等)
-
构造复杂几何形状
-
做空间运算,比如缓冲区或空间裁剪
- 示例:
from shapely.geometry import Point, Polygonp = Point(1, 1)
poly = Polygon([(0,0), (2,0), (2,2), (0,2)])
print(poly.contains(p)) # True
buffered = p.buffer(1.0) # 生成圆形缓冲区
3. Fiona
- Python 的 GIS 数据读写库,主要处理矢量数据文件。
-
基于 GDAL/OGR 封装,提供更 Pythonic 的 API。
-
专注于文件 I/O(读取/写入 Shapefile、GeoJSON、GPKG 等)。
-
读取数据时,返回 字典形式(feature),属性和几何分开。
-
GeoPandas 其实就是调用 Fiona 来读写文件。
- 用途:
-
打开 Shapefile/GeoJSON 文件
-
遍历 feature 属性和几何
-
写出新的矢量文件
- 示例:
import fionawith fiona.open("roads.shp") as src:for feature in src:print(feature["properties"], feature["geometry"])
4. PyProj
- Python 的 坐标投影转换库,是 PROJ 库的封装。
-
负责 坐标系定义、投影变换、坐标转换。
-
支持 EPSG 号(如 EPSG:4326 WGS84、EPSG:3857 Web Mercator)。
-
GeoPandas 在 .to_crs() 时,底层就是用 PyProj。
-
可用于批量点坐标的投影转换。
- 用途:
-
经纬度 → 投影坐标 (WGS84 → UTM)
-
坐标系统变换(如 WGS84 → CGCS2000)
-
大地测量计算(测距、测方位角等)
- 示例:
from pyproj import Transformer# WGS84 经纬度 → UTM Zone 33N
transformer = Transformer.from_crs("EPSG:4326", "EPSG:32633", always_xy=True)
lon, lat = 12.4924, 41.8902 # 罗马斗兽场
x, y = transformer.transform(lon, lat)
print(x, y)
5,总结
-
Fiona → 负责 读写 空间数据文件
-
Shapely → 负责 几何对象与空间运算
-
PyProj → 负责 坐标系统与投影转换
-
GeoPandas → 把上面三者结合起来,提供类似 Pandas 的 一站式空间数据处理
举例:读取一个 Shapefile → 转投影 → 做缓冲区 → 保存
import geopandas as gpdgdf = gpd.read_file("roads.shp") # Fiona
gdf = gdf.to_crs(epsg=32640) # PyProj
gdf["buffer"] = gdf.buffer(100) # Shapely
gdf.to_file("roads_buffer.shp") # Fiona
GeoPandas 与 Fiona / Shapely / PyProj 的关系图
Fiona (IO) + Shapely (Geometry) + PyProj (CRS) = GeoPandas (完整 GIS DataFrame)
“人的一生会经历很多痛苦,但回头想想,都是传奇”。