




已閱讀5頁(yè),還剩63頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Python腳本使用詳解目錄寫(xiě)在前面的話(huà)2前言2一、PYTHON語(yǔ)言基礎(chǔ)31數(shù)學(xué)運(yùn)算符32字符串操作43模塊的使用(Modules)54使用def構(gòu)建函數(shù)65流程控制結(jié)構(gòu):If,While,F(xiàn)or66簡(jiǎn)單輸入和輸出9二、ARCGIS&PYTHON101如何創(chuàng)建地理處理對(duì)象(geoprocessor object)102獲取地理處理幫助102.1舉例:如何使用Geoprocessor Programming Model中的Lists113使用地理處理工具Toolboxes和Aliases114在建模中使用腳本(Scripts in ModelBuilder)125 在PythonWin里調(diào)試地理處理腳本185.1 調(diào)試選擇和消息195.2PythonWin的調(diào)試工具205.3地理處理工具舉例216使用描述(Describe)和存在(Exists)獲取數(shù)據(jù)信息216.1描述226.2存在(Exists)236.3在循環(huán)中使用描述和存在237在Python腳本中使用地圖代數(shù)(Map Algebra)268數(shù)據(jù)管理和指針(Data Management and Cursors)278.1數(shù)據(jù)管理(Data Management)278.2指針(Cursors)28附錄1:地理處理腳本中輸入&輸出方法指南31附錄2:其他32寫(xiě)在前面的話(huà)一直想學(xué)習(xí)ArcGIS中的Python腳本,大四下半學(xué)期終于有了時(shí)間,可是想找到這么一本好的教材不容易。茫?;ヂ?lián)網(wǎng),終于找到了舊金山州立大學(xué)Jerry Davis教授的個(gè)人主頁(yè),對(duì)其中Geoprocessing Scripts With Python如獲至寶,獨(dú)樂(lè)樂(lè)不如眾樂(lè)樂(lè),現(xiàn)在將其教程翻譯并結(jié)合自己的學(xué)習(xí)情況給出總結(jié)。希望能夠給更多想學(xué)習(xí)Python的同學(xué)一個(gè)參考。另外,在我剛開(kāi)始接觸Python時(shí),是看了臺(tái)灣輔仁大學(xué)一位老師的視頻課件,在此致謝。我想從兩個(gè)大部分總結(jié):一、Python語(yǔ)言基礎(chǔ);二、ArcGIS&Python。其中第一部分參考了Python精要參考(第二版)、Python編程金典(讀書(shū)筆記)等書(shū)籍文獻(xiàn)。對(duì)于多數(shù)讀者來(lái)說(shuō),可能或多或少有一些編程基礎(chǔ),所以理解起來(lái)應(yīng)該不成問(wèn)題。文中多數(shù)數(shù)據(jù)來(lái)自Jerry Davis教授的主頁(yè),放在“C:prog”目錄下,為了直觀(guān),我將運(yùn)算結(jié)果一并編輯,方便參考。值得一提的是ArcGIS的在線(xiàn)幫助文檔,一個(gè)實(shí)時(shí)更新的GIS寶庫(kù),很多專(zhuān)業(yè)性知識(shí)都可以找到答案,點(diǎn)擊鏈接ArcGIS10中文幫助、ArcGIS9.3.1或9.3英文幫助。獲取更過(guò)腳本例子來(lái)學(xué)習(xí) :ESRI的地理處理模型和腳本工具庫(kù)是個(gè)不錯(cuò)的選擇。由于我也是初次接觸,翻譯或者心得難免有紕漏之處,希望同仁們可以多多交流!前言在GIS建?;騁IS數(shù)據(jù)管理中,你可能經(jīng)常需要處理一系列步驟才可以完成的工作;你可能有一個(gè)工作目錄下的數(shù)據(jù)需要重投影、裁剪到研究區(qū)域,或者用某種方法組合成期望的結(jié)果;我們也經(jīng)常需要根據(jù)不同情形用不同方法處理數(shù)據(jù),因此我們需要作出選擇,而高質(zhì)量的決策需要考慮很多低水平的決策,這可以通過(guò)腳本程序模型輔助完成。腳本編程的主要目的是使枯燥的處理數(shù)據(jù)工作自動(dòng)化,通過(guò)邏輯來(lái)指揮處理過(guò)程。我想自動(dòng)化和邏輯是關(guān)鍵,它們區(qū)別于我們多數(shù)使用計(jì)算機(jī)時(shí)的交互活動(dòng)。我們發(fā)E-mail,寫(xiě)文章或者設(shè)計(jì)地圖,都需要和計(jì)算機(jī)交互,而處理一系列數(shù)據(jù),我們需要自動(dòng)化和利用邏輯來(lái)指導(dǎo)自動(dòng)化。在地理處理腳本邏輯中,我們需要在允許我們做的事情中作出決定,比如,處理柵格數(shù)據(jù)不同于矢量數(shù)據(jù),或?yàn)闆](méi)投影的數(shù)據(jù)設(shè)置投影,或處理僅在特定時(shí)間搜集的數(shù)據(jù)集。對(duì)于重要的GIS工作來(lái)說(shuō),腳本以及其他形式的程序是必需的,而非可有可無(wú)。在接下來(lái)的聯(lián)系中,我們會(huì)探索Python的使用以及創(chuàng)建腳本來(lái)使用ArcGIS里眾多的地理處理工具。所有你能在A(yíng)rcToolbox或Model中使用的工具都能夠用在Python腳本中,這些腳本可以生成腳本工具,像其他地理處理工具一樣使用。一、Python語(yǔ)言基礎(chǔ)安裝PythonWin,在A(yíng)rcGisDesktop9.3.isoDesktopPythonWin目錄下可以找到PythonWin的安裝程序,默認(rèn)是不安裝的,。同時(shí)會(huì)安裝win32com以及允許任何腳本在基于Dispatch的地理處理過(guò)程中工作。ArcGIS10中引入了全新的Python Window來(lái)增強(qiáng)內(nèi)嵌的Python體驗(yàn)。警告:不要嘗試更新隨ArcGIS安裝的Python到一個(gè)新的版本!下面介紹Python的一些簡(jiǎn)單語(yǔ)法和規(guī)則。1數(shù)學(xué)運(yùn)算符Python提供了多樣化的通用數(shù)學(xué)運(yùn)算符多數(shù)編程語(yǔ)言的特征,以及許多通過(guò)import的modules提供的符號(hào)。常用的有+,-,*,/,*(冪),%(取模,即除后的余數(shù))。下面的表格顯示了整型(Integer)和浮點(diǎn)型(Float)各種組合運(yùn)算的結(jié)果,記住一條規(guī)則,只要參與運(yùn)算的有浮點(diǎn)型,則結(jié)果為浮點(diǎn)型;全為整型時(shí),結(jié)果才為整型。輸入表達(dá)式結(jié)果Notes2+35整型結(jié)果2.+35.02.是浮點(diǎn)型,結(jié)果浮點(diǎn)型2-3-12*36整型結(jié)果2.*36.0浮點(diǎn)型5/22整型5./22.55%21取模Az=270Newaz=az+180Print newaz%36090取模的用途之一方位角加180后逆轉(zhuǎn)方向5*22525*0.55.0沒(méi)有sqrt()功能,除非添加math模塊2字符串操作注:使用Python幫助:有超過(guò)30種內(nèi)置方法來(lái)處理字符,請(qǐng)到Sequence Types下的String Methods尋找?guī)椭?!字符串是一串字母,比如San Francisco,字符串下標(biāo)從0開(kāi)始。學(xué)習(xí)字符串語(yǔ)法的最好方法是自己動(dòng)手嘗試,下標(biāo)展示之:輸入結(jié)果Notesprint zhulj.capitalize()Zhuljs.capitalize()即將capitalize()方法用于ss=zhuljprint s.capitalize()print s0zStrings可以像一個(gè)字母列表一樣處理,第一個(gè)字母下標(biāo)為0,某個(gè)字符段可以用1:3來(lái)格式化:從第1個(gè)的開(kāi)頭到第3個(gè)的開(kāi)頭,不包括下標(biāo)為3的字母;s-1表示倒過(guò)來(lái)第一個(gè),相當(dāng)于slen(s)-1s1=s1print s1hprint s-2:ljprint s2:3uprint s2:4ulprint s2:,s:5ulj zhuljs2=s.upper()print s2ZHULJ我們可以將字符串方法的結(jié)果賦給新的變量s3=s+s2print s3zhuljZHULJ字符串組合用“+”print s*3zhuljzhuljzhulj字符串重復(fù)用“*”,后為重復(fù)次數(shù)selstr=elev1000print selstrelev1000字符串可以使用單引號(hào)或雙引號(hào),跨行時(shí)用雙引號(hào)。othersel=”elev1000”print otherselelev1000print s.isupper()False一些方法返回值為布爾型(True或False),一些返回索引值(下標(biāo)值)print s2.isupper()Truep=d:/work/lu.shpprint p.find(.)10print p.find(/)2plist=p.split(/)print plistd:, work, lu.shp你可以用split()方法解析出不同的字符串片段,并創(chuàng)建一個(gè)列表(List),我們可以使用其中不同的元素print plist0d:print plist1workp2=d:worksoil.shpprint p2d:worksoil.shp反斜線(xiàn)“”和某些字母一起有特殊用法,如n為換行,“”為轉(zhuǎn)義字符,如“”則表示“”print Jerrys KidsJerrys Kidsprint JerrysnKidsJerrysKidsp3=rd:worksoil.shpprint p3d:worksoil.shp字符串前加“r”則強(qiáng)制“”代表其本身,而非轉(zhuǎn)義字符,這對(duì)于文件路徑的操作很方便3模塊的使用(Modules)Python提供了一系列內(nèi)置的方法(大量依賴(lài)于模塊)用于通用編程。Python安裝時(shí)自帶了大量Modules,最常用的有math,sys,random,array以及os.path。當(dāng)然還有好多Modules可以下載,比如數(shù)字處理(Numeric)numpy,可在或里搜索。/moin/NumericAndScientific頁(yè)面中列舉了一些。使用Module前,必須import之。通常我們會(huì)將一行import 放在程序頂部,比如:import arcgisscripting當(dāng)然,這不必成為你程序的第一行,但必須在使用它里面方法之前。當(dāng)要引用多個(gè)模塊是,中間用逗號(hào)分隔,比如:import arcgisscripting,sys,string,os,math我們也可以自己為頻繁使用的方法創(chuàng)建Module,下面,我們開(kāi)始體驗(yàn)內(nèi)置的Modules。math和random模塊很多常用的數(shù)學(xué)計(jì)算功能都可以通過(guò)math找到,比如三角計(jì)算或?qū)?shù)計(jì)算,如果要使用復(fù)雜數(shù)字,就使用cmath模塊。和之前一樣,通過(guò)以下表格來(lái)體現(xiàn)模塊的使用:輸入結(jié)果Notesimport mathprint math.log10(100)2.0以10為底的對(duì)數(shù)print math.log(100)4.60517018599自然對(duì)數(shù)print math.pi3一個(gè)靜態(tài)常量,所以不需要括弧pi=math.piprint pi3果不想總是輸入“math.pi”可以將其賦給一變量pi3.1415926535897931不需要print即可查看變量值print math.sin(radians)print math.cos(radians)print math.tan(radians)三角函數(shù)的計(jì)算是弧度制degrad=pi/18045*degrad0.78539816339744828度轉(zhuǎn)化為弧度sin=math.sinsin(45*degrad)sin(90*degrad)0.707106781186547461.0即使功能函數(shù)(像sin)都可以賦給一個(gè)變量math.e2.7182818284590451math.hypot(3,4)5.0此方法是求三角形的斜邊x1=520382;y1=4152373x2=520475;y2=4152963不同賦值語(yǔ)句間用“;”分隔xr=x2-x1yr=y2-y1math.hypot(xr,yr)math.sqrt(xr*2+yr*2)(xr*xr+yr*yr)*0.5597.28468923956189不同的方式,相同的結(jié)果import randomrandom.random()0.27281588185756478random()方法,每次結(jié)果都不同,值域?yàn)?.0,1.0)rnd=random.randomrnd()0.4456393835072503mu=50s=10print random.gauss(mu,s)46.5282021944使用def構(gòu)建函數(shù)有點(diǎn)像Module,但更簡(jiǎn)單,函數(shù)是一個(gè)自己定義功能,用在之后的代碼中,并且提供任何你想要使用的參數(shù)。這個(gè)函數(shù)從此可像變量那樣在程序中使用,結(jié)合例子更容易理解。接下來(lái)的代碼定義了一個(gè)將度轉(zhuǎn)換為弧度的簡(jiǎn)單函數(shù),同時(shí)也定義了一個(gè)弧度轉(zhuǎn)換為度的函數(shù),它們和Excel內(nèi)置的函數(shù)類(lèi)似。import mathdef radians(angdeg): return angdeg*math.pi/180def degrees(angrad): return angrad*180/math.piprint math.sin(radians(45)print degrees(math.acos(0.5)運(yùn)行之,得到結(jié)果:0.707106781187 60.0 5流程控制結(jié)構(gòu):If,While,F(xiàn)or任何腳本或編程語(yǔ)言的一個(gè)重要特征就是執(zhí)行一系列不同情形語(yǔ)句的能力。你想要?jiǎng)?chuàng)建一系列山影柵格來(lái)代表夏天、冬天和春秋分。山影(hillshade)工具需要有太陽(yáng)高度角和方位角作為輸入?yún)?shù)。重要日期太陽(yáng)傾角夏至(6月21日)23.44春秋分(3月21日,9月21日)0冬至(12月21日)-23.44接下來(lái)是一段相當(dāng)簡(jiǎn)單的代碼,通過(guò)太陽(yáng)傾角(太陽(yáng)光線(xiàn)正午垂直照射的緯度)獲取太陽(yáng)角和方位角以及緯度。輸入兩個(gè)參數(shù):lat(研究區(qū)域的緯度,南半球?yàn)樨?fù))和decl(太陽(yáng)傾角),由此得到sunangle和azimuth:lat=30decl=20sunangle=90-lat+declazimuth=180if sunangle90: sunangle=180-sunangle azimuth=0print sunangle,azimuth上面的例子中l(wèi)at和decl強(qiáng)制賦了值。有三種流程控制操作:if 僅在一個(gè)特定情形下才執(zhí)行語(yǔ)句;while 當(dāng)一種情形存在下,持續(xù)執(zhí)行語(yǔ)句for 遍歷一系列值這些語(yǔ)法和def有些相似:初始語(yǔ)句后加頓號(hào)、需要執(zhí)行的語(yǔ)句塊有縮進(jìn)。這三個(gè)結(jié)構(gòu)的一些重要的公共特征:if、while、for語(yǔ)句均以冒號(hào)結(jié)尾,接下來(lái)是縮進(jìn)的代碼塊,用于if、while、for定義的情形。在腳本編寫(xiě)窗口,你會(huì)發(fā)現(xiàn),你在一行末尾打上冒號(hào)后,下一行自動(dòng)縮進(jìn),在接下來(lái)的一行按下退格鍵取消縮進(jìn)。如果你只需做一件事情,你可以在冒號(hào)后面同一行添加簡(jiǎn)短的語(yǔ)句,比如:if x0: print x 比0大print 下一行不要縮進(jìn)了。if(continued)接下來(lái),我們會(huì)探索一下另一個(gè)方便的模塊:os.path:開(kāi)始之前,在d:/下創(chuàng)建一個(gè)“testfolder”文件夾,然后新建一個(gè)“test.txt”文件;嘗試以下代碼段,確保print語(yǔ)句前有縮進(jìn)。import os.pathif os.path.exists(d:/testfolder/test.txt): print 測(cè)試文件夾存在 print txt文件存在elif os.path.exists(d:/testfolder): print 測(cè)試文件夾存在 print 測(cè)試文件夾存在,但txt文件不存在else: print 兩者都不存在可選探索示例接下來(lái)的例子做的事情對(duì)GIS非常重要,但是實(shí)際上不用任何地理處理代碼。USGS7.5米分辨率DEM(數(shù)字高程模型)是文本文件(USGSDEM文件),投影為UTM,UTM北向和東向單位是米,但是高程單位可能是英尺(feet)或米(meters)。因此在獲取垂直或水平距離信息時(shí)會(huì)有問(wèn)題,比如坡度可以通過(guò)垂直距離/水平距離獲得。如果你不在使用Z值之前設(shè)置為0.3048,將會(huì)出現(xiàn)錯(cuò)誤結(jié)果。但是不幸的是,你可能不知道DEM文本文件的垂直單位是英尺還是米。這些信息保存在第539個(gè)字符里,“1”代表英尺,“2”代表米,所以可以通過(guò)讀取這個(gè)文件判斷。下面的腳本演示了上述內(nèi)容:import fileinputinfile=rc:progpendatawoodside.demfirstline=fileinput.input(infile)0unitchar=firstline539unit=(unknown:not a 7.5 DEM?)if unitchar=1:unit=feetif unitchar=2:unit=metersprint nElevation in+ +unitfileinput.close()輸出結(jié)果:Elevation in feetwhile(continued) 運(yùn)行下面的代碼,說(shuō)明了一種while循環(huán):x=1while x10: print x x=x+1屏幕依次輸出19 下面說(shuō)明一下“=”(等于)的概念:x=5z=x=4print z輸出Falsex=5z=x=5print z輸出True“=”是邏輯運(yùn)算符之一,其他有“”(大于)、“=”(大于或等于)、“=”(小于或等于)、“”(不等于)。使用邏輯運(yùn)算符計(jì)算得到結(jié)果為布爾型:true(1)和false(0)。下面例子簡(jiǎn)單體會(huì)一下布爾型表達(dá)式:x=1while x10:print xx=x+1表達(dá)式“x10”結(jié)果是true或false,所以這樣允許我們?cè)谟?jì)算完一種情況時(shí)運(yùn)行一系列代碼。許多情況下我們需要使用條件代碼。while循環(huán)的一個(gè)優(yōu)點(diǎn)是允許我們跳過(guò)整個(gè)部分,如果條件不滿(mǎn)足初始情況。由于while提供一種容易結(jié)束循環(huán)的方法,我們甚至用它代替if語(yǔ)句。當(dāng)循環(huán)一個(gè)數(shù)據(jù)集時(shí)(GIS中很常用的工作)while循環(huán)很有用。在后面地理處理中我們會(huì)接觸一些例子。for 嘗試下面代碼,演示了for循環(huán):for x in 1,2,3,4:(注:1,2,3,4用range(1,5)代替是一樣的)msg=hello worldprint str(x)+ +msg(注:當(dāng)我們希望一個(gè)數(shù)字x和字符串連接時(shí),必須先對(duì)數(shù)字進(jìn)行格式轉(zhuǎn)換即str(x),否則系統(tǒng)報(bào)錯(cuò)) 下面的代碼創(chuàng)建并輸出指定文件夾內(nèi)shp文件名列表(每個(gè)都以.shp結(jié)尾)import osws=c:/prog/hmbareailist=os.listdir(ws)#創(chuàng)建一個(gè)列表保存工作文件夾內(nèi)的文件fcs=#創(chuàng)建一個(gè)空列表,保存結(jié)尾為.shp的文件for i in ilist: if i.endswith(.shp): fcs.append(i)for fc in fcs:print fc(輸出結(jié)果如右圖所示) 下面這個(gè)例子的循環(huán)較多次數(shù)。變量mu是算術(shù)平均數(shù),s是標(biāo)準(zhǔn)差這兩個(gè)是random.gauss()用到的參數(shù),可以嘗試改變n的值查看結(jié)果!import randommu=50s=10z5=mu-s*1.96z95=mu+s*1.96count=0n=100000for i in range(n): x=random.gauss(mu,s) if xz95:count=count+1print float(count)/n(每次運(yùn)行的結(jié)果都不同,但都在0.05左右,即統(tǒng)計(jì)結(jié)果在5%左右)6簡(jiǎn)單輸入和輸出我們現(xiàn)在利用前面計(jì)算太陽(yáng)角代碼的片段,之前是直接指定參數(shù)值,現(xiàn)在我們有很多種方法提供輸入?yún)?shù),現(xiàn)在我們用sys方法。嘗試下面的代碼,點(diǎn)擊(run運(yùn)行)之后,在對(duì)話(huà)框中函數(shù)自變量(Arguments)一欄填入:40 23.44,如下圖:import syslat=float(sys.argv1)decl=float(sys.argv2)#使用arguments(argv)方法從“Arguments”一欄中獲取輸入?yún)?shù),并指定一個(gè)浮點(diǎn)型轉(zhuǎn)換將字符型輸入值傳遞給lat和declsunangle=90-lat+declazimuth=180if sunangle90: sunangle=180-sunangle azimuth=0print 正午太陽(yáng)角=+str(sunangle)print 方位角=+str(azimuth)(結(jié)果:正午太陽(yáng)角=73.44 方位角=180)二、ArcGIS&Python1如何創(chuàng)建地理處理對(duì)象(geoprocessor object)所有g(shù)eoprocessing的Python腳本都可以通過(guò)import arcgisscripting或者win32com去穿件geoprocessor object。下面的例子顯示二者區(qū)別:arcgisscripting module需要在Python2.5.1版本上創(chuàng)建并且需要此版本創(chuàng)建geoprocessor;通過(guò)win32com創(chuàng)建的geoprocessor可以在不同的Python版本上運(yùn)行。#9.3import arcgisscriptinggp=arcgisscripting.create(9.3)gp.workspace=”c:/Tongass”gp.clip_analysis(“standb4”,”clipcov”,”standb4_clip”,”P(pán)OLY”.”1.25”)#Dispatchimport win32com.clientgp=win32com.client.Dispatch(“esriGeoprocessing.GpDispatch.1”)gp.workspace=”c:/Tongass”gp.clip_analysis(“standb4”,”clipcov”,”standb4_clip”,”P(pán)OLY”.”1.25”) 理解ArcGIS中數(shù)據(jù)多樣性格式對(duì)我們理解地理處理工具很有幫助。比如,特征數(shù)據(jù)可能是單個(gè)shp文件;geodatabase(地理數(shù)據(jù)庫(kù),我們可能指定地理數(shù)據(jù)庫(kù)為工作空間);多邊形、弧或點(diǎn)要素的coverage數(shù)據(jù)。當(dāng)我們想遍歷工作空間里的coverage文件時(shí),應(yīng)使用ListDatasets而不是ListFeatureClasses。2獲取地理處理幫助如果你基本熟悉了Python的語(yǔ)法,便可以開(kāi)始熟悉ArcGIS的Geoprocessing啦,獲取這些方法幫助的途徑有兩個(gè): ArcGIS幫助系統(tǒng),Go To Geoprocessing/Automating your work with scripts/Scripting object:Properites and Methods.這里你會(huì)看到Geoprocessor Object,這個(gè)能讓你很方便地獲得所有對(duì)你有用的條目、設(shè)置和其他操作文檔。比如,你想得到特定類(lèi)型的文件,就找到listfeatureclasses方法:fcList=gp.ListFeatureClasses(“w*”,”polygon”)注:此方法的語(yǔ)法為:object.ListFeatureClasses(wildCard As String, FeatureType As String) As Python List = optional wildcard為通配符,和星號(hào)(*)組合使用,如果沒(méi)有通配符則返回工作目錄下的所有feature classes。 Geoprocessor Programming Model(PDF),包含方法(左箭頭表示)、屬性(可讀寫(xiě)的表示為杠鈴形,只讀的表示為部分杠鈴形)2.1舉例:如何使用Geoprocessor Programming Model中的ListsLists(列表)及其屬性和方法在圖表中用紫色標(biāo)出,如下:現(xiàn)在我們?cè)囍帉?xiě)一段腳本列舉出屬性表中所有屬性值(Fields)(以hmbarea柵格土地利用為例,文件存在c:proghmbarea下)import arcgisscripting, sysgp = arcgisscripting.create(9.3) gp.workspace = c:/prog/hmbarea fieldList = gp.ListFields(landuse, *, all)dsc=gp.describe(landuse)print landuse+ +dsc.DataType+:for field in fieldList:. print field.Name, field.Type (此時(shí)輸出結(jié)果如右圖)3使用地理處理工具Toolboxes和Aliases總所周知,地理處理工具在腳本中的使用和ArcToolbox中相同,但是需要提供工具名稱(chēng)來(lái)使用它們。但是記住一個(gè)名稱(chēng)可能有好幾個(gè)工具,比如,裁剪工具(Clip)在Coverage-Analysis-Extract工具集里,另一個(gè)是在Data Management Tools下的Raster工具集下。區(qū)別是每個(gè)工具適用不同的數(shù)據(jù)類(lèi)型,但是我們?nèi)绾卧谀_本中區(qū)分它們呢?在A(yíng)rcToolbox中,我們可以隨意選擇要使用的工具,但在腳本里就必須在某些方面加以區(qū)分。因此我們使用Aliases(別名)已經(jīng)成為工具名稱(chēng)的一部分。每一個(gè)工具都有自己的別名,我們可以通過(guò)右鍵-屬性來(lái)查看:AliaseToolbox“conversion”Conversion“3d”3D Analyst“geocoding”Geocoding“analysis”Analysis“ga”Geostatistical Analyst“arc”Coverage“l(fā)r”Linear Referencing“management”Data Management“sa”Spatial Analyst“cartography”Cartography“stats”Spatial Statistics現(xiàn)在我們用一段腳本來(lái)解釋?zhuān)篿mport arcgisscripting,sysgp=arcgisscripting.create(9.3)gp.Workspace=”c:/prog/hmbarea”gp.overwriteoutput=1 #OverWriteOutput:Boolean,為1表示允許覆蓋已存在文件# 將streams/arc轉(zhuǎn)換為shp文件gp.copyfeatures_management(streams/arc, streams.shp) #利用轉(zhuǎn)換后的shp文件,做200米的緩沖gp.buffer_analysis(streams.shp, stbuff200.shp, 200) # 用做過(guò)緩沖的shp裁剪gp.Clip_analysis(geol.shp, stbuff200.shp, geolstr200.shp)注:上面腳本用“#”注釋的中文內(nèi)容不要出現(xiàn)在腳本文件中,否則會(huì)出現(xiàn)錯(cuò)誤結(jié)果截圖:如果你一次使用一個(gè)工具集中的若干工具,可以通過(guò)環(huán)境設(shè)置省下一些文字:gp.Toolbox = Analysis gp.Buffer(streams.shp, stbuff200.shp, 200) gp.Clip(geol.shp, stbuff200.shp, geolstr200.shp)4在建模中使用腳本(Scripts in ModelBuilder)首先,需要記住的很重要的一點(diǎn)是,ArcToolbox里相當(dāng)數(shù)量的工具實(shí)際上都是腳本。腳本都有一個(gè)圖標(biāo)。比如,空間統(tǒng)計(jì)分析工具(Spatial Staistics tools)幾乎都是Python腳本(一些是模型中使用了腳本)。實(shí)際上,我們可以復(fù)制并編輯這些腳本作為其他用途。為了在ModelBuilder中使用腳本或?qū)⒛_本當(dāng)做ArcToolbox中工具使用,我們需要考慮如何給它輸入值以及讓其設(shè)置輸出值。仍然以太陽(yáng)角計(jì)算代碼為例,我們給其加上兩句引用,四句輸入輸出語(yǔ)句,就可以用作Modelbuilder中的一個(gè)步驟了。編輯下面的腳本,不過(guò)不要再PythonWin中運(yùn)行之,因?yàn)間etparameterastext和setparameterastext只能用在腳本工具(ArcToolbox或Modelbuilder)中。import arcgisscriptinggp=arcgisscripting.create(9.3)lat=float(gp.getparameterastext(0)decl=float(gp.getparameterastext(1)sunangle=90-lat+declazimuth=180if sunangle90: sunangle=180-sunangle azimuth=0gp.setparameterastext(2,str(sunangle) gp.setparameterastext(3,str(azimuth)這段代碼中的“新面孔”:getparameterastext:是Python傳遞給geoprocessor(我們稱(chēng)之為gp)的一個(gè)方法,允許工具提供輸入?yún)?shù)。每次你運(yùn)行這個(gè)工具時(shí),都會(huì)看到一個(gè)對(duì)話(huà)框,提示輸入?yún)?shù),這個(gè)方法允許你在接下來(lái)的程序中使用。索引0和1指第一個(gè)和第二個(gè)參數(shù)。setparameterastext:和getparameterastext相反,它傳遞第二個(gè)條目(比如str(sunangle)的值)給指定的輸出參數(shù)。前兩個(gè)參數(shù)索引為0和1,所以接下來(lái)輸出參數(shù)的索引為2和3。然后,我們需要將腳本加進(jìn)工具(Making a script into a tool),那樣才能在A(yíng)rcToolbox或ModelBuilder或Command line中使用。如前面提到的那樣,這個(gè)腳本只能用于工具,包括輸入/輸出方法是PythonWin不能處理的,但這些是多數(shù)工具必需的。 在A(yíng)rcCatalog里,定位到Python腳本保存的文件夾,最好和數(shù)據(jù)在一個(gè)盤(pán)里,右鍵-新建toolbox。當(dāng)然也可以使用之前創(chuàng)建的toolbox。 在A(yíng)rcToolbox里,右鍵toolbox,選添加-scripts,填寫(xiě)如下圖:l 注意:腳本文件是一個(gè)腳本工具的參考!非常重要的一點(diǎn),你使用腳本創(chuàng)建了一個(gè)腳本工具,但是腳本本身并沒(méi)有和工具一起保存,腳本工具作為toolbox的一部分保存在“*.tbx”文件中。你也可以右鍵腳本工具點(diǎn)擊“編輯”,出現(xiàn)PythonWin或其他任何IDE窗口,這看起來(lái)好像是腳本存在于工具中。所以,記得移動(dòng)時(shí)將腳本工具文件和腳本本身一起拷貝?!跋乱徊健焙笫菂?shù)配置頁(yè)面,如下圖設(shè)置各參數(shù)如表格所示:Display NameData typeDirectionDefaultLatitudeDoubleinput0DeclinationDoubleinput0Sun AngleDoubleoutput35AzimuthDoubleoutput300 現(xiàn)在可以運(yùn)行此toolbox了,對(duì)話(huà)框提示你輸入latitude和declination。工具是否正確運(yùn)行呢?如果是的話(huà),你應(yīng)該可以看到“Completed”,你可能會(huì)看到有一黑色窗體一閃而過(guò),不用擔(dān)心。那么,它是干什么的呢?還記得結(jié)果是輸出兩個(gè)數(shù)字參數(shù),那么,這些數(shù)字哪去了呢?很好的問(wèn)題,這僅能說(shuō)明你能創(chuàng)建一個(gè)工具,但是不能想ArcToolbox那樣運(yùn)行。比如輸出一種數(shù)據(jù),柵格或特征數(shù)據(jù)(.shp)之類(lèi)的。 但是它能在作為Modelbuilder工具正常運(yùn)行,下面我們將使用它的輸出參數(shù)創(chuàng)建一個(gè)hillshade。 在你的toolbox中新建一個(gè)model,將剛才創(chuàng)建的腳本工具(script tool)拖進(jìn)來(lái)。 雙擊工具,輸入?yún)?shù),初始化之。打開(kāi)“Sun Angle”和“Azimuth”發(fā)現(xiàn)它們還是默認(rèn)值,說(shuō)明此腳本工具還沒(méi)有運(yùn)行。右鍵單擊工具,選擇Run,然后發(fā)現(xiàn)兩個(gè)輸出參數(shù)已經(jīng)改變!需要注意的是:latitude范圍是-9090,declination范圍是-23.4423.44。嘗試輸入latitude -70,declination 23.5,你會(huì)得到什么?為什么? 確保你已經(jīng)得到值域內(nèi)的太陽(yáng)角和方位角,它們將是構(gòu)建hillshade的輸入?yún)?shù)。首先,添加hillshade工具,雙擊指定一個(gè)elevation柵格數(shù)據(jù)(這里我選擇了marbles文件夾下的elevation),用下拉條指定azimuth和altitude值為azimuth和sun angle。運(yùn)行,然后右鍵單擊輸出文件,選“Add to Display”在A(yíng)rcMap里查看結(jié)果。 探索1:如果你想通過(guò)日期獲取太陽(yáng)傾角,該怎么做呢?嘗試下面代碼,保存為getnoonsunfromdata.py,現(xiàn)在有五個(gè)參數(shù),如下表進(jìn)行正確設(shè)置:Display NameData typeTypeDirectionDefaultMonthLongRequiredinput1DateLongRequiredinput1LatitudeDoubleRequiredinput0Sun AngleDoubleDerivedoutput35AzimuthDoubleDerivedoutput300import win32com.client,sys,mathgp=win32com.client.Dispatch(esriGeoprocessing.GpDispatch.1)#構(gòu)建兩個(gè)函數(shù),首先判斷輸入月/日的合法性,然后獲取是一年中的第幾天def jdate(im, id): # 通過(guò)年月日起返回一年中的第幾天 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 0) and (id 90: sunangle = 180-sunangle azimuth = 0gp.setparameterastext(3,str(sunangle)gp.setparameterastext(4,str(azimuth)我們?cè)谒伎歼h(yuǎn)一點(diǎn),如何根據(jù)一天內(nèi)的任何時(shí)間而不是正午時(shí)間,獲取太陽(yáng)角和方位角呢?感興趣的可以從本文開(kāi)頭的鏈接中下砸相應(yīng)代碼學(xué)習(xí)。 探索2:如何在PythonWin里運(yùn)行這個(gè)腳本?首先我們得明確幾個(gè)點(diǎn):我們將把hillshade作為腳本的一部分使用,并為其提供輸入?yún)?shù):一個(gè)高程?hào)鸥瘢╡levation raster);GetParameterastext僅在用作工具時(shí)起作用。下表為腳本工具的參數(shù)設(shè)置:Display nameData typeTypeDirectionDefaultMonthLongRequiredInputDateLongRequiredInputLatitudeDoubleRequiredInputWorkspaceWorkspaceRequiredInputElevationRaster DatasetRequiredInputHillshadeStringRequiredInput代碼如下:import win32com.client, sys, mathgp = win32com.client.Dispatch(esriGeoprocessing.GPDispatch.1)#函數(shù)定義,同上,下面僅給出函數(shù)名稱(chēng):def jdate(im, id):def declin(day):# 主程序,使用sys.argv代替getparameterastext()month = int(sys.argv1)date = int(sys.argv2)lat = float(sys.argv3)gp.Workspace = sys.argv4#輸入時(shí)注意,路徑應(yīng)為反斜杠“”elev = sys.argv5hillsh = sys.argv6#給輸出hillshade指定文件名decl = declin(jdate(month, date)sunangle = 90 - lat + declazimuth = 180if sunangle 90: sunangle = 180-sunangle azimuth = 0gp.addmessage(about to try)try: gp.OverwriteOutput = 1 gp.addmessage(after overwriteoutputs setting, + gp.workspace + / + hillsh) gp.CheckOutExtension(spatial) gp.addmessage(gp.workspace + / + hillsh) gp.HillShade_sa (elev, gp.workspace + / + str(hillsh), azimuth, sunangle) gp.addmessage(done with hillshade) gp.CheckInExtension(spatial)except:# print gp.getmessages() gp.addmessage(gp.getmessages() gp.CheckInExtension(spatial)閱讀代碼發(fā)現(xiàn),第一個(gè)輸入?yún)?shù)不適用的getparameterastext(0),而是sys.argv1,這是因?yàn)間etparameterastext()方法只在工具中起作用,而sys.argv有同樣的效果,索引從1而不是0開(kāi)始,當(dāng)然,這需要首先引用sys模塊。這里我們直接指定輸出文件在輸入數(shù)據(jù)文件夾內(nèi),省去了setparameterastext()方法,當(dāng)然這個(gè)方法在PythonWin中也無(wú)法運(yùn)行。嘗試輸入?yún)?shù)如下圖,得到右下結(jié)果:5 在PythonWin里調(diào)試地理處理腳本既然我們已經(jīng)認(rèn)真地學(xué)會(huì)了從Python中創(chuàng)建并運(yùn)行地理統(tǒng)計(jì)工具,那么現(xiàn)在需要考慮如何調(diào)試我們的程序了。我們需要經(jīng)常在Python和添加的地理處理系統(tǒng)引用之間調(diào)試程序。當(dāng)一個(gè)地理處理工具運(yùn)行失敗后,我們需要從Pythonwin中得到一個(gè)豐富的消息,而不是“未知錯(cuò)誤”。5.1 調(diào)試選擇和消息Python優(yōu)于A(yíng)ML的優(yōu)點(diǎn)之一是它有更好的調(diào)試方法,調(diào)試程序有很多選擇,這里不能一一列舉。 打印語(yǔ)句(Print statements)一開(kāi)始就養(yǎng)成良好的調(diào)試方法是:將變量的當(dāng)前值或腳本的處理過(guò)程打印在屏幕上。比如,對(duì)之前的一段腳本加以修改:import arcgisscripting,sysgp=arcgisscripting.cre
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖像轉(zhuǎn)換行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 2025年度現(xiàn)澆施工合同:跨海大橋主橋體建設(shè)
- 二零二五年度互聯(lián)網(wǎng)行業(yè)員工勞動(dòng)權(quán)益保護(hù)協(xié)議
- 2025年水貂圓沿女帽行業(yè)深度研究分析報(bào)告
- 10-1 勸學(xué)(教學(xué)設(shè)計(jì))-2024-2025學(xué)年高一語(yǔ)文上學(xué)期同步教學(xué)教學(xué)設(shè)計(jì)專(zhuān)輯(統(tǒng)編版必修上冊(cè))
- 體育產(chǎn)業(yè)融資借款居間協(xié)議
- 2025年度車(chē)輛維修后綠色維修技術(shù)與可持續(xù)發(fā)展協(xié)議
- 淮安市公寓裝修合同范本
- 五千以?xún)?nèi)加減混合兩步運(yùn)算單元檢測(cè)題
- 機(jī)械制造工藝試題含答案
- 幼兒園課件:時(shí)鐘國(guó)王
- 最值問(wèn)題-阿氏圓
- 社區(qū)獲得性肺炎教學(xué)查房
- 現(xiàn)金盤(pán)點(diǎn)表完整版
- 病例展示(皮膚科)
- 7、核生化防護(hù)教案
- 海上鋼琴師英語(yǔ)PPT
- GB/T 39750-2021光伏發(fā)電系統(tǒng)直流電弧保護(hù)技術(shù)要求
- GB/T 16839.1-2018熱電偶第1部分:電動(dòng)勢(shì)規(guī)范和允差
- 教科版五年級(jí)科學(xué)下冊(cè)【全冊(cè)全套】課件
- 大數(shù)據(jù)專(zhuān)業(yè)實(shí)習(xí)報(bào)告范文共5篇
評(píng)論
0/150
提交評(píng)論