python怎么读shape文件?

一、Shapefile基础概念

Shapefile是GIS领域标准矢量格式,由ESRI开发,包含三个核心文件:

  • .shp:存储几何要素(点/线/面)
  • .shx:几何索引文件
  • .dbf:属性数据表
    需保证同名文件在同一目录(如roads.shp, roads.shx, roads.dbf)。

二、Python读取方案详解

1. pyshp库(轻量级首选)
import shapefile

sf = shapefile.Reader("data/rivers.shp")  # 读取文件

# 获取元数据
print(sf.shapeType)  # 几何类型(1=点,3=线,5=面)
print(sf.bbox)       # 地理范围 [minX, minY, maxX, maxY]

# 遍历几何要素
shapes = sf.shapes()
for i, shape in enumerate(shapes):
    points = shape.points  # 坐标列表 [(x1,y1), (x2,y2)...]
    parts = shape.parts    # 多部件索引(如岛屿多边形)
    # 示例:打印第一条线的首点坐标
    if i == 0: 
        print("首点坐标:", points[0])

# 读取属性表
records = sf.records()
for rec in records:
    print(rec["NAME"], rec["LENGTH_KM"])  # 字段名需实际存在
2. geopandas库(数据分析推荐)
import geopandas as gpd

gdf = gpd.read_file("data/countries.shp")  # 自动解析几何+属性

# 核心操作
print(gdf.head())          # 查看前5行数据
print(gdf.crs)            # 坐标系(如EPSG:4326)
gdf.plot()                # 自动绘制地图

# 属性查询
asia = gdf[gdf["CONTINENT"] == "Asia"]  # 筛选亚洲国家
asia.to_file("asia.gpkg", driver="GPKG")  # 导出为GeoPackage
3. GDAL/OGR库(高性能专业级)
from osgeo import ogr

ds = ogr.Open("data/lakes.shp")
layer = ds.GetLayer(0)  # 获取第一层

# 遍历要素
for feat in layer:
    geom = feat.GetGeometryRef()  # 几何对象
    name = feat.GetField("NAME")  
    if geom.GetGeometryType() == ogr.wkbPolygon:
        area = geom.Area()  # 计算多边形面积
        print(f"{name}: {area:.2f} km²")

# 读取空间参考
spatial_ref = layer.GetSpatialRef()
print(spatial_ref.ExportToWkt())  # 输出WKT格式坐标系

三、关键问题解决方案

  1. 中文路径/乱码处理

    # pyshp
    sf = shapefile.Reader("中文/道路.shp", encoding="gbk")
    
    # GDAL
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
    gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")
    
  2. 批量读取大型文件

    # 分块读取降低内存
    with shapefile.Reader("large_file.shp") as sf:
        for i in range(0, len(sf), 1000):  # 每次处理1000条
            batch = sf.shapeRecords()[i:i+1000]
            for rec in batch:
                process(rec.shape, rec.record)
    
  3. 坐标系转换

    # geopandas示例
    gdf = gdf.to_crs("EPSG:3857")  # 转Web墨卡托投影
    

四、工具对比与选型建议

安装命令适用场景优势
pyshppip install pyshp轻量读取/基础操作无依赖、API简单
geopandaspip install geopandas空间分析/数据清洗集成pandas,支持空间运算
GDALpip install GDAL专业GIS开发/坐标系转换支持格式多,功能强大

💡 选型建议

  • 快速查看数据 → pyshp
  • 数据分析/可视化 → geopandas
  • 坐标转换/格式处理 → GDAL

五、进阶技巧

  1. 写入Shapefile

    # pyshp写入示例
    w = shapefile.Writer("new_data.shp", shapeType=shapefile.POLYLINE)
    w.field("ROAD_ID", "N")  # 添加数字字段
    w.line([[[102, 35], [103, 36]]])  # 添加线段
    w.record(101)  # 对应属性
    w.close()
    
  2. 空间计算

    # geopandas计算缓冲区
    rivers = gpd.read_file("rivers.shp")
    buffered = rivers.geometry.buffer(0.01)  # 创建1km缓冲区
    
  3. 可视化强化

    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    gdf.plot(ax=ax, column="GDP", legend=True, cmap="viridis")
    plt.savefig("map.png", dpi=300)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几道之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值