python使用gdal读取shp文件

该代码段主要涉及从SHP文件中读取属性表和几何信息,特别是点类型的数据。通过`ogr`,`osr`,`gdal`库处理GIS数据,使用`pandas`将数据转换为DataFrame格式。函数`read_shptable`获取指定字段的属性信息以及几何形状(面积和坐标),而`get_shpcol`则用于提取SHP文件的列名。
摘要由CSDN通过智能技术生成
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格式

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要解决GDAL读取Shapefile文件后输出中文乱码的问题,可以通过设置合适的编码来处理。下面是一个示例代码,演示如何使用GDAL读取Shapefile文件并正确处理中文字符: ```python from osgeo import ogr # 打开Shapefile dataset = ogr.Open('input_shapefile.shp', 0) layer = dataset.GetLayer() # 获取属性编码 layer_encoding = layer.GetLayerDefn().GetFieldDefn(0).GetEncoding() # 设置输出编码 output_encoding = 'utf-8' # 遍历要素并输出属性值 for feature in layer: for i in range(feature.GetFieldCount()): field_value = feature.GetField(i) # 解码属性值为Unicode字符串 field_value_unicode = field_value.decode(layer_encoding) # 编码为指定输出编码的字符串 field_value_encoded = field_value_unicode.encode(output_encoding) # 输出属性值 print(field_value_encoded) # 关闭数据集 dataset = None ``` 在上述代码中,我们首先通过`GetLayerDefn()`方法获取属性的编码,并将其保存在`layer_encoding`变量中。然后,我们将输出编码设置为`utf-8`,可以根据需要修改为其他编码。接下来,我们遍历要素并使用`decode()`方法将属性值解码为Unicode字符串,然后使用`encode()`方法将其编码为指定的输出编码字符串。最后,我们使用`print()`语句输出属性值。 请将`input_shapefile.shp`替换为您要读取的Shapefile文件路径。如果您的Shapefile文件使用了其他编码,请在`layer.GetLayerDefn().GetFieldDefn(0).GetEncoding()`中指定正确的编码。 希望这可以解决您的问题!如果您有任何进一步的疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值