一、背景

沟壑密度是描述地面被水道切割破碎程度的一个指标。沟壑密度是气候、地形、岩性、植被等因素综合影响的反映。沟壑密度越大,地面越破碎,平均坡度增大,地表物质稳定性降低,且易形成地表径流,土壤侵蚀加剧。因此,沟壑密度的测定,对于了解区域地形发育特征,水土流失监测、水土保持规划有着重要的意义。

沟壑密度也称沟谷密度或沟道密度,指单位面积内沟壑的总长度。以公里/平方公里为单位。数学表达为



Ds为沟壑密度﹔>L为研究区域内的沟壑总长度(单位:公里);A为特定研究区域的面积(单位:平方公里)。

二、目的

掌握利用水文分析工具提取沟谷网络的原理及方法。

三、要求

(1)利用水文分析工具提取研究区域的沟谷网络。

(2)计算出该研究区域的沟壑密度。

四、数据

25m分辨率的DEM数据,区域面积约有59km²(\ChP11 \Ex3)。

五、模型构建器

六、ArcPy实现

  1. # -*- coding: utf-8 -*-
  2. # ---------------------------------------------------------------------------
  3. # 11-3 沟谷网络的提取及沟壑密度的计算.py
  4. # Created on: 2021-10-12 09:38:51.00000
  5. # (generated by ArcGIS/ModelBuilder)
  6. # Description:
  7. # ---------------------------------------------------------------------------
  8. # Import arcpy module
  9. import arcpy
  10. from arcpy.sa import Test
  11. import os
  12. import shutil
  13. import time
  14. print time.asctime()
  15. path = raw_input("请输入数据所在文件夹的绝对路径:").decode("utf-8")
  16. # 开始计时
  17. time_start = time.time()
  18. paths = path + "\\result"
  19. if not os.path.exists(paths):
  20. os.mkdir(paths)
  21. else:
  22. shutil.rmtree(paths)
  23. os.mkdir(paths)
  24. # Local variables:
  25. dem = path + "\\dem"
  26. Output_descent_rate_raster_data1 = "Descent_data1"
  27. FlowDir = "FlowDir"
  28. Sink = "Sink"
  29. Fill_dem = "Fill_dem"
  30. Output_descent_rate_raster_data2 = "Descent_data2"
  31. COLUMNCOUNT = "696"
  32. ROWCOUNT = "622"
  33. CELLSIZEX = "25"
  34. CELLSIZEY = "25"
  35. FlowDir_Fill = "FlowDir_Fill"
  36. FlowAcc = "FlowAcc"
  37. rastercalc = "rastercalc"
  38. Reclass_rast1 = "Reclass_rast1"
  39. StreamT1 = "StreamT1.shp"
  40. StreamT1_Statistics = "StreamT1_Statistics"
  41. # Set Geoprocessing environments
  42. print "Set Geoprocessing environments"
  43. arcpy.env.scratchWorkspace = paths # 临时工作空间
  44. arcpy.env.workspace = paths # 工作空间
  45. arcpy.env.extent = dem # 处理范围
  46. arcpy.env.cellSize = dem # 像元大小
  47. arcpy.env.mask = dem # 掩膜
  48. # Process: 流向
  49. print "Process: 流向"
  50. arcpy.gp.FlowDirection_sa(dem, FlowDir, "NORMAL", Output_descent_rate_raster_data1, "D8")
  51. # Process: 汇
  52. print "Process: 汇"
  53. arcpy.gp.Sink_sa(FlowDir, Sink)
  54. # Process: 填洼
  55. print "Process: 填洼"
  56. arcpy.gp.Fill_sa(dem, Fill_dem, "")
  57. # Process: 流向 (2)
  58. print "Process: 流向 (2)"
  59. arcpy.gp.FlowDirection_sa(Fill_dem, FlowDir_Fill, "NORMAL", Output_descent_rate_raster_data2, "D8")
  60. # Process: 流量
  61. print "Process: 流量"
  62. arcpy.gp.FlowAccumulation_sa(FlowDir_Fill, FlowAcc, "", "FLOAT", "D8")
  63. # Process: 栅格计算器
  64. # print "Process: 栅格计算器"
  65. # arcpy.gp.RasterCalculator_sa("\"%FlowAcc%\" > 100", rastercalc)
  66. # Process: 条件测试
  67. print "Process: 条件测试"
  68. arcpy.gp.Test_sa(FlowAcc, "value>100", rastercalc)
  69. # Process: 重分类
  70. print "Process: 重分类"
  71. arcpy.gp.Reclassify_sa(rastercalc, "Value", "0 NODATA;1 1", Reclass_rast1, "DATA")
  72. # Process: 栅格河网矢量化
  73. print "Process: 栅格河网矢量化"
  74. arcpy.gp.StreamToFeature_sa(Reclass_rast1, FlowDir_Fill, StreamT1, "SIMPLIFY")
  75. # Process: 添加几何属性
  76. print "Process: 添加几何属性"
  77. arcpy.AddGeometryAttributes_management(StreamT1, "LENGTH", "KILOMETERS", "", "")
  78. # Process: 汇总统计数据
  79. print "Process: 汇总统计数据"
  80. arcpy.Statistics_analysis(StreamT1, StreamT1_Statistics, "Length SUM", "")
  81. # Process: 获取栅格属性
  82. print "Process: 获取栅格属性COLUMNCOUNT"
  83. arcpy.GetRasterProperties_management(dem, "COLUMNCOUNT", "")
  84. # Process: 获取栅格属性 (2)
  85. print "Process: 获取栅格属性ROWCOUNT"
  86. arcpy.GetRasterProperties_management(dem, "ROWCOUNT", "")
  87. # Process: 获取栅格属性 (3)
  88. print "Process: 获取栅格属性CELLSIZEX"
  89. arcpy.GetRasterProperties_management(dem, "CELLSIZEX", "")
  90. # Process: 获取栅格属性 (4)
  91. print "Process: 获取栅格属性CELLSIZEY"
  92. arcpy.GetRasterProperties_management(dem, "CELLSIZEY", "")
  93. # Process: 添加字段
  94. print "Process: 添加字段"
  95. arcpy.AddField_management(StreamT1_Statistics, "area", "DOUBLE", "", "", "", "", "NULLABLE", "NON_REQUIRED", "")
  96. # Process: 计算字段
  97. print "Process: 计算字段,计算面积,除以1000000,是转换单位,将m²转为km²"
  98. # arcgisscripting.ExecuteError: ERROR 999999: 执行函数时出错。无效字符
  99. # arcpy.CalculateField_management(StreamT1_Statistics, "area", "%CELLSIZEY%*%CELLSIZEX%*%ROWCOUNT%*%COLUMNCOUNT% /1000000", "VB", "")
  100. arcpy.CalculateField_management(StreamT1_Statistics, "area", "{}*{}*{}*{} /1000000".format(CELLSIZEY,CELLSIZEX,ROWCOUNT,COLUMNCOUNT), "VB", "")
  101. # Process: 添加字段 (2)
  102. print "Process: 添加字段 (2)"
  103. arcpy.AddField_management(StreamT1_Statistics, "ds", "DOUBLE", "", "", "", "", "NULLABLE", "NON_REQUIRED", "")
  104. # Process: 计算字段 (2)
  105. print "Process: 计算字段 单位为km/km²"
  106. arcpy.CalculateField_management(StreamT1_Statistics, "ds", "[SUM_Length] / [area]", "VB", "")
  107. save = ["streamt1", "streamt1_statistics"]
  108. rasters = arcpy.ListRasters()
  109. for raster in rasters:
  110. if raster.lower() not in save:
  111. print u"正在删除{}图层".format(raster)
  112. arcpy.Delete_management(raster)
  113. # 结束计时
  114. time_end = time.time()
  115. # 计算所用时间
  116. time_all = time_end - time_start
  117. print time.asctime()
  118. print "执行完毕!>>><<< 共耗时{:.0f}分{:.2f}秒".format(time_all // 60, time_all % 60)

注意:

下图是模型构建器生成的表,它会自动生成几何长度字段;



而ArcPy生成的表是不会自动生成几何长度字段的;



所以,我们得自己添加几何字段,注意这里已经把单位设置成了km。

七、结果









这节实验,用的时间有点多o(╥﹏╥)o

实验结束啦 byebye~~

沟谷网络的提取及沟壑密度的计算(ArcPy实现)的更多相关文章

  1. VLC接收网络串流缓冲时间的计算 (转)

    原帖地址:http://blog.csdn.net/coroutines/article/details/7472743 VLC版本2.0.1 最近研究IP-STB音视频同步问题,发现方案自带的自动S ...

  2. 实现网络数据提取你需要哪些java知识

    本篇对一些常用的java知识做一个整合,三大特性.IO操作.线程处理.类集处理,目的在于能用这些只是实现一个网页爬虫的功能. Ⅰ 首先对于一个java开发的项目有一个整体性的了解认知,项目开发流程: ...

  3. CSAGAN:LinesToFacePhoto: Face Photo Generation from Lines with Conditional Self-Attention Generative Adversarial Network - 1 - 论文学习

    ABSTRACT 在本文中,我们探讨了从线条生成逼真的人脸图像的任务.先前的基于条件生成对抗网络(cGANs)的方法已经证明,当条件图像和输出图像共享对齐良好的结构时,它们能够生成视觉上可信的图像.然 ...

  4. 孪生网络(Siamese Network)在句子语义相似度计算中的应用

    1,概述 在NLP中孪生网络基本是用来计算句子间的语义相似度的.其结构如下 在计算句子语义相似度的时候,都是以句子对的形式输入到网络中,孪生网络就是定义两个网络结构分别来表征句子对中的句子,然后通过曼 ...

  5. CNN基础二:使用预训练网络提取图像特征

    上一节中,我们采用了一个自定义的网络结构,从头开始训练猫狗大战分类器,最终在使用图像增强的方式下得到了82%的验证准确率.但是,想要将深度学习应用于小型图像数据集,通常不会贸然采用复杂网络并且从头开始 ...

  6. 如何从Linux系统中获取带宽、流量网络数据

    引入 国外的云主机厂商,例如AWS提供的网络数据是以流量为单位的,例如下面的图片: 从上图来看,其取值方式为 每隔5分钟取值1次,(每次)每个点显示为1分钟内的流量字节数(Bytes) 带宽与流量 我 ...

  7. AlexNet 网络详解及Tensorflow实现源码

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 图片数据处理 2. 卷积神经网络 2.1. 卷积层 2.2. 池化层 2.3. 全链层 3. AlexNet 4. 用Tensorflow搭 ...

  8. CNN中减少网络的参数的三个思想

    CNN中减少网络的参数的三个思想: 1) 局部连接(Local Connectivity) 2) 权值共享(Shared Weights) 3) 池化(Pooling) 局部连接 局部连接是相对于全连 ...

  9. python学习笔记(十 三)、网络编程

    最近心情有点儿浮躁,难以静下心来 Python提供了强大的网络编程支持,很多库实现了常见的网络协议以及基于这些协议的抽象层,让你能够专注于程序的逻辑,而无需关心通过线路来传输比特的问题. 1 几个网络 ...

随机推荐

  1. 高性能利器:CDN我建议你好好学一下!

    硬核干货分享,欢迎关注[Java补习课]成长的路上,我们一起前行 ! <高可用系列文章> 已收录在专栏,欢迎关注! CDN 概述 CDN 全称 Content Delivery Netwo ...

  2. JS 处理图片平铺问题

    background: url("../../../assets/image/center.png") no-repeat; // 让图片不平铺   overflow: hidde ...

  3. Mysql force index和ignore index 使用实例

    前几天统计一个sql,是一个人提交了多少工单,顺便做了相关sql优化.数据大概2000多w. select CustName,count(1) c from WorkOrder where Creat ...

  4. FastAPI(1)- 简单介绍

    前言 为啥要学它呢,因为学 Flask 的时候发现有人更推荐它代替 Flask,看了下介绍,感觉很强,而且也能拿来做平台,当然学起来!卷起来! 为什么要使用 FastAPI ? 日渐没落的是后端 HT ...

  5. epoll代码框架

    epoll代码实现框架: #define MAX_EVENTS 10 struct epoll_event ev, events[MAX_EVENTS]; int listen_sock, conn_ ...

  6. epoll经典代码示例

    1. epoll原理 原理性的知识不再另做说明,我在这里附上收藏整理的两篇经典文章: select与epoll的本质关系. select.poll.epoll之间的区别. 2. epoll服务器端经典 ...

  7. Windos下通过Wpcap抓包实现两个网卡桥接

    目录 1. 背景: 2. 需要的技术手段: 3. 实现逻辑: 4. 应用实例: 1. 背景: 一台电脑允许接多个网口,当然大部分只有一个网口其余都是USB扩展而来,而每个网口之间需要配置不同的网段IP ...

  8. 一文读懂Redis

    目录结构如下: 简介 Redis是一个高性能的key-value数据库.Redis对数据的操作都是原子性的. 优缺点 优点: 基于内存操作,内存读写速度快. Redis是单线程的,避免线程切换开销及多 ...

  9. redis的集群安装

    1.创建安装目录 在master ,node1 ,node2中分别创建 mkdir /usr/local/soft/redis-cluster 2.将redis 复制到redis-cluster 目录 ...

  10. 关于goto

    (下面一段来源<征服C指针>) 75: ReadLineStatus read_line(FILE *fp, char **line) 76: { 77: int ch; 78: Read ...