Python腳本入門學習經典手冊.doc_第1頁
Python腳本入門學習經典手冊.doc_第2頁
Python腳本入門學習經典手冊.doc_第3頁
Python腳本入門學習經典手冊.doc_第4頁
Python腳本入門學習經典手冊.doc_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Python腳本使用詳解目錄寫在前面的話2前言2一、PYTHON語言基礎31數學運算符32字符串操作43模塊的使用(Modules)54使用def構建函數65流程控制結構:If,While,For66簡單輸入和輸出9二、ARCGIS&PYTHON101如何創(chuàng)建地理處理對象(geoprocessor object)102獲取地理處理幫助102.1舉例:如何使用Geoprocessor Programming Model中的Lists113使用地理處理工具Toolboxes和Aliases114在建模中使用腳本(Scripts in ModelBuilder)125 在PythonWin里調試地理處理腳本185.1 調試選擇和消息195.2PythonWin的調試工具205.3地理處理工具舉例216使用描述(Describe)和存在(Exists)獲取數據信息216.1描述226.2存在(Exists)236.3在循環(huán)中使用描述和存在237在Python腳本中使用地圖代數(Map Algebra)268數據管理和指針(Data Management and Cursors)278.1數據管理(Data Management)278.2指針(Cursors)28附錄1:地理處理腳本中輸入&輸出方法指南31附錄2:其他32寫在前面的話一直想學習ArcGIS中的Python腳本,大四下半學期終于有了時間,可是想找到這么一本好的教材不容易。茫?;ヂ摼W,終于找到了舊金山州立大學Jerry Davis教授的個人主頁,對其中Geoprocessing Scripts With Python如獲至寶,獨樂樂不如眾樂樂,現在將其教程翻譯并結合自己的學習情況給出總結。希望能夠給更多想學習Python的同學一個參考。另外,在我剛開始接觸Python時,是看了臺灣輔仁大學一位老師的視頻課件,在此致謝。我想從兩個大部分總結:一、Python語言基礎;二、ArcGIS&Python。其中第一部分參考了Python精要參考(第二版)、Python編程金典(讀書筆記)等書籍文獻。對于多數讀者來說,可能或多或少有一些編程基礎,所以理解起來應該不成問題。文中多數數據來自Jerry Davis教授的主頁,放在“C:prog”目錄下,為了直觀,我將運算結果一并編輯,方便參考。值得一提的是ArcGIS的在線幫助文檔,一個實時更新的GIS寶庫,很多專業(yè)性知識都可以找到答案,點擊鏈接ArcGIS10中文幫助、ArcGIS9.3.1或9.3英文幫助。獲取更過腳本例子來學習 :ESRI的地理處理模型和腳本工具庫是個不錯的選擇。由于我也是初次接觸,翻譯或者心得難免有紕漏之處,希望同仁們可以多多交流!前言在GIS建?;騁IS數據管理中,你可能經常需要處理一系列步驟才可以完成的工作;你可能有一個工作目錄下的數據需要重投影、裁剪到研究區(qū)域,或者用某種方法組合成期望的結果;我們也經常需要根據不同情形用不同方法處理數據,因此我們需要作出選擇,而高質量的決策需要考慮很多低水平的決策,這可以通過腳本程序模型輔助完成。腳本編程的主要目的是使枯燥的處理數據工作自動化,通過邏輯來指揮處理過程。我想自動化和邏輯是關鍵,它們區(qū)別于我們多數使用計算機時的交互活動。我們發(fā)E-mail,寫文章或者設計地圖,都需要和計算機交互,而處理一系列數據,我們需要自動化和利用邏輯來指導自動化。在地理處理腳本邏輯中,我們需要在允許我們做的事情中作出決定,比如,處理柵格數據不同于矢量數據,或為沒投影的數據設置投影,或處理僅在特定時間搜集的數據集。對于重要的GIS工作來說,腳本以及其他形式的程序是必需的,而非可有可無。在接下來的聯系中,我們會探索Python的使用以及創(chuàng)建腳本來使用ArcGIS里眾多的地理處理工具。所有你能在ArcToolbox或Model中使用的工具都能夠用在Python腳本中,這些腳本可以生成腳本工具,像其他地理處理工具一樣使用。一、Python語言基礎安裝PythonWin,在ArcGisDesktop9.3.isoDesktopPythonWin目錄下可以找到PythonWin的安裝程序,默認是不安裝的,。同時會安裝win32com以及允許任何腳本在基于Dispatch的地理處理過程中工作。ArcGIS10中引入了全新的Python Window來增強內嵌的Python體驗。警告:不要嘗試更新隨ArcGIS安裝的Python到一個新的版本!下面介紹Python的一些簡單語法和規(guī)則。1數學運算符Python提供了多樣化的通用數學運算符多數編程語言的特征,以及許多通過import的modules提供的符號。常用的有+,-,*,/,*(冪),%(取模,即除后的余數)。下面的表格顯示了整型(Integer)和浮點型(Float)各種組合運算的結果,記住一條規(guī)則,只要參與運算的有浮點型,則結果為浮點型;全為整型時,結果才為整型。輸入表達式結果Notes2+35整型結果2.+35.02.是浮點型,結果浮點型2-3-12*36整型結果2.*36.0浮點型5/22整型5./22.55%21取模Az=270Newaz=az+180Print newaz%36090取模的用途之一方位角加180后逆轉方向5*22525*0.55.0沒有sqrt()功能,除非添加math模塊2字符串操作注:使用Python幫助:有超過30種內置方法來處理字符,請到Sequence Types下的String Methods尋找?guī)椭?!字符串是一串字母,比如San Francisco,字符串下標從0開始。學習字符串語法的最好方法是自己動手嘗試,下標展示之:輸入結果Notesprint zhulj.capitalize()Zhuljs.capitalize()即將capitalize()方法用于ss=zhuljprint s.capitalize()print s0zStrings可以像一個字母列表一樣處理,第一個字母下標為0,某個字符段可以用1:3來格式化:從第1個的開頭到第3個的開頭,不包括下標為3的字母;s-1表示倒過來第一個,相當于slen(s)-1s1=s1print s1hprint s-2:ljprint s2:3uprint s2:4ulprint s2:,s:5ulj zhuljs2=s.upper()print s2ZHULJ我們可以將字符串方法的結果賦給新的變量s3=s+s2print s3zhuljZHULJ字符串組合用“+”print s*3zhuljzhuljzhulj字符串重復用“*”,后為重復次數selstr=elev1000print selstrelev1000字符串可以使用單引號或雙引號,跨行時用雙引號。othersel=”elev1000”print otherselelev1000print s.isupper()False一些方法返回值為布爾型(True或False),一些返回索引值(下標值)print s2.isupper()Truep=d:/work/lu.shpprint p.find(.)10print p.find(/)2plist=p.split(/)print plistd:, work, lu.shp你可以用split()方法解析出不同的字符串片段,并創(chuàng)建一個列表(List),我們可以使用其中不同的元素print plist0d:print plist1workp2=d:worksoil.shpprint p2d:worksoil.shp反斜線“”和某些字母一起有特殊用法,如n為換行,“”為轉義字符,如“”則表示“”print Jerrys KidsJerrys Kidsprint JerrysnKidsJerrysKidsp3=rd:worksoil.shpprint p3d:worksoil.shp字符串前加“r”則強制“”代表其本身,而非轉義字符,這對于文件路徑的操作很方便3模塊的使用(Modules)Python提供了一系列內置的方法(大量依賴于模塊)用于通用編程。Python安裝時自帶了大量Modules,最常用的有math,sys,random,array以及os.path。當然還有好多Modules可以下載,比如數字處理(Numeric)numpy,可在或里搜索。/moin/NumericAndScientific頁面中列舉了一些。使用Module前,必須import之。通常我們會將一行import 放在程序頂部,比如:import arcgisscripting當然,這不必成為你程序的第一行,但必須在使用它里面方法之前。當要引用多個模塊是,中間用逗號分隔,比如:import arcgisscripting,sys,string,os,math我們也可以自己為頻繁使用的方法創(chuàng)建Module,下面,我們開始體驗內置的Modules。math和random模塊很多常用的數學計算功能都可以通過math找到,比如三角計算或對數計算,如果要使用復雜數字,就使用cmath模塊。和之前一樣,通過以下表格來體現模塊的使用:輸入結果Notesimport mathprint math.log10(100)2.0以10為底的對數print math.log(100)4.60517018599自然對數print math.pi3一個靜態(tài)常量,所以不需要括弧pi=math.piprint pi3果不想總是輸入“math.pi”可以將其賦給一變量pi3.1415926535897931不需要print即可查看變量值print math.sin(radians)print math.cos(radians)print math.tan(radians)三角函數的計算是弧度制degrad=pi/18045*degrad0.78539816339744828度轉化為弧度sin=math.sinsin(45*degrad)sin(90*degrad)0.707106781186547461.0即使功能函數(像sin)都可以賦給一個變量math.e2.7182818284590451math.hypot(3,4)5.0此方法是求三角形的斜邊x1=520382;y1=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不同的方式,相同的結果import randomrandom.random()0.27281588185756478random()方法,每次結果都不同,值域為0.0,1.0)rnd=random.randomrnd()0.4456393835072503mu=50s=10print random.gauss(mu,s)46.5282021944使用def構建函數有點像Module,但更簡單,函數是一個自己定義功能,用在之后的代碼中,并且提供任何你想要使用的參數。這個函數從此可像變量那樣在程序中使用,結合例子更容易理解。接下來的代碼定義了一個將度轉換為弧度的簡單函數,同時也定義了一個弧度轉換為度的函數,它們和Excel內置的函數類似。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)運行之,得到結果:0.707106781187 60.0 5流程控制結構:If,While,For任何腳本或編程語言的一個重要特征就是執(zhí)行一系列不同情形語句的能力。你想要創(chuàng)建一系列山影柵格來代表夏天、冬天和春秋分。山影(hillshade)工具需要有太陽高度角和方位角作為輸入參數。重要日期太陽傾角夏至(6月21日)23.44春秋分(3月21日,9月21日)0冬至(12月21日)-23.44接下來是一段相當簡單的代碼,通過太陽傾角(太陽光線正午垂直照射的緯度)獲取太陽角和方位角以及緯度。輸入兩個參數:lat(研究區(qū)域的緯度,南半球為負)和decl(太陽傾角),由此得到sunangle和azimuth:lat=30decl=20sunangle=90-lat+declazimuth=180if sunangle90: sunangle=180-sunangle azimuth=0print sunangle,azimuth上面的例子中l(wèi)at和decl強制賦了值。有三種流程控制操作:if 僅在一個特定情形下才執(zhí)行語句;while 當一種情形存在下,持續(xù)執(zhí)行語句for 遍歷一系列值這些語法和def有些相似:初始語句后加頓號、需要執(zhí)行的語句塊有縮進。這三個結構的一些重要的公共特征:if、while、for語句均以冒號結尾,接下來是縮進的代碼塊,用于if、while、for定義的情形。在腳本編寫窗口,你會發(fā)現,你在一行末尾打上冒號后,下一行自動縮進,在接下來的一行按下退格鍵取消縮進。如果你只需做一件事情,你可以在冒號后面同一行添加簡短的語句,比如:if x0: print x 比0大print 下一行不要縮進了。if(continued)接下來,我們會探索一下另一個方便的模塊:os.path:開始之前,在d:/下創(chuàng)建一個“testfolder”文件夾,然后新建一個“test.txt”文件;嘗試以下代碼段,確保print語句前有縮進。import os.pathif os.path.exists(d:/testfolder/test.txt): print 測試文件夾存在 print txt文件存在elif os.path.exists(d:/testfolder): print 測試文件夾存在 print 測試文件夾存在,但txt文件不存在else: print 兩者都不存在可選探索示例接下來的例子做的事情對GIS非常重要,但是實際上不用任何地理處理代碼。USGS7.5米分辨率DEM(數字高程模型)是文本文件(USGSDEM文件),投影為UTM,UTM北向和東向單位是米,但是高程單位可能是英尺(feet)或米(meters)。因此在獲取垂直或水平距離信息時會有問題,比如坡度可以通過垂直距離/水平距離獲得。如果你不在使用Z值之前設置為0.3048,將會出現錯誤結果。但是不幸的是,你可能不知道DEM文本文件的垂直單位是英尺還是米。這些信息保存在第539個字符里,“1”代表英尺,“2”代表米,所以可以通過讀取這個文件判斷。下面的腳本演示了上述內容: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()輸出結果:Elevation in feetwhile(continued) 運行下面的代碼,說明了一種while循環(huán):x=1while x10: print x x=x+1屏幕依次輸出19 下面說明一下“=”(等于)的概念:x=5z=x=4print z輸出Falsex=5z=x=5print z輸出True“=”是邏輯運算符之一,其他有“”(大于)、“=”(大于或等于)、“=”(小于或等于)、“”(不等于)。使用邏輯運算符計算得到結果為布爾型:true(1)和false(0)。下面例子簡單體會一下布爾型表達式:x=1while x10:print xx=x+1表達式“x10”結果是true或false,所以這樣允許我們在計算完一種情況時運行一系列代碼。許多情況下我們需要使用條件代碼。while循環(huán)的一個優(yōu)點是允許我們跳過整個部分,如果條件不滿足初始情況。由于while提供一種容易結束循環(huán)的方法,我們甚至用它代替if語句。當循環(huán)一個數據集時(GIS中很常用的工作)while循環(huán)很有用。在后面地理處理中我們會接觸一些例子。for 嘗試下面代碼,演示了for循環(huán):for x in 1,2,3,4:(注:1,2,3,4用range(1,5)代替是一樣的)msg=hello worldprint str(x)+ +msg(注:當我們希望一個數字x和字符串連接時,必須先對數字進行格式轉換即str(x),否則系統報錯) 下面的代碼創(chuàng)建并輸出指定文件夾內shp文件名列表(每個都以.shp結尾)import osws=c:/prog/hmbareailist=os.listdir(ws)#創(chuàng)建一個列表保存工作文件夾內的文件fcs=#創(chuàng)建一個空列表,保存結尾為.shp的文件for i in ilist: if i.endswith(.shp): fcs.append(i)for fc in fcs:print fc(輸出結果如右圖所示) 下面這個例子的循環(huán)較多次數。變量mu是算術平均數,s是標準差這兩個是random.gauss()用到的參數,可以嘗試改變n的值查看結果!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(每次運行的結果都不同,但都在0.05左右,即統計結果在5%左右)6簡單輸入和輸出我們現在利用前面計算太陽角代碼的片段,之前是直接指定參數值,現在我們有很多種方法提供輸入參數,現在我們用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-sunangle azimuth=0print 正午太陽角=+str(sunangle)print 方位角=+str(azimuth)(結果:正午太陽角=73.44 方位角=180)二、ArcGIS&Python1如何創(chuàng)建地理處理對象(geoprocessor object)所有geoprocessing的Python腳本都可以通過import arcgisscripting或者win32com去穿件geoprocessor object。下面的例子顯示二者區(qū)別:arcgisscripting module需要在Python2.5.1版本上創(chuàng)建并且需要此版本創(chuàng)建geoprocessor;通過win32com創(chuàng)建的geoprocessor可以在不同的Python版本上運行。#9.3import arcgisscriptinggp=arcgisscripting.create(9.3)gp.workspace=”c:/Tongass”gp.clip_analysis(“standb4”,”clipcov”,”standb4_clip”,”POLY”.”1.25”)#Dispatchimport win32com.clientgp=win32com.client.Dispatch(“esriGeoprocessing.GpDispatch.1”)gp.workspace=”c:/Tongass”gp.clip_analysis(“standb4”,”clipcov”,”standb4_clip”,”POLY”.”1.25”) 理解ArcGIS中數據多樣性格式對我們理解地理處理工具很有幫助。比如,特征數據可能是單個shp文件;geodatabase(地理數據庫,我們可能指定地理數據庫為工作空間);多邊形、弧或點要素的coverage數據。當我們想遍歷工作空間里的coverage文件時,應使用ListDatasets而不是ListFeatureClasses。2獲取地理處理幫助如果你基本熟悉了Python的語法,便可以開始熟悉ArcGIS的Geoprocessing啦,獲取這些方法幫助的途徑有兩個: ArcGIS幫助系統,Go To Geoprocessing/Automating your work with scripts/Scripting object:Properites and Methods.這里你會看到Geoprocessor Object,這個能讓你很方便地獲得所有對你有用的條目、設置和其他操作文檔。比如,你想得到特定類型的文件,就找到listfeatureclasses方法:fcList=gp.ListFeatureClasses(“w*”,”polygon”)注:此方法的語法為:object.ListFeatureClasses(wildCard As String, FeatureType As String) As Python List = optional wildcard為通配符,和星號(*)組合使用,如果沒有通配符則返回工作目錄下的所有feature classes。 Geoprocessor Programming Model(PDF),包含方法(左箭頭表示)、屬性(可讀寫的表示為杠鈴形,只讀的表示為部分杠鈴形)2.1舉例:如何使用Geoprocessor Programming Model中的ListsLists(列表)及其屬性和方法在圖表中用紫色標出,如下:現在我們試著編寫一段腳本列舉出屬性表中所有屬性值(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 (此時輸出結果如右圖)3使用地理處理工具Toolboxes和Aliases總所周知,地理處理工具在腳本中的使用和ArcToolbox中相同,但是需要提供工具名稱來使用它們。但是記住一個名稱可能有好幾個工具,比如,裁剪工具(Clip)在Coverage-Analysis-Extract工具集里,另一個是在Data Management Tools下的Raster工具集下。區(qū)別是每個工具適用不同的數據類型,但是我們如何在腳本中區(qū)分它們呢?在ArcToolbox中,我們可以隨意選擇要使用的工具,但在腳本里就必須在某些方面加以區(qū)分。因此我們使用Aliases(別名)已經成為工具名稱的一部分。每一個工具都有自己的別名,我們可以通過右鍵-屬性來查看: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現在我們用一段腳本來解釋:import arcgisscripting,sysgp=arcgisscripting.create(9.3)gp.Workspace=”c:/prog/hmbarea”gp.overwriteoutput=1 #OverWriteOutput:Boolean,為1表示允許覆蓋已存在文件# 將streams/arc轉換為shp文件gp.copyfeatures_management(streams/arc, streams.shp) #利用轉換后的shp文件,做200米的緩沖gp.buffer_analysis(streams.shp, stbuff200.shp, 200) # 用做過緩沖的shp裁剪gp.Clip_analysis(geol.shp, stbuff200.shp, geolstr200.shp)注:上面腳本用“#”注釋的中文內容不要出現在腳本文件中,否則會出現錯誤結果截圖:如果你一次使用一個工具集中的若干工具,可以通過環(huán)境設置省下一些文字:gp.Toolbox = Analysis gp.Buffer(streams.shp, stbuff200.shp, 200) gp.Clip(geol.shp, stbuff200.shp, geolstr200.shp)4在建模中使用腳本(Scripts in ModelBuilder)首先,需要記住的很重要的一點是,ArcToolbox里相當數量的工具實際上都是腳本。腳本都有一個圖標。比如,空間統計分析工具(Spatial Staistics tools)幾乎都是Python腳本(一些是模型中使用了腳本)。實際上,我們可以復制并編輯這些腳本作為其他用途。為了在ModelBuilder中使用腳本或將腳本當做ArcToolbox中工具使用,我們需要考慮如何給它輸入值以及讓其設置輸出值。仍然以太陽角計算代碼為例,我們給其加上兩句引用,四句輸入輸出語句,就可以用作Modelbuilder中的一個步驟了。編輯下面的腳本,不過不要再PythonWin中運行之,因為getparameterastext和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(我們稱之為gp)的一個方法,允許工具提供輸入參數。每次你運行這個工具時,都會看到一個對話框,提示輸入參數,這個方法允許你在接下來的程序中使用。索引0和1指第一個和第二個參數。setparameterastext:和getparameterastext相反,它傳遞第二個條目(比如str(sunangle)的值)給指定的輸出參數。前兩個參數索引為0和1,所以接下來輸出參數的索引為2和3。然后,我們需要將腳本加進工具(Making a script into a tool),那樣才能在ArcToolbox或ModelBuilder或Command line中使用。如前面提到的那樣,這個腳本只能用于工具,包括輸入/輸出方法是PythonWin不能處理的,但這些是多數工具必需的。 在ArcCatalog里,定位到Python腳本保存的文件夾,最好和數據在一個盤里,右鍵-新建toolbox。當然也可以使用之前創(chuàng)建的toolbox。 在ArcToolbox里,右鍵toolbox,選添加-scripts,填寫如下圖:l 注意:腳本文件是一個腳本工具的參考!非常重要的一點,你使用腳本創(chuàng)建了一個腳本工具,但是腳本本身并沒有和工具一起保存,腳本工具作為toolbox的一部分保存在“*.tbx”文件中。你也可以右鍵腳本工具點擊“編輯”,出現PythonWin或其他任何IDE窗口,這看起來好像是腳本存在于工具中。所以,記得移動時將腳本工具文件和腳本本身一起拷貝。“下一步”后是參數配置頁面,如下圖設置各參數如表格所示:Display NameData typeDirectionDefaultLatitudeDoubleinput0DeclinationDoubleinput0Sun AngleDoubleoutput35AzimuthDoubleoutput300 現在可以運行此toolbox了,對話框提示你輸入latitude和declination。工具是否正確運行呢?如果是的話,你應該可以看到“Completed”,你可能會看到有一黑色窗體一閃而過,不用擔心。那么,它是干什么的呢?還記得結果是輸出兩個數字參數,那么,這些數字哪去了呢?很好的問題,這僅能說明你能創(chuàng)建一個工具,但是不能想ArcToolbox那樣運行。比如輸出一種數據,柵格或特征數據(.shp)之類的。 但是它能在作為Modelbuilder工具正常運行,下面我們將使用它的輸出參數創(chuàng)建一個hillshade。 在你的toolbox中新建一個model,將剛才創(chuàng)建的腳本工具(script tool)拖進來。 雙擊工具,輸入參數,初始化之。打開“Sun Angle”和“Azimuth”發(fā)現它們還是默認值,說明此腳本工具還沒有運行。右鍵單擊工具,選擇Run,然后發(fā)現兩個輸出參數已經改變!需要注意的是:latitude范圍是-9090,declination范圍是-23.4423.44。嘗試輸入latitude -70,declination 23.5,你會得到什么?為什么? 確保你已經得到值域內的太陽角和方位角,它們將是構建hillshade的輸入參數。首先,添加hillshade工具,雙擊指定一個elevation柵格數據(這里我選擇了marbles文件夾下的elevation),用下拉條指定azimuth和altitude值為azimuth和sun angle。運行,然后右鍵單擊輸出文件,選“Add to Display”在ArcMap里查看結果。 探索1:如果你想通過日期獲取太陽傾角,該怎么做呢?嘗試下面代碼,保存為getnoonsunfromdata.py,現在有五個參數,如下表進行正確設置:Display NameData typeTypeDirectionDefaultMonthLongRequiredinput1DateLongRequiredinput1LatitudeDoubleRequiredinput0Sun AngleDoubleDerivedoutput35AzimuthDoubleDerivedoutput300import win32com.client,sys,mathgp=win32com.client.Dispatch(esriGeoprocessing.GpDispatch.1)#構建兩個函數,首先判斷輸入月/日的合法性,然后獲取是一年中的第幾天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 0) and (id 90: sunangle = 180-sunangle azimuth = 0gp.setparameterastext(3,str(sunangle)gp.setparameterastext(4,str(azimuth)我們在思考遠一點,如何根據一天內的任何時間而不是正午時間,獲取太陽角和方位角呢?感興趣的可以從本文開頭的鏈接中下砸相應代碼學習。 探索2:如何在PythonWin里運行這個腳本?首先我們得明確幾個點:我們將把hillshade作為腳本的一部分使用,并為其提供輸入參數:一個高程柵格(elevation raster);GetParameterastext僅在用作工具時起作用。下表為腳本工具的參數設置:Display nameData typeTypeDirectionDefaultMonthLongRequiredInputDateLongRequiredInputLatitudeDoubleRequiredInputWorkspaceWorkspaceRequiredInputElevationRaster DatasetRequiredInputHillshadeStringRequiredInput代碼如下:import win32com.client, sys, mathgp = win32com.client.Dispatch(esriGeoprocessing.GPDispatch.1)#函數定義,同上,下面僅給出函數名稱: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#輸入時注意,路徑應為反斜杠“”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ā)現,第一個輸入參數不適用的getparameterastext(0),而是sys.argv1,這是因為getparameterastext()方法只在工具中起作用,而sys.argv有同樣的效果,索引從1而不是0開始,當然,這需要首先引用sys模塊。這里我們直接指定輸出文件在輸入數據文件夾內,省去了setparameterastext()方法,當然這個方法在PythonWin中也無法運行。嘗試輸入參數如下圖,得到右下結果:5 在PythonWin里調試地理處理腳本既然我們已經認真地學會了從Python中創(chuàng)建并運行地理統計工具,那么現在需要考慮如何調試我們的程序了。我們需要經常在Python和添加的地理處理系統引用之間調試程序。當一個地理處理工具運行失敗后,我們需要從Pythonwin中得到一個豐富的消息,而不是“未知錯誤”。5.1 調試選擇和消息Python優(yōu)于AML的優(yōu)點之一是它有更好的調試方法,調試程序有很多選擇,這里不能一一列舉。 打印語句(Print statements)一開始就養(yǎng)成良好的調試方法是:將變量的當前值或腳本的處理過程打印在屏幕上。比如,對之前的一段腳本加以修改:import arcgisscripting,sysgp=arcgisscripting.cre

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論