使用GeoPandas/Fiona读取shapefile中polyline ZM的M值方法问询
解决方案
方案1:升级依赖库(最简单)
- Fiona 1.9.0及以上版本、GeoPandas 0.12.0及以上版本已经原生支持读取Shapefile的M值,不需要额外配置
- 升级命令:
pip install --upgrade geopandas fiona
- 验证读取成功后,可以通过
geom.has_m属性判断是否包含M值,通过geom.coords获取带Z、M的坐标元组,示例代码:
import geopandas as gpd gdf = gpd.read_file("你的道路数据.shp") # 查看第一个几何的坐标,会返回(x,y,z,m)的四元组 print(gdf.geometry.iloc[0].coords[:]) # 验证M值存在 print(gdf.geometry.iloc[0].has_m)
注意:1.8.x及更早版本的Fiona默认开启M值过滤,即使底层GDAL支持读取M值,上层接口也会自动丢弃M维度信息。如果不能升级版本,可以手动指定读取参数:
import fiona import geopandas as gpd with fiona.open("你的道路数据.shp", "r", include_m=True) as src: gdf = gpd.GeoDataFrame.from_features(src, crs=src.crs)
方案2:使用GDAL Python API读取
如果不想调整现有依赖版本,可以直接调用GDAL的Python接口读取,示例代码:
from osgeo import ogr # 打开Shapefile driver = ogr.GetDriverByName("ESRI Shapefile") ds = driver.Open("你的道路数据.shp", 0) layer = ds.GetLayer() features = [] geoms = [] for feature in layer: # 获取属性 attrs = feature.items() # 获取几何 geom = feature.GetGeometryRef() # 提取带M值的坐标 coords = [] for i in range(geom.GetPointCount()): # GetPoint(i)返回(x,y,z),GetM(i)获取对应点的M值 x, y, z = geom.GetPoint(i) m = geom.GetM(i) coords.append((x,y,z,m)) # 可自行转为shapely几何或者保留坐标列表 features.append(attrs) geoms.append(coords)
方案3:使用pyshp库读取
pyshp是纯Python实现的Shapefile读写库,原生支持ZM几何类型,不需要依赖GDAL,安装使用都很轻量:
- 安装命令:
pip install pyshp
- 读取示例:
import shapefile with shapefile.Reader("你的道路数据.shp") as r: # 查看几何类型,会返回POLYLINEZM的标识 print(r.shapeTypeName) # 读取所有几何的坐标 for shape in r.iterShapes(): # shape.points是(x,y)列表,shape.z是z值列表,shape.m是M值列表 # 组合成(x,y,z,m)四元组 coords_with_zm = list(zip( [p[0] for p in shape.points], [p[1] for p in shape.points], shape.z, shape.m )) print(coords_with_zm)
内容的提问来源于stack exchange,提问作者Lucas Yu
相关产品推荐
相关产品推荐

