寻找最佳路径(ArcPy实现)
一、背景
随着社会经济发展需求,公路的重要性日益提高。在一些交通欠发达的地区,公路建设迫在眉睫。如何根据实际地形情况设计出比较合理的公路规划,是一个值得研究的问题。
二、实验目的:
(1)通过练习,熟悉 ArcGIS 栅格数据距离制图、表面分析、成本权重距离、数据重分类、最短路径等空间分析功能;
(2)熟练掌握利用 ArcGIS 上述空间分析功能解决实际应用问题的基本流程和操作过程。
三、实验数据
(1)dem(高程数据)
(2)startPot (路径源点数据)
(3)endPot (路径终点数据)
(4)river (小流域数据)
四、实验软件
Python
五、实验内容:
新公路选址需注意如下几点:
1、新建路径成本较少;
2、新建路径为较短路径;
3、新建路径的选择应该避开主干河流,以减少成本;
4、新建路径的成本数据计算时,考虑到河流成本(Reclass_river)是路径成本中较关键因素,先将坡度数据(reclass_slope)和起伏度数据(reclass_QFD)按照 0.6:0.4 权重合并,然后与河流成本作等权重的加和合并,公式描述如下:
cost =重分类流域数据+ (重分类坡度数据0.6+重分类起伏度数据0.4)
5、寻找最短路径的实现需要运用 ArcGIS 的空间分析(Spatial Analyst)中距离制图中的成本路径及最短路径、表面分析中的坡度计算及起伏度计算、重分类及栅格计算器等功能完成
6、最后提交寻找到的最短路径路线,并制作专题图。
主要操作步骤包括:
(1)创建成本数据集
坡度成本数据集:使用Surface Analyst生成坡度数据集,并采用等间距分为 10 级,坡度最小一级赋值为 1,最大一级赋值为 10。
起伏度成本数据集:使用11*11单元格大小做Neighborhood Statistics,得到地形起伏度数据,并按 10 级等间距实施重分类,地形越起伏,级数赋值越高,即最小一级赋值为 1,最大一级赋值为 10。
河流成本数据集:使用Reclassify 命令,按照河流等级如下进行分类:4 级为 10;如此依次为8,5,2,1。
(2)加权合并单因素成本数据,生成最终成本数据集。
(3)使用 Distance 中的 Cost Distance功能计算成本权重距离函数。
(4)选择 Distance 中的 Cost Path求取最短路径。
(5)制作专题地图并输出。
操作流程图:

六、模型构建器

