arcpy批量提取面状水系中间线

news/2024/7/8 1:05:24

由于面状水系可能存在多条中间线,因此批量提取时需要使用 ArcGIS 中的 Feature To Line 工具结合 Python 循环和游标来完成。

以下是代码:


import arcpy
import os

# 设置输入输出路径和文件名
input_folder = r"C:\data\river_polygons"
output_folder = r"C:\data\river_midlines"

# 创建输出文件夹
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历输入文件夹中所有 Shapefile 文件
for _, _, files in os.walk(input_folder):
    for file in files:
        if file.lower().endswith(".shp"):
            # 获取当前文件路径和名称
            input_shapefile = os.path.join(input_folder, file)

            # 在提取线之前,删除现有的缓存文件 (如果已存在)
            arcpy.Delete_management("in_memory")

            # 根据面状水系区域生成几何网络
            arcpy.Create geometric network(流体模拟)
            network_path = "in_memory/network"
            arcpy.FeatureClassToFeatureClass_conversion(input_shapefile, "in_memory", "polygons_for_network")
            arcpy.CreateGeometricNetwork_management(network_path, "River", "SIMPLE_JUNCTION", "#", "#", "#", "#")
            arcpy.AddFeatureClassToGeometricNetwork_management(network_path, "River", "polygons_for_network", "#", "#")
            arcpy.BuildGeometricNetwork_management(network_path)

            # 取得面状水系中心线
            centerlines = []
            with arcpy.da.SearchCursor(input_shapefile, ["OID@", "SHAPE@"]) as cursor:
                for row in cursor:
                    # 使用 Feature To Line 工具计算中心线
                    input_polyline_feature = "in_memory/polyline_feature"
                    arcpy.FeatureToLine_management(row[1], input_polyline_feature, "#", "NO_ATTRIBUTES")
                    arcpy.MergeDividedRoads_cartography(input_polyline_feature, "#", input_polyline_feature + "_merged")
                    # 向列表追加中心线
                    centerlines.append((row[0], input_polyline_feature + "_merged"))
            del cursor

            # 将所有中心线融合成一个图层并保存到输出文件夹中
            output_shapefile = os.path.join(output_folder, "midlines_" + file)
            arcpy.Merge_management([i[1] for i in centerlines], output_shapefile)
            with arcpy.da.UpdateCursor(output_shapefile, ["PolyID"]) as cursor:
                for row in cursor:
                    # 更新新的线性要素 ID 与原始面状水系多边形相关
                    row[0] = [i[0] for i in centerlines if i[1].endswith("_" + str(row[0]))][0]
                    cursor.updateRow(row)
            del cursor
 

上述代码假设输入为包含多个面状水系区


http://lihuaxi.xjx100.cn/news/1242995.html

相关文章

阿里云弹性公网EIP收费价格表

阿里云弹性公网EIP怎么收费?EIP地域不同价格不同,EIP计费模式分为包年包月和按量付费,弹性公网IP可以按带宽收费也可以按使用流量收费,阿里云百科分享阿里云弹性公网IP不同地域、不同计费模式、按带宽和按使用流量详细收费价格表&…

005、体系结构之TiKV_Raft日志

Raft日志 1、Raft与Multi Raft2、Raft 日志复制2.1、复制流程总览2.2、Propose2.3、Append2.3、Replicate(Append)2.4 Committed2.4 Apply 3、Raft Leader 选举3.1、原理3.2、节点故障Leader(主副本)选举⽇志复制 1、Raft与Multi Raft 一个region的大小是…

Linux系统的tty架构及UART驱动详解

​一、模块硬件学习 1.1. Uart介绍 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称为UART,是一种异步收发传输器,是电脑硬件的一部分。它将要传输的资料在串行通信与并行通信之间加以转换。 作为把并…

Python爬虫之基础知识

爬虫基础知识 一、爬虫的概念 模拟浏览器,发送请求,获取响应 网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端(主要指浏览器)发送网络请求,接收请求响应,一种按照一定的规则,…

IMX6ULL裸机篇之SPI实验-SPI主控代码实现

一. SPI 实验 SPI实验:学习如何使用 I.MX6U 的 SPI 接口来驱动 ICM-20608,读取 ICM-20608 的六轴数据。 本文学习 SPI主控芯片的代码编写。其中,包括SPI工作模式设置,主从模式设置,时钟配置等实现。 二. SPI 主控芯…

Servlet+jsp+Layui图书管理系统

项目介绍 介绍 使用到了jsp,servlet,Mysql,Java,layui。 大致功能 关于用户: 登录,申请注册,查看搜索图书,查看有关用户的借阅记录,丢失记录,预借记录。对…

华为OD机试 JavaScript 实现【扑克牌大小】【牛客练习题 HJ88】,附详细解题思路

一、题目描述 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A、2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王&#xff09…

有趣的图(三)(57)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日主题 咱们之前分别学习了图的基本概念,和图的深度优先遍历算法dfs。 你学会了吗? 咱们今天要学…