教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 学前教育 >

[初学入门]ArcGIS中Python脚本学习(6)

来源:网络收集 时间:2026-07-26
导读: ? 现在可以运行此toolbox了,对话框提示你输入latitude和declination。工具是否正 确运行呢?如果是的话,你应该可以看到“Completed”,你可能会看到有一黑色窗体一闪而过,不用担心。那么,它是干什么的呢? 还记

? 现在可以运行此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字,全部文档内容请下载后查看。喜欢就下载吧 ……

[初学入门]ArcGIS中Python脚本学习(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/594883.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)