1、 1 / 33初学入门ArcGIS 中 Python 脚本的使用By:飞天小猪目录写在前面的话 2前言 .2一、PYTHON 语言基础 31 数学运算符 .32 字符串操作 .43 模块的使用(M ODULES) .54 使用 DEF 构建函数 65 流程控制结构:IF,WHILE ,FOR 66 简单输入和输出 .9二、ARCGISy1=4152373x2=520475;y2=4152963 不同赋值语句间用“;”分隔xr=x2-x1yr=y2-y1math.hypot(xr,yr)math.sqrt(xr*2+yr*2)(xr*xr+yr*yr)*0.5597.28468923956189
2、 不同的方式,相同的结果import randomrandom.random() 0.27281588185756478rnd=random.randomrnd() 0.4456393835072503mu=50s=10print random.gauss(mu,s)46.528202194random()方法,每次结果都不同,值域为0.0,1.0)4 使用 def 构建函数有点像 Module,但更简单,函数是一个自己定义功能,用在之后的代码中,并且提供任何你想要使用的参数。这个函数从此可像变量那样在程序中使用,结合例子更容易理解。接下来的代码定义了一个将度转换为弧度的简单函数,同时也定义了
3、一个弧度转换为度的函数,它们和 Excel 内置的函数类似。import mathdef radians(angdeg):return angdeg*math.pi/180def degrees(angrad):return angrad*180/math.piprint math.sin(radians(45)7 / 33print degrees(math.acos(0.5)运行之,得到结果:0.707106781187 60.05 流程控制结构:If, While,For任何脚本或编程语言的一个重要特征就是执行一系列不同情形语句的能力。你想要创建一系列山影栅格来代表夏天、冬天和春秋分。山
4、影(hillshade)工具需要有太阳高度角和方位角作为输入参数。重要日期 太阳倾角夏至(6 月 21 日) 23.44春秋分(3 月 21 日,9 月 21 日) 0冬至(12 月 21 日) -23.44接下来是一段相当简单的代码,通过太阳倾角(太阳光线正午垂直照射的纬度)获取太阳角和方位角以及纬度。输入两个参数:lat (研究区域的纬度,南半球为负)和 decl(太阳倾角) ,由此得到 sunangle 和 azimuth:lat=30decl=20sunangle=90-lat+declazimuth=180if sunangle90:sunangle=180-sunangleazim
5、uth=0print sunangle,azimuth上面的例子中 lat 和 decl 强制赋了值。有三种流程控制操作:if 仅在一个特定情形下才执行语句;while 当一种情形存在下,持续执行语句for 遍历一系列值这些语法和 def 有些相似:初始语句后加顿号、需要执行的语句块有缩进。这三个结构的一些重要的公共特征:if、while、for 语句均以冒号结尾,接下来是缩进的代码块,用于 if、while 、for 定义的情形。在脚本编写窗口,你会发现,你在一行末尾打上冒号后,下一行自动缩进,在接下来的一行按下退格键取消缩进。如果你只需做一件事情,你可以在冒号后面同一行添加简短的语句,比如
6、:if x0: print x 比 0 大print 下一行不要缩进了。 。 。 if(continued)接下来,我们会探索一下另一个方便的模块:os.path:开始之前,在 d:/下创建一个“testfolder”文件夹,然后新建一个“test.txt ”文件;8 / 33尝试以下代码段,确保 print 语句前有缩进。import os.pathif os.path.exists(“d:/testfolder/test.txt“):print “测试文件夹存在 “print “txt 文件存在 “elif os.path.exists(“d:/testfolder“):print “测试
7、文件夹存在 “print “测试文件夹存在,但 txt 文件不存在“else:print “两者都不存在 “可选探索示例接下来的例子做的事情对 GIS 非常重要,但是实际上不用任何地理处理代码。USGS7.5米分辨率 DEM(数字高程模型)是文本文件(USGSDEM 文件) ,投影为 UTM,UTM 北向和东向单位是米,但是高程单位可能是英尺(feet)或米( meters) 。因此在获取垂直或水平距离信息时会有问题,比如坡度可以通过垂直距离/水平距离获得。如果你不在使用 Z 值之前设置为 0.3048,将会出现错误结果。但是不幸的是,你可能不知道 DEM 文本文件的垂直单位是英尺还是米。这些
8、信息保存在第 539 个字符里, “1”代表英尺, “2”代表米,所以可以通过读取这个文件判断。下面的脚本演示了上述内容:import fileinputinfile=r“c:progpendatawoodside.dem“firstline=fileinput.input(infile)0unitchar=firstline539unit=“(unknown:not a 7.5 DEM?)“if unitchar=“1“:unit=“feet“if unitchar=“2“:unit=“meters“print “nElevation in“+“ “+unitfileinput.close(
9、)输出结果:Elevation in feetwhile(continued) 运行下面的代码,说明了一种 while 循环:x=1while x”(大于) 、 “=”(大于或等于)9 / 33、 “”(不等于) 。使用逻辑运算符计算得到结果为布尔型:true(1 )和 false(0) 。下面例子简单体会一下布尔型表达式:x=1while xz95:count=count+1print float(count)/n(每次运行的结果都不同,但都在 0.05 左右,即统计结果10 / 33在 5%左右)6 简单输入和输出我们现在利用前面计算太阳角代码的片段,之前是直接指定参数值,现在我们有很多种
10、方法提供输入参数,现在我们用 sys 方法。尝试下面的代码,点击 (run 运行)之后,在对话框中函数自变量(Arguments)一栏填入:40 23.44,如下图:import syslat=float(sys.argv1)decl=float(sys.argv2)#使用 arguments(argv)方法从“Arguments ”一栏中获取输入参数,并指定一个浮点型转换将字符型输入值传递给 lat 和 declsunangle=90-lat+declazimuth=180if sunangle90:sunangle=180-sunangleazimuth=0print “正午太阳角=“+s
11、tr(sunangle)print “方位角 =“+str(azimuth)(结果:正午太阳角 =73.44 方位角=180)二、ArcGIS“+str(pnt.x)+“;“+str(pnt.y)pnt=stArray.Next()a=a+1row=rows.Next() 尝试下面代码,展示了 InsertCursor 的用法,同样的基本方法可用来读取外部数据,比如文本文件。import win32com.client, sys, math, stringgp = win32com.client.Dispatch(“esriGeoprocessing.GPDispatch.1“)#import
12、 arcgisscripting#gp=arcgisscripting.create(9.3) 也可以这样引用gp.workspace = “c:/prog/Marbles“try:cur = gp.InsertCursor(“mvalley_pts.shp“)feat = cur.NewRow()feat.id = 12feat.Name = “Sky High Lake Camp“pnt = gp.CreateObject(“Point“)pnt.x = 485339pnt.y = 4600001feat.shape = pntcur.InsertRow(feat)del curexcept:print gp.getmessages()if cur: del cur挑战 1: