当前位置: 首页 > news >正文

python怎么读shape文件?

一、Shapefile基础概念

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

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

二、Python读取方案详解

1. pyshp库(轻量级首选)
import shapefilesf = 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 gpdgdf = 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 ogrds = 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)
    
http://www.lqws.cn/news/215137.html

相关文章:

  • Java 并发编程系列(上篇):多线程深入解析
  • 高级数据结构与算法期末考试速成记录2
  • 获取环境变量的两种方式:getenv()和environ
  • 【C/C++】STL实现版本为什么比手写版本高?
  • SWE-Dev:开启自主特征驱动软件开发新纪元,重新定义大模型编码能力边界
  • IOS性能优化
  • 【Linux庖丁解牛】—系统文件I/O !
  • Python网页自动化测试,DrissonPage库入门说明文档
  • 从零开始的python学习(七)P102+P103+P104+P105+P106+P107
  • [SNOI2024] 公交线路 题解(观察,点减边容斥,优化trick)
  • 【分销系统商城】
  • Python Robot Framework【自动化测试框架】简介
  • c++ —— 内存管理
  • 人工智能赋能高中学科教学的应用与前景研究
  • ThinkPHP 5.1 中的 error 和 success 方法详解
  • 运行示例程序和一些基本操作
  • |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面
  • PL0语法,分析器实现!
  • STM32开发中,线程启动异常问题排查简述
  • 基于Springboot的宠物领养系统
  • 滚珠螺杆的预压技术是如何提高精度的?
  • Mysql-定时删除数据库中的验证码
  • 理论物理与高等数学的交叉点“规范场”和“纤维丛”
  • 程序代码篇---Python串口
  • 【题解-洛谷】P10448 组合型枚举
  • Cloudflare 免费域名邮箱 支持 Catch-all 无限别名收件
  • A Execllent Software Project Review and Solutions
  • C++课设:实现简易文件加密工具(凯撒密码、异或加密、Base64编码)
  • day24 元组和OS模块
  • 【STM32F1标准库】理论——定时器中的输出比较