沟谷网络的提取及沟壑密度的计算(ArcPy实现)
一、背景
沟壑密度是描述地面被水道切割破碎程度的一个指标。沟壑密度是气候、地形、岩性、植被等因素综合影响的反映。沟壑密度越大,地面越破碎,平均坡度增大,地表物质稳定性降低,且易形成地表径流,土壤侵蚀加剧。因此,沟壑密度的测定,对于了解区域地形发育特征,水土流失监测、水土保持规划有着重要的意义。
沟壑密度也称沟谷密度或沟道密度,指单位面积内沟壑的总长度。以公里/平方公里为单位。数学表达为
Ds为沟壑密度﹔>L为研究区域内的沟壑总长度(单位:公里);A为特定研究区域的面积(单位:平方公里)。
二、目的
掌握利用水文分析工具提取沟谷网络的原理及方法。
三、要求
(1)利用水文分析工具提取研究区域的沟谷网络。
(2)计算出该研究区域的沟壑密度。
四、数据
25m分辨率的DEM数据,区域面积约有59km²(\ChP11 \Ex3)。
五、模型构建器
六、ArcPy实现
# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------------
# 11-3 沟谷网络的提取及沟壑密度的计算.py
# Created on: 2021-10-12 09:38:51.00000
# (generated by ArcGIS/ModelBuilder)
# Description:
# ---------------------------------------------------------------------------
# Import arcpy module
import arcpy
from arcpy.sa import Test
import os
import shutil
import time
print time.asctime()
path = raw_input("请输入数据所在文件夹的绝对路径:").decode("utf-8")
# 开始计时
time_start = time.time()
paths = path + "\\result"
if not os.path.exists(paths):
os.mkdir(paths)
else:
shutil.rmtree(paths)
os.mkdir(paths)
# Local variables:
dem = path + "\\dem"
Output_descent_rate_raster_data1 = "Descent_data1"
FlowDir = "FlowDir"
Sink = "Sink"
Fill_dem = "Fill_dem"
Output_descent_rate_raster_data2 = "Descent_data2"
COLUMNCOUNT = "696"
ROWCOUNT = "622"
CELLSIZEX = "25"
CELLSIZEY = "25"
FlowDir_Fill = "FlowDir_Fill"
FlowAcc = "FlowAcc"
rastercalc = "rastercalc"
Reclass_rast1 = "Reclass_rast1"
StreamT1 = "StreamT1.shp"
StreamT1_Statistics = "StreamT1_Statistics"
# Set Geoprocessing environments
print "Set Geoprocessing environments"
arcpy.env.scratchWorkspace = paths # 临时工作空间
arcpy.env.workspace = paths # 工作空间
arcpy.env.extent = dem # 处理范围
arcpy.env.cellSize = dem # 像元大小
arcpy.env.mask = dem # 掩膜
# Process: 流向
print "Process: 流向"
arcpy.gp.FlowDirection_sa(dem, FlowDir, "NORMAL", Output_descent_rate_raster_data1, "D8")
# Process: 汇
print "Process: 汇"
arcpy.gp.Sink_sa(FlowDir, Sink)
# Process: 填洼
print "Process: 填洼"
arcpy.gp.Fill_sa(dem, Fill_dem, "")
# Process: 流向 (2)
print "Process: 流向 (2)"
arcpy.gp.FlowDirection_sa(Fill_dem, FlowDir_Fill, "NORMAL", Output_descent_rate_raster_data2, "D8")
# Process: 流量
print "Process: 流量"
arcpy.gp.FlowAccumulation_sa(FlowDir_Fill, FlowAcc, "", "FLOAT", "D8")
# Process: 栅格计算器
# print "Process: 栅格计算器"
# arcpy.gp.RasterCalculator_sa("\"%FlowAcc%\" > 100", rastercalc)
# Process: 条件测试
print "Process: 条件测试"
arcpy.gp.Test_sa(FlowAcc, "value>100", rastercalc)
# Process: 重分类
print "Process: 重分类"
arcpy.gp.Reclassify_sa(rastercalc, "Value", "0 NODATA;1 1", Reclass_rast1, "DATA")
# Process: 栅格河网矢量化
print "Process: 栅格河网矢量化"
arcpy.gp.StreamToFeature_sa(Reclass_rast1, FlowDir_Fill, StreamT1, "SIMPLIFY")
# Process: 添加几何属性
print "Process: 添加几何属性"
arcpy.AddGeometryAttributes_management(StreamT1, "LENGTH", "KILOMETERS", "", "")
# Process: 汇总统计数据
print "Process: 汇总统计数据"
arcpy.Statistics_analysis(StreamT1, StreamT1_Statistics, "Length SUM", "")
# Process: 获取栅格属性
print "Process: 获取栅格属性COLUMNCOUNT"
arcpy.GetRasterProperties_management(dem, "COLUMNCOUNT", "")
# Process: 获取栅格属性 (2)
print "Process: 获取栅格属性ROWCOUNT"
arcpy.GetRasterProperties_management(dem, "ROWCOUNT", "")
# Process: 获取栅格属性 (3)
print "Process: 获取栅格属性CELLSIZEX"
arcpy.GetRasterProperties_management(dem, "CELLSIZEX", "")
# Process: 获取栅格属性 (4)
print "Process: 获取栅格属性CELLSIZEY"
arcpy.GetRasterProperties_management(dem, "CELLSIZEY", "")
# Process: 添加字段
print "Process: 添加字段"
arcpy.AddField_management(StreamT1_Statistics, "area", "DOUBLE", "", "", "", "", "NULLABLE", "NON_REQUIRED", "")
# Process: 计算字段
print "Process: 计算字段,计算面积,除以1000000,是转换单位,将m²转为km²"
# arcgisscripting.ExecuteError: ERROR 999999: 执行函数时出错。无效字符
# arcpy.CalculateField_management(StreamT1_Statistics, "area", "%CELLSIZEY%*%CELLSIZEX%*%ROWCOUNT%*%COLUMNCOUNT% /1000000", "VB", "")
arcpy.CalculateField_management(StreamT1_Statistics, "area", "{}*{}*{}*{} /1000000".format(CELLSIZEY,CELLSIZEX,ROWCOUNT,COLUMNCOUNT), "VB", "")
# Process: 添加字段 (2)
print "Process: 添加字段 (2)"
arcpy.AddField_management(StreamT1_Statistics, "ds", "DOUBLE", "", "", "", "", "NULLABLE", "NON_REQUIRED", "")
# Process: 计算字段 (2)
print "Process: 计算字段 单位为km/km²"
arcpy.CalculateField_management(StreamT1_Statistics, "ds", "[SUM_Length] / [area]", "VB", "")
save = ["streamt1", "streamt1_statistics"]
rasters = arcpy.ListRasters()
for raster in rasters:
if raster.lower() not in save:
print u"正在删除{}图层".format(raster)
arcpy.Delete_management(raster)
# 结束计时
time_end = time.time()
# 计算所用时间
time_all = time_end - time_start
print time.asctime()
print "执行完毕!>>><<< 共耗时{:.0f}分{:.2f}秒".format(time_all // 60, time_all % 60)
注意:
下图是模型构建器生成的表,它会自动生成几何长度字段;
而ArcPy生成的表是不会自动生成几何长度字段的;
所以,我们得自己添加几何字段,注意这里已经把单位设置成了km。
七、结果
这节实验,用的时间有点多o(╥﹏╥)o
实验结束啦 byebye~~
沟谷网络的提取及沟壑密度的计算(ArcPy实现)的更多相关文章
- VLC接收网络串流缓冲时间的计算 (转)
原帖地址:http://blog.csdn.net/coroutines/article/details/7472743 VLC版本2.0.1 最近研究IP-STB音视频同步问题,发现方案自带的自动S ...
- 实现网络数据提取你需要哪些java知识
本篇对一些常用的java知识做一个整合,三大特性.IO操作.线程处理.类集处理,目的在于能用这些只是实现一个网页爬虫的功能. Ⅰ 首先对于一个java开发的项目有一个整体性的了解认知,项目开发流程: ...
- CSAGAN:LinesToFacePhoto: Face Photo Generation from Lines with Conditional Self-Attention Generative Adversarial Network - 1 - 论文学习
ABSTRACT 在本文中,我们探讨了从线条生成逼真的人脸图像的任务.先前的基于条件生成对抗网络(cGANs)的方法已经证明,当条件图像和输出图像共享对齐良好的结构时,它们能够生成视觉上可信的图像.然 ...
- 孪生网络(Siamese Network)在句子语义相似度计算中的应用
1,概述 在NLP中孪生网络基本是用来计算句子间的语义相似度的.其结构如下 在计算句子语义相似度的时候,都是以句子对的形式输入到网络中,孪生网络就是定义两个网络结构分别来表征句子对中的句子,然后通过曼 ...
- CNN基础二:使用预训练网络提取图像特征
上一节中,我们采用了一个自定义的网络结构,从头开始训练猫狗大战分类器,最终在使用图像增强的方式下得到了82%的验证准确率.但是,想要将深度学习应用于小型图像数据集,通常不会贸然采用复杂网络并且从头开始 ...
- 如何从Linux系统中获取带宽、流量网络数据
引入 国外的云主机厂商,例如AWS提供的网络数据是以流量为单位的,例如下面的图片: 从上图来看,其取值方式为 每隔5分钟取值1次,(每次)每个点显示为1分钟内的流量字节数(Bytes) 带宽与流量 我 ...
- AlexNet 网络详解及Tensorflow实现源码
版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 图片数据处理 2. 卷积神经网络 2.1. 卷积层 2.2. 池化层 2.3. 全链层 3. AlexNet 4. 用Tensorflow搭 ...
- CNN中减少网络的参数的三个思想
CNN中减少网络的参数的三个思想: 1) 局部连接(Local Connectivity) 2) 权值共享(Shared Weights) 3) 池化(Pooling) 局部连接 局部连接是相对于全连 ...
- python学习笔记(十 三)、网络编程
最近心情有点儿浮躁,难以静下心来 Python提供了强大的网络编程支持,很多库实现了常见的网络协议以及基于这些协议的抽象层,让你能够专注于程序的逻辑,而无需关心通过线路来传输比特的问题. 1 几个网络 ...
随机推荐
- linux备份恢复命令
dump 发行版不自带,需要 yum 或 apt 安装.安装时 restore 也会自动安装. 支持分区和增量备份(仅支持分区增量,目录备份不支持增量).(第一次完全备份,第二次及以后只备份增加和修改 ...
- 【C语言】第2章 算法 — 程序的灵魂
第2章 算法 - 程序的灵魂 一个程序主要包括以下两方面的信息: 对数据的描述.在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式 也就是数据结构(data structure) 对操作的描 ...
- FPGA nios通过驱动LCD12864实现菜单界面和uart串口通信
因为csdn无法插入视频,无法展示我这个实现的效果,这里我截了一些图,应该基本上也能明白了: 基本功能就是如图片所示,里面采用了菜单结构(这里编程需要一定得c语言编程技巧与数据结构知识),gpa是什么 ...
- Dockerfile简介及基于centos7的jdk镜像制作
Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像, 另外,使用Dockerfile去构建镜像好比使用pom去构建m ...
- Java中HashCode()和equals()的作用
引言 我们知道Java中的集合(Collection)大致可以分为两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 这里就引出一个问题: ...
- Zookeeper Acl权限 超级用户权限 怎么跳过ACL密码/账户验证
Zookeeper的一个节点不知道什么原因无法删除了,查看日志发现是没有权限, 我们之前使用ACL进行Zookeeper节点的权限管理. 可以解决以下三种但不限于以下三种问题: 1.在设置Acl权限时 ...
- Django学习day02随堂笔记
每日测验 """ 今日考题 1.谈谈你对web框架的认识,简述web框架请求流程 2.python三大主流web框架的区别 3.安装django需要注意的事项有哪些(最少 ...
- C#导出数据—使用Word模板
前言 本文主要介绍C#使用标签替换的方法导出数据,导出的数据模板使用Word文档. 模板建立 首先创建一个Word文档,然后建立一个基础模板.然后将上方菜单切换到插入菜单. 然后在想填充数据的地方添加 ...
- 解决IE浏览器 点击子元素重复调用执行 mouseover 与mouseout兼容性问题
将函数配对换为下面2个就可以解决兼容性问题. mouseenter() mouseleave(0
- PHP文件包含漏洞小结
参考链接:https://chybeta.github.io/2017/10/08/php文件包含漏洞/ 四大漏洞函数 PHP文件包含漏洞主要由于四个函数引起的: include() include_ ...