from __future__ import division
import pandas as pd
from osgeo import ogr, osr, gdal
import os
def read_shptable(path, colname_list, Ispoint):
"""
获取shp文件中的属性表
:param path: 待获取的shp文件存放地址
:param colname_list: 带获取的shp文件字段名 格式为list
:param Ispoint: 带获取的shp文件是否为点类型 若为点数据则返回shp的位置信息到最后两列 其中最后一列以list存储点位置信息
:return: 获取的shp文件的属性表信息的list格式
"""
# 读取管点shp
ds_street = ogr.Open(path, False) # False - read only, True - read/write
# 获取第一个图层
oLayer = ds_street.GetLayerByIndex(0)
if oLayer == None:
print("获取第%d个图层失败!\n", 0)
# 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空
oLayer.ResetReading()
oFeature = oLayer.GetNextFeature() # 获取下一行属性
shape_paramList = []
while oFeature is not None:
shape_param = oFeature.GetGeometryRef().ExportToWkt()
shape_param_L = oFeature.GetGeometryRef().ExportToJson()
area_in_sq_m = oFeature.GetGeometryRef().GetArea()
# print(area_in_sq_m)
if Ispoint:
point_shape_param_list = [shape_param, eval(shape_param_L)['coordinates'], area_in_sq_m]
else:
point_shape_param_list = []
shape_paramList.append([oFeature.GetFieldAsString(i) for i in colname_list] + point_shape_param_list)
oFeature = oLayer.GetNextFeature()
return shape_paramList
def get_shpcol(path):
"""
获取shp文件中表的列名
:param path: 想获取的shp文件列名 的文件存放地址
:return: 存储shp文件表中列名的list
"""
# 读取管点shp 表中的列名
ds_street = ogr.Open(path, False) # False - read only, True - read/write
# 获取第一个图层
oLayer = ds_street.GetLayerByIndex(0)
if oLayer == None:
print("获取第%d个图层失败!\n", 0)
# 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空
oLayer.ResetReading()
oDefn = oLayer.GetLayerDefn()
iFieldCount = oDefn.GetFieldCount() # 属性表中的变量数
layer = ds_street.GetLayer()
plp = 0
pipline_columns = [] # 管线shp表中的columns
for iField in range(iFieldCount):
oFieldDefn = oDefn.GetFieldDefn(iField)
pipline_columns.append(oFieldDefn.GetNameRef())
return pipline_columns
gdal.SetConfigOption('SHAPE_ENCODING', 'utf8') # 属性表支持中文字段
# layer = ds.CreateLayer(layer_name, srs=srs, geom_type=ogr.wkbPoint,options=["ENCODING=GBK"]) # 生成中文编码shp
l_shp_path = "我的shp文件.shp"
line_shp_col = get_shpcol(l_shp_path) # 获取线shp属性表中的列名
pipline_list = read_shptable(l_shp_path, line_shp_col, True) # 以list格式获取线shp属性表所需要的信息
pipline_df = pd.DataFrame(pipline_list, columns=line_shp_col+["polygon", "polygon_list", "area"]) # 管线shp属性表信息转为df格式
python使用gdal读取shp文件
于 2023-02-02 12:00:04 首次发布
该代码段主要涉及从SHP文件中读取属性表和几何信息,特别是点类型的数据。通过`ogr`,`osr`,`gdal`库处理GIS数据,使用`pandas`将数据转换为DataFrame格式。函数`read_shptable`获取指定字段的属性信息以及几何形状(面积和坐标),而`get_shpcol`则用于提取SHP文件的列名。
摘要由CSDN通过智能技术生成