七、ArcPy实现
# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------------
# 8-2寻找最佳路径.py
# Created on: 2021-10-10 10:02:59.00000
# (generated by ArcGIS/ModelBuilder)
# Description:
# ---------------------------------------------------------------------------
# Import arcpy module
import arcpy
import os
path = raw_input("请输入数据所在绝对路径:").decode("utf-8")
paths = os.path.split(path)[0] + '\\result'
if not os.path.exists(paths):
os.mkdir(paths)
# Local variables:
dem = path + "\\dem"
endPot = path + "\\endPot"
startPot = path + "\\startPot"
river = path + "\\river"
Reclass_rive = "Reclass_rive"
Slope_dem = "Slope_dem"
Reclass_Slop = "Reclass_Slop"
FocalSt_dem = "FocalSt_dem"
Reclass_Foca = "Reclass_Foca"
# rastercacu = "rastercacu" # 看栅格计算器那里,因为那里定义了,所以这里注释掉
CostDis_star = "CostDis_star"
huisuo = "huisuo"
result = "成本路径"
# Set Geoprocessing environments
print "Set Geoprocessing environments"
arcpy.env.scratchWorkspace = paths
arcpy.env.workspace = paths
# Process: 坡度
print "Process: 坡度"
arcpy.gp.Slope_sa(dem, Slope_dem, "DEGREE", "1", "PLANAR", "METER")
# Process: 重分类
print "Process: 重分类"
arcpy.gp.Reclassify_sa(Slope_dem, "Value",
"0 5.730143 1;5.730143 11.460286 2;11.460286 17.190429 3;17.190429 22.920572 4;22.920572 28.650715 5;28.650715 34.380858 6;34.380858 40.111001 7;40.111001 45.841144 8;45.841144 51.571287 9;51.571287 57.301430 10",
Reclass_Slop, "DATA")
# Process: 焦点统计
print "Process: 焦点统计"
arcpy.gp.FocalStatistics_sa(dem, FocalSt_dem, "Rectangle 3 3 CELL", "MEAN", "DATA", "90")
# Process: 重分类 (2)
print "Process: 重分类 (2)"
arcpy.gp.Reclassify_sa(FocalSt_dem, "Value",
"179.462219 210.765332 1;210.765332 242.068445 2;242.068445 273.371558 3;273.371558 304.674670 4;304.674670 335.977783 5;335.977783 367.280896 6;367.280896 398.584009 7;398.584009 429.887122 8;429.887122 461.190234 9;461.190234 492.493347 10",
Reclass_Foca, "DATA")
# Process: 重分类 (3)
print "Process: 重分类 (3)"
arcpy.gp.Reclassify_sa(river, "Value", "0 1;1 2;2 5;3 8;4 10", Reclass_rive, "DATA")
# Process: 栅格计算器
print "Process: 栅格计算器"
# "\"%Reclass_rive%\" + (\"%Reclass_Slop%\" * 0.6 + \"%Reclass_Foca%\" * 0.4) "
rastercacu = arcpy.sa.Raster(Reclass_rive) + arcpy.sa.Raster(Reclass_Slop) * 0.6 + arcpy.sa.Raster(Reclass_Foca) * 0.4
rastercacu.save("rastercacu")
# Process: 成本距离
print "Process: 成本距离"
arcpy.gp.CostDistance_sa(startPot, rastercacu, CostDis_star, "", huisuo, "", "", "", "", "")
# Process: 成本路径
print "Process: 成本路径"
arcpy.gp.CostPath_sa(endPot, CostDis_star, huisuo, result, "EACH_CELL", "Id", "INPUT_RANGE")
save = [u"成本路径"] # 需要保留的图层
features = arcpy.ListRasters()
for feature in features:
if feature not in save:
print u"正在删除图层{}".format(feature)
arcpy.Delete_management(feature)
print "运行完毕~~~"
注意事项:
1、栅格计算器好像不可以直接执行乘计算。
arcpy.gp.RasterCalculator_sa("'%Reclass_rive%' + ('%Reclass_Slop%' * 0.6 + '%Reclass_Foca%' * 0.4) ", rastercacu)

当我把浮点数改为整数,仍报错:

那就只运算加法呢,结果如下:

