首页 > 编程语言 >基于Python与GDAL的栅格转矢量(去边框)、添加缓冲区、简化容差

基于Python与GDAL的栅格转矢量(去边框)、添加缓冲区、简化容差

时间:2024-07-09 10:00:58浏览次数:12  
标签:shp 容差 Python 矢量 栅格 gdf output 缓冲区 input

文章目录

概要

在地理信息系统(GIS)中,栅格数据与矢量数据之间的转换是一项基本且重要的操作。栅格数据通常用于表示连续变化的数据(如温度、海拔等),而矢量数据则更适合表示离散的地理要素(如点、线、面)。此外,为矢量要素添加缓冲区是空间分析中的一个常用功能,它可以帮助我们理解要素周围的空间关系。本文将介绍如何使用Python和GDAL库来实现栅格数据到矢量数据的转换,并为转换后的矢量数据添加缓冲区和简化容差。

整体内容

栅格转矢量
GDAL库中的gdal_polygonize.py脚本可以将栅格数据转换为矢量多边形。这个脚本使用栅格数据的值来创建多边形,其中每个不同的值都会被转换为一个多边形。

示例代码
以下是一个使用GDAL命令行工具(通过Python调用)将栅格数据转换为矢量数据的示例:

def raster_to_vector(input_raster, output_vector):
    raster_ds = gdal.Open(input_raster)
    logging.info(input_raster)
    if raster_ds is None:
        raise ValueError("无法打开输入栅格文件。")

    driver = ogr.GetDriverByName("ESRI Shapefile")
    if driver is None:
        raise ValueError("ESRI Shapefile驱动程序不可用。")

    vector_ds = driver.CreateDataSource(output_vector)
    if vector_ds is None:
        raise ValueError("无法创建输出矢量文件。")

    band = raster_ds.GetRasterBand(1)
    srs = osr.SpatialReference()
    srs.ImportFromWkt(raster_ds.GetProjectionRef())
    layer = vector_ds.CreateLayer("polygon", geom_type=ogr.wkbPolygon, srs=srs)
    field_def = ogr.FieldDefn("value", ogr.OFTInteger)
    layer.CreateField(field_def)

    gdal.FPolygonize(band, None, layer, -1, [], callback=progress_callback)

    # 清理并关闭数据集
    raster_ds = None
    vector_ds = None

矢量去边框(可选)

def find_and_delete_max_id_shp(input_shp, output_shp):
    # 读取输入的 shapefile
    gdf = gpd.read_file(input_shp)
    logging.info(gdf.columns)

    # 找到 ID 最大的行F
    max_id_index = gdf['FID'].idxmax()
    max_id_row = gdf.loc[max_id_index]

    # 打印 ID 最大的行信息
    logging.info(f"ID 最大的要素: {max_id_row}")

    # 删除 ID 最大的行
    gdf = gdf.drop(max_id_index)
    # 将剩余的要素保存到新的 shapefile
    gdf.to_file(output_shp, driver='ESRI Shapefile')

    logging.info(f"已删除 ID 最大的要素,并将结果保存到 {output_shp}")

添加缓冲区
在矢量数据中添加缓冲区是一个常见的GIS操作,它会在要素周围创建一个指定宽度的区域。在Python中,我们可以使用shapely库来处理矢量几何,并使用geopandas来操作矢量数据框(DataFrame)。
示例代码
以下是一个为矢量数据添加缓冲区的示例:

def calculate_buffer(input_shp, output_shp, buffer_distance, buffer_params=None):
    """
    对输入的 shapefile 进行缓冲区计算,并保存结果到输出 shapefile 文件中。

    Parameters:
        input_shp (str): 输入 shapefile 文件路径。
        output_shp (str): 输出 shapefile 文件路径。
        buffer_distance (float): 缓冲区的距离(单位:米)。
        buffer_params (dict): 缓冲区的其他参数,如端点样式和连接样式。默认为 None。

    Returns:
        None
    """
    # 加载 shapefile 文件
    gdf = gpd.read_file(input_shp)

    # 设置缓冲区的其他参数
    if buffer_params is None:
        buffer_params = {
            'cap_style': 3,  # 设置端点样式为平头
            'join_style': 1  # 设置连接样式为圆角
        }

    # 计算缓冲区
    buffered_gdf = gdf.copy()
    buffered_gdf['geometry'] = buffered_gdf.geometry.buffer(buffer_distance, **buffer_params)

    # 保存结果为新的 shapefile 文件
    buffered_gdf.to_file(output_shp)

简化矢量数据并应用容差

GIS中,矢量数据可能会包含大量的顶点,尤其是在高分辨率或详细描绘的地理要素中。这些详细的矢量数据在视觉呈现或进行某些分析时可能会消耗大量的计算资源。因此,简化矢量数据以减少顶点数量是一种常见的做法。在简化过程中,容差用于控制简化的程度,即允许在保留数据特征的同时减少多少细节。

示例代码

