[初学入门]ArcGIS中Python脚本学习(6)
? 现在可以运行此toolbox了,对话框提示你输入latitude和declination。工具是否正
确运行呢?如果是的话,你应该可以看到“Completed”,你可能会看到有一黑色窗体一闪而过,不用担心。那么,它是干什么的呢?
还记得结果是输出两个数字参数,那么,这些数字哪去了呢?
很好的问题,这仅能说明你能创建一个工具,但是不能想ArcToolbox那样运行。比如输出一种数据,栅格或特征数据(.shp)之类的。 ? 但是它能在作为Modelbuilder工具正常运行,下面我们将使用它的输出参数创建一
个hillshade。
? 在你的toolbox中新建一个model,将刚才创建的脚本工具(script tool)拖进来。 ? 双击工具,输入参数,初始化之。打开“Sun Angle”和“Azimuth”发现它们还是
默认值,说明此脚本工具还没有运行。右键单击工具,选择Run,然后发现两个输
出参数已经改变!
16 / 33
需要注意的是:latitude范围是-90~90,declination范围是-23.44~23.44。尝试输入latitude -70,declination 23.5,你会得到什么?为什么?
? 确保你已经得到值域内的太阳角和方位角,它们将是构建hillshade的输入参数。
首先,添加hillshade工具,双击指定一个elevation栅格数据(这里我选择了marbles文件夹下的elevation),用下拉条指定azimuth和altitude值为azimuth和sun angle。运行,然后右键单击输出文件,选“Add to Display”在ArcMap里查看结果。
? 探索1:
如果你想通过日期获取太阳倾角,该怎么做呢?尝试下面代码,保存为getnoonsunfromdata.py,现在有五个参数,如下表进行正确设置: Display Name Month Date Latitude Sun Angle Azimuth Data type Long Long Double Double Double Type Required Required Required Derived Derived Direction input input input output output Default 1 1 0 35 300 import win32com.client,sys,math gp=win32com.client.Dispatch(\
#构建两个函数,首先判断输入月/日的合法性,然后获取是一年中的第几天 def jdate(im, id):
# 通过年月日起返回一年中的第几天
lastD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
jd = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334] if ((im > 0) and (im < 13)):
if ((id > 0) and (id <= lastD[im - 1])): return jd[im - 1] + id else:
print \ return 0 else:
print \ return 0 #计算倾角的函数 def declin(day):
17 / 33
rad = math.pi / 180
xlong = 279.164 + 0.985647 * day xanom = 356.381 + 0.985600 * day g = xanom * rad
elong = xlong + 1.915 * math.sin(g) + 0.02 * math.sin(2 * g) elong = elong * rad oblecl = 23.44 * rad
return math.asin(math.sin(oblecl) * math.sin(elong)) / rad
#主程序
month = int(sys.argv[1]) date = int(sys.argv[2]) lat = float(sys.argv[3])
decl = declin(jdate(month, date)) sunangle = 90 - lat + decl azimuth = 180 if sunangle > 90:
sunangle = 180-sunangle azimuth = 0
gp.setparameterastext(3,str(sunangle)) gp.setparameterastext(4,str(azimuth))
我们在思考远一点,如何根据一天内的任何时间而不是正午时间,获取太阳角和方位角呢?
感兴趣的可以从本文开头的链接中下砸相应代码学习。
? 探索2:
如何在PythonWin里运行这个脚本?首先我们得明确几个点:①我们将把hillshade作为脚本的一部分使用,并为其提供输入参数:一个高程栅格(elevation raster);②GetParameterastext仅在用作工具时起作用。 下表为脚本工具的参数设置: Display name Data type Type Direction Default Month Date Latitude Workspace Elevation Hillshade Long Long Double Workspace Raster Dataset String Required Required Required Required Required Required Input Input Input Input Input Input 代码如下:
import win32com.client, sys, math
gp = win32com.client.Dispatch(\#函数定义,同上,下面仅给出函数名称: def jdate(im, id): def declin(day):
# 主程序,使用sys.argv[]代替getparameterastext() month = int(sys.argv[1])
18 / 33
date = int(sys.argv[2]) lat = float(sys.argv[3])
gp.Workspace = sys.argv[4]#输入时注意,路径应为反斜杠“\\” elev = sys.argv[5]
hillsh = sys.argv[6]#给输出hillshade指定文件名 decl = declin(jdate(month, date)) sunangle = 90 - lat + decl azimuth = 180 if sunangle > 90:
sunangle = 180-sunangle azimuth = 0
gp.addmessage(\try:
gp.OverwriteOutput = 1
gp.addmessage(\overwriteoutputs setting, \+ gp.workspace + \+ hillsh)
gp.CheckOutExtension(\
gp.addmessage(gp.workspace + \
gp.HillShade_sa (elev, gp.workspace + \ gp.addmessage(\ gp.CheckInExtension(\except:
## print gp.getmessages()
gp.addmessage(gp.getmessages()) gp.CheckInExtension(\阅读代码发现,第一个输入参数不适用的getparameterastext(0),而是sys.argv[1],这是因为getparameterastext()方法只在工具中起作用,而sys.argv[]有同样的效果,索引从1而不是0开始,当然,这需要首先引用sys模块。这里我们直接指定输出文件在输入数据文件夹内,省去了setparameterastext()方法,当然这个方法在PythonWin中也无法运行。
尝试输入参数如下图,得到右下结果:
5 在PythonWin里调试地理处理脚本
既然我们已经认真地学会了从Python中创建并运行地理统计工具,那么现在需要考虑如何调试我们的程序了。我们需要经常在Python和添加的地理处理系统引用之间调试程序。当一个地理处理工具运行失败后,我们需要从Pythonwin中得到一个丰富的消息,而不是“未知错误”。
19 / 33
5.1 调试选择和消息
Python优于AML的优点之一是它有更好的调试方法,调试程序有很多选择,这里不能一一列举。
? 打印语句(Print statements)
一开始就养成良好的调试方法是:将变量的当前值或脚本的处理过程打印在屏幕上。 比如,对之前的一段脚本加以修改:
import arcgisscripting,sys gp=arcgisscripting.create(9.3) gp.Workspace=\gp.overwriteoutput=1
gp.copyfeatures_management(\gp.Toolbox=\
gp.buffer(\print \
gp.Clip(\
可以看出成功运行脚本!
然而当在工具中运行时,print语句不会产生错误,但也不会输出任何东西,因此,我们用gp.addmessage(\代替print语句。那么,如果想无论在工具中或Pythonwin中都可以显示消息,就可以这两句都写上。我喜欢的做法是定义一个‘sendmsg’函数来输出消息: def sendmsg(msg): print msg gp.addmessage(msg) …. …… 此处隐藏:2683字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [学前教育]MC9S12XS256RMV1 xs128芯片手册4
- [学前教育]安东尼语录经典语录
- [学前教育]e级gps控制测量技术设计书
- [学前教育]苏教版2022-2022学年八年级下学期期末
- [学前教育]装修公司推广 营销
- [学前教育]家政服务合同(完整版)
- [学前教育]湖北省2016届高三联考语文试题
- [学前教育]爱立信无涯学习系统LTE题库1-LTE基础知
- [学前教育]揭秘大众柴油车作弊软件原理
- [学前教育]人才流失原因及对策分析
- [学前教育]房屋建筑施工工程劳务分包合同
- [学前教育]国际贸易实务试卷A卷09.6
- [学前教育]校园废品回收活动计划方案书范文格
- [学前教育]电大成本会计试题及答案
- [学前教育]大学物理实验 华南理工出版社 绪论答案
- [学前教育]爱丁堡产后抑郁量表
- [学前教育]液压冲击的危害、产生原因与防止方法(
- [学前教育]学生工作总结高一学生期中考试总结_020
- [学前教育]人民医院医疗废物管理规章制度大全
- [学前教育]阳光维生素的巨大抗癌潜能阅读题答案.d
- 马云在云锋基金江苏论坛闭幕式的发言
- 试论小学体育教育中的心理健康教育-教
- 语文A版一年级下册《语文乐园一》教学
- 2021四川大学物理化学考研真题经验参考
- [人教A版]2015-2016学年高中数学 第二
- 终端网点销售返利协议书
- 江苏省2015年眼科学主治医师青光眼考试
- 2017年部编人教版八年级语文上册教案
- 十一中学七年级英语上册Unit7Howmuchar
- 以赛促教的创新性实验教学机制建设实践
- 平凉市崆峒区2015七年级下生物期末试题
- 琶洲(地块五)A、B塔楼1、2#塔吊基础
- 一级医院工作制度与人员岗位职责
- 2018北京西城区高三二模理科数学试题及
- 炒股密码线技术 - 图文
- 职高学生生涯发展辅导教案
- 语文人教版四年级上册8 世界地图引出的
- 最新最新人教版二年级上册全册数学教案
- 2017高考英语全国2卷精彩试题(有问题
- 普通心理学笔记