查阅了一下帮助文档:
栅格计算器工具对话框中的示例表达式
在“栅格计算器”和直接在 Python 中使用“地图代数”时,您应注意语法上存在一些差异。
a、当使用栅格计算器时,由于在栅格计算器工具对话框中有指定的输出参数,“地图代数”表达式不包括输出名称和等号 (=)。
b、只有在栅格计算器工具对话框中,图层名称才可以直接与运算符一起使用。在 Python 中进行处理时,图层必须首先转换为栅格对象。
c、同样,“栅格计算器”变量仅在工具对话框中才能包含在百分号 (%) 或引号 (") 之内。

还是报错,可能是b步骤没有做,不弄了,有兴趣的可以再继续尝试哈
最后我直接选择使用加法,乘法运算来代替栅格计算器。
2、成本距离 不支持输出到 PGDB 工作空间。
ERROR 010537: 输出参数 '输出距离栅格数据' 无效:成本距离 不支持输出到 PGDB 工作空间。
ERROR 010537: 输出参数 '输出回溯链接栅格数据' 无效:成本距离 不支持输出到 PGDB 工作空间。
执行(CostDistance)失败。
所以改成在给该数据库同路径下,新建一个“result”文件夹存放新生成栅格数据。

八、运行结果



实验结束 byebye~~
寻找最佳路径(ArcPy实现)的更多相关文章
- ArcGIS 网络分析[1.2] 利用1.1的线shp创建网络数据集/并简单试验最佳路径
上篇已经创建好了线数据(shp文件格式)链接:点我 这篇将基于此shp线数据创建网络数据集. 在此说明:shp数据的网络数据集仅支持单一线数据,也就是说基于shp文件的网络数据集,只能有一个shp线文 ...
- 使用 EOLINKER 进行接口测试的最佳路径 (下)
本文为 <使用 EOLINKER 进行接口测试的最佳路径> 下半部分文章,主要介绍测试脚本如何执行和报告生成,以及测试项目人员如何协作.还没看过上篇文章请戳 使用 EOLINKER 进行接 ...
- 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第一道——最佳路径
题目 给定一个 n*m 的矩阵 A ,矩阵中每一个元素为一个十六进制数.寻找一条从左上角都右下角的路径,每次只能向右或者向下移动, 使得路径上所有数字之积在 16 进制下的后缀 0 最少. 输入描述: ...
- Uva 1599 最佳路径
题目链接:https://uva.onlinejudge.org/external/15/1599.pdf 题意: 保证在最短路的时候,输出字典序最小的路径. 方法: 路径上有了权值,可以利用图论的数 ...
- Linux 寻找安装路径
1.whereis 语法: # whereis [-bmsu] 文件或者目录名称 参数说 明: -b : 只找二进制文件 -m: 只找在说明文件manual路径下的文件 -s : 只找sou ...
- linux 通过pid寻找程序路径的最简单命令
在linux实际操作命令中,查看pid的方式有很多种,通过pid找程序路径的方式也有好几个,但是可能大家都忽略的一个很简单也是很实用的命令:pwdx. 比如要查找某个java编写的程序运行情况可通过j ...
- 使用EOLINKER做接口测试最佳路径(上)
本文内容: 测试脚本管理:讲述如何在 EOLINKER 上设计测试项目目录结构. 编写测试脚本:讲述如何在 EOLINKER 上编写接口测试脚本. 测试脚本执行及报告:讲述如何在 EOLINKER 上 ...
- ACA:利用ACA解决TSP优化最佳路径问题——Jason niu
load citys_data.mat n = size(citys,1); D = zeros(n,n); for i = 1:n for j = 1:n if i ~= j D(i,j) = sq ...
- Paper | 量化CV任务的关联性,寻找最佳迁移策略(Taskonomy)
目录 1. 问题 2. 方法 3. 实验设计 3.1. 解决词典内部(一组已知)任务的能力 3.2. 解决新任务(少量标记数据)的能力 4. 讨论和启发 论文:Taskonomy: Disentang ...
随机推荐
- T-SQL - query01_创建数据库|创建表|添加数据|简单查询
时间:2017-09-29 整理:byzqy 本篇以"梁山好汉花名册"为例,记录MS SQLServer T-SQL语句的使用,包含命令: 创建数据库 | 删除数据库 创建表 | ...
- 取消Ubuntu开机硬盘自检
修改/etc/fstab文件,最后一列全改为0,测试能正常启动,尚未出现再次自检的情况 sudo gedit /etc/fstab
- 证明:(a,[b,c]) = [(a,b),(a,c)]
这题是潘承洞.潘承彪所著<初等数论>(第三版)第一章第5节里一个例题,书中采用算术基本定理证明,并指出要直接用第4节的方法来证是较困难的. 现采用第4节的方法(即最大公约数理论里的几个常用 ...
- Mybatis-技术专区-如何清晰的解决出现「多对一模型」和「一对多模型」的问题
前提介绍 在mybatis如何进行多对一.一对多(一对一)的多表查询呢?本章带你认识如何非常顺滑的解决! 基础使用篇 一对一 association association通常用来映射一对一的关系,例 ...
- MySQL alter table时执行innobackupex全备再看Seconds_Behind_Master
1.场景描述 早上7:25 接到Report中心同学告警,昨天业务报表数据没有完整跑出来,缺少500位业务员的数据,并且很快定位到,缺少的是huabei_order库上的数据.Report中心的数据是 ...
- JavaScript——字符串——模板字符串
JavaScript--字符串--模板字符串 字符串可以用反引号包裹起来,其中的${expression}表示特殊的含义,JavaScript会将expression代表的变量的值和反引号中的其它普通 ...
- Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo
Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...
- JDK1.8源码阅读笔记(2) AtomicInteger AtomicLong AtomicBoolean原子类
JDK1.8源码阅读笔记(2) AtomicInteger AtomicLong AtomicBoolean原子类 Unsafe Java中无法直接操作一块内存区域,不能像C++中那样可以自己申请内存 ...
- CSS滤镜让图片模糊(毛玻璃效果)
CSS代码: .blur { filter: url(blur.svg#blur); /* FireFox, Chrome, Opera */ -webkit-filter: blur(10px); ...
- Spring表达式
一.SpEL 其中,直接写也可以赋值,' ' 单引号引起来后成为一个字符串对象,可以调用String的方法: 二.引用另外一个bean 装配这个类的bean: 1.第一种方法,property标签中使 ...