def simplify_shapefile(input_shp, output_shp, tolerance=3):
    """
    简化输入的 Shapefile 文件,并将结果保存到输出文件。
    Parameters:
    - input_shp (str): 输入 Shapefile 文件路径
    - output_shp (str): 输出 Shapefile 文件路径
    - tolerance (float): 简化的容差值
    Returns:
    None
    """
    # 读取输入 Shapefile 文件
    gdf = gpd.read_file(input_shp)

    # 对每个几何对象进行简化
    simplified_geometries = []
    for geometry in gdf.geometry:
        if geometry.geom_type == 'Polygon':
            simplified_geometry = geometry.simplify(tolerance, preserve_topology=True)
            simplified_geometries.append(simplified_geometry)
        else:
            simplified_geometries.append(geometry)

    # 创建包含简化后几何对象的 GeoDataFrame
    simplified_gdf = gpd.GeoDataFrame(geometry=simplified_geometries, crs=gdf.crs)

    # 保存结果到输出 Shapefile 文件
    simplified_gdf.to_file(output_shp)

小结

通过Python和GDAL库,我们可以轻松地将栅格数据转换为矢量数据,并为转换后的矢量数据添加缓冲区。这些操作在GIS分析和数据可视化中非常有用。。在矢量数据简化过程中,通过合理设置容差值,我们可以在保持数据有用性的同时显著减少数据的复杂性和处理时间。然而,需要注意的是,容差的选择应该基于数据的特性和分析的需求来仔细确定。希望本文的示例代码能够帮助你更好地理解和使用这些GIS数据处理技术。

标签:shp,容差,Python,矢量,栅格,gdf,output,缓冲区,input
From: https://blog.csdn.net/weixin_44217158/article/details/140286885

相关文章

  • 智慧工地安全绳检测识别系统 Python
    智慧工地安全绳检测识别系统利用现场已有的监控摄像头,智慧工地安全绳检测识别系统通过机器视觉+边缘计算实时分析监控画面数据不用人工控制;智慧工地安全绳检测识别系统可以及时发现监控区域人员未佩戴安全绳违规行为,迅速及时地给予预警提醒,协助后台人员高效的监督现场安全作业,......
  • python matplot绘图工具练习
    #pyplotimportmatplotlib.pyplotaspltimportnumpyasnpimportseabornassnsimportpandasaspdx_point=np.array([0,6])y_point=np.array([0,100])plt.plot(x_point,y_point,'b-.v')#格式处理plt.show()x=np.arange(0,4*np.pi,0.1)y=......
  • 【视频讲解】Python、R时间卷积神经网络TCN与CNN、RNN预测时间序列3实例附代码数据
    全文链接:https://tecdat.cn/?p=36944原文出处:拓端数据部落公众号本文旨在探讨时间卷积网络(TemporalConvolutionalNetwork,TCN)与CNN、RNN在预测任务中的应用。通过引入TCN模型,我们尝试解决时间序列数据中的复杂依赖关系,以提高预测的准确性。本文首先介绍了TCN的基本原理,随后详......
  • Python——习题练习 part3 函数进阶
    本篇文章记录函数进阶部分的知识点及例题代码。目录六,函数进阶01 函数的多返回值02函数的传参方式 1,位置参数2,关键字参数3,缺省参数4,不定长参数a,位置传递b,关键字传递03lambda匿名函数六,函数进阶01 函数的多返回值#函数的多返回值deftest_return():......
  • Python进阶入门之DataFrame
    引言接上一篇《关于Python中的series详解与应用》。本篇将详细介绍DataFrame,主要包括它的定义、创建方法、常用操作、应用场景以及与其他数据结构的比较。什么是DataFrameDataFrame是Pandas库中的一种二维标签数据结构,可以看作是一种带有行和列标签的表格数据。它既有行索引......
  • 关于Python中的series详解与应用
    引言近期在学习Python的过程中学到了Pandas库,它是数据处理操作中一款非常强大且流行的工具。而Pandas的两个核心数据结构是Series和DataFrame(下一篇文章便会进行有关学习)。本篇将详细介绍Series,主要包括它的定义、创建方法、常用操作、应用场景以及与其他数据结构的比较,仅为......
  • Python数据结构详解:列表、字典、集合与元组的使用技巧
    前言哈喽,大家好!今天我要和大家分享的是关于Python中最常用的数据结构:列表、字典、集合和元组的使用技巧。你有没有遇到过在处理数据时,不知道该用哪种数据结构来存储和操作数据的情况呢?别担心,今天这篇文章就来帮你搞定这些问题,让你在数据处理上更加得心应手。最后,别忘了关......
  • 用python一个集mes和erp在企业微信协同的服务案例
    要使用Python实现一个集MES和ERP于一体的企业微信协同服务案例,我们可以利用企业微信的API和第三方库`wechatpy`。以下是一个简单的实现思路:1.首先,安装`wechatpy`库,用于实现企业微信的相关功能。```pipinstallwechatpy```2.创建一个`WeChatService`类,用于实现企业微信......
  • python 自动化神器 多平台纯代码RPA办公自动化python框架
    ​ Pyaibote是一款专注于纯代码RPA(机器人流程自动化)的强大工具,支持Android、Browser和Windows三大主流平台。无论您需要自动化安卓应用、浏览器操作还是Windows应用程序,Pyaibote都能轻松应对Pyaibote可以同时协作Windows、Web和Android平台机器人,满足您多样化的办公自动化需求......
  • Python面试题-8
    41.请解释Python中的切片操作。在Python中,切片(Slicing)是一种获取序列(如字符串、列表、元组等)的子集或部分的操作。切片操作使用方括号[],并且可以在方括号中指定开始索引、结束索引和步长。其基本语法如下:sequence[start:end:step]start是切片开始的索引,默认为0(序列的......