程序設計與軟件應用-11 .arcgisdesktop二次開發(fā)_第1頁
程序設計與軟件應用-11 .arcgisdesktop二次開發(fā)_第2頁
程序設計與軟件應用-11 .arcgisdesktop二次開發(fā)_第3頁
程序設計與軟件應用-11 .arcgisdesktop二次開發(fā)_第4頁
程序設計與軟件應用-11 .arcgisdesktop二次開發(fā)_第5頁
已閱讀5頁,還剩111頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

十一、ArcGISDesktop二次開發(fā)Python介紹ArcPy介紹開發(fā)實例Python概述Python是由荷蘭人吉多范羅蘇姆(GuidovanRossum)在上世紀八十年代末構想并于1991年推出的一種面向對象的腳本編程語言。Python編程語言繼承了傳統(tǒng)編譯語言的強大性和通用性,同時也借鑒了腳本和解釋語言的易用性。1特點Python具有如下特點:開源的。Python完全開放源碼,用戶可以從Python網(wǎng)站()上免費得到所有Python相關軟件;通過Python開發(fā)的產(chǎn)品可以無限制地分發(fā)及銷售。Python網(wǎng)站()可移植、跨平臺。Python是用可移植的ANSIC寫成的,使用Python語言編寫的程序可以運行在Unix、Linux、MS-Windows和其它有Python解釋器的任何平臺上(包括移動平臺)。支持多種對象類型。Python是面向對象的編程語言,所有的數(shù)據(jù)都是對象。除數(shù)字、字符串等基本對象類型外,Python還支持列表、元組、字典等對象類型。有大量可直接調用的程序模塊。Python程序模塊分內部模塊和外部模塊,內部模塊是Python軟件自帶的;外部模塊(也稱第三方模塊)是一些企業(yè)和個人開發(fā)的,目前還沒有集成到Python軟件中,但安裝后可以調用,如針對某方面應用有很多模塊,這些模塊通常被組織成一個包(package),如ESRI公司的Arcpy等。目前,除了已有比較完整的內部模塊外,還有眾多的第三方Python軟件包提供的外部模塊。Python集成開發(fā)環(huán)境目前有很多用于Python開發(fā)的集成開發(fā)環(huán)境。IDLE(IntegratedDeveLopmentEnvironment)是Python中自帶的一個集成環(huán)境。IDLE有兩種窗口:Shell窗口,交互運行的窗口,提供命令行用于輸入語句,語句輸入后直接執(zhí)行。文本編輯器窗口,用于編輯、調試和運行模塊代碼,模塊運行結果顯示在Shell窗口中。文本編輯器窗口Shell窗口ArcGISDesktop也提供了一個可編輯、運行Python腳本文件的窗口。學習資源Python文檔在IDLE中,點擊F1或Help\PythonDocs,將打開Python文檔。文檔包括詳細的教程(Tutorial)、語言參考(LanguageReference)、標準庫(StandardLibrary)、常見問題的解答(PythonFrequentlyAskedQuestions)等。學習教程Python軟件的發(fā)展歷史Python技術交流網(wǎng)站目前有很多Python技術交流網(wǎng)站,如Python中國()、Python愛好者()等,這些網(wǎng)站提供了Python問題回答、案例分享、資料下載、教材教程等資源。Python中國()Python愛好者()Python圖書在亞馬遜網(wǎng)站()有很多Python方面的圖書。適合Python初學者使用適合有一定Python編程經(jīng)驗的讀者使用Python數(shù)據(jù)類型Python使用對象模型來存儲數(shù)據(jù)。Python中任何一個數(shù)據(jù)都有相應的對象類型,如1234、”abcd”等,可以通過type()查看對象的類型。對象的類型決定了該對象的存儲方式、可以進行什么樣的操作以及要遵循什么樣的規(guī)則。2Python支持的數(shù)據(jù)類型包括:數(shù)字型(Number)字符串型(String)列表型(List)元組型(Tuple)字典型(Dictionary)文件型(File)……對象的操作包括:返回對象的屬性(屬性讀?。ο蟮膶傩赃M行賦值(屬性賦值)調用對象的方法(方法調用)把對象作為變量,通過函數(shù)進行處理。字符串、列表、元組、文件都是序列型數(shù)據(jù)(文件是以回車符作為分割)?!癮bcd”,字符串[a,b,c,d],列表(a,b,c,d),元組對序列型數(shù)據(jù),python支持索引、切片等操作進行屬性的讀寫。以字符串為例:索引,通過索引操作符([i])得到某個字符。字符串的索引規(guī)則是第一個字符的索引號是0,最后一個字符的索引號是n-1。Python也支持反向索引,最后一個字符是-1,第一個字符是-n。切片,通過切片操作符([i:j])得到索引號i到j-1的子字符串,如s[1:3]表示得到第二和第三兩個字符組成的子字符串。>>>s="World">>>s[0]'W'>>>s[-1]'d'>>>s[0:2]'Wo'>>>s[0:-1]'Worl'對象方法調用的操作是:

object.method(args)

args是參數(shù)(不管有否參數(shù),方法后面必須加括號)。以字符串對象為例,其支持的方法包括:字符大小寫操作(改成大寫、小寫或互換)查找字符串中某個子串,包括首個子串的位置、數(shù)量以及替代等。字符串的分割與連接。去掉字符串左邊、右邊或兩邊的空白符(或指定字符)。……String對象方法(1)方法解釋lower(),upper()分別返回s的小寫(大寫),如"Thisisapen".upper()。swapcase()把s中的字符大小寫對換。find(sub[,start[,end]])返回子串sub在字符串s中首次出現(xiàn)的位置索引,如果沒有就返回-1,start和end是位置索引,用于限定字符串某一段。"Thisisapen".find("is")2count(sub[,start[,end]])返回sub在s中出現(xiàn)的次數(shù),start和end同find函數(shù)。"Thisisapen".count("is")2replace(old,new[,count])把s中old子串替換成new子串,count表示最前面的count個子串替換。"Thisisapen".replace("","_")'This_is_a_pen'String對象方法(2)方法解釋split(sep[,maxsplit]])在指定的分隔符位置把string分開(缺省分割符為空格),并返回分開的子串的列表。maxsplit是最大分割數(shù),當達到最大分割數(shù)時,后面的字符串不再分割,最終列表的元素為maxsplit+1個。"Thisisapen".split()['This','is','a','pen']join(iterable)把可迭代對象(如列表)中的字符串元素連接成一個字符串,字符串對象的元素作為分隔符。"_".join(['This','is','a','pen'])'This_is_a_pen'lstrip(chars)rstrip(chars)strip(chars)分別去掉s左邊、右邊或兩邊的空白符(或指定字符)。"Thisisapen".strip()'Thisisapen'更多的方法可查看Python文檔(LibraryReference\Built-inTypes\StringMethods)"Thisisapen".split()['This','is','a','pen']調用split函數(shù)后,返回列表s="地理信息系統(tǒng)專業(yè)的課程包括地理信息系統(tǒng)概論、地理信息系統(tǒng)設計、地理信息系統(tǒng)開發(fā)等。"new_s=s.replace("地理信息系統(tǒng)","GIS")printnew_s字符串中的“地理信息系統(tǒng)”用GIS代替在ArcGISDesktop中,可以對屬性表中的字段進行字段計算(FieldCalculator),在計算時,可以利用Number、String和Date方面的python方法。如要從原先的省名字段值中提取前兩個名字,python的表達式為!NAME![0:6]。在ArcGISDesktop中,Python通過字段名兩邊加感嘆號(?。┑玫阶侄沃担?NAME!;對漢字,一個漢字由三個字符(字節(jié))組成。Python語句Python中的程序通過語句來生成和處理對象。Python語句分簡單語句和復雜語句,簡單語句只有一個邏輯行,而復合語句(也稱代碼塊)則是由多個邏輯行組成。3語句解釋表達式語句計算表達式值的語句。賦值語句給對象賦值的語句。print語句打印語句。del語句刪除語句,刪除對象或對象中的元素。global語句聲明全局變量語句。import語句導入模塊語句yield語句生成器中產(chǎn)生元素的語句。簡單語句(1)語句解釋continue語句終止當前循環(huán),進入下一個循環(huán)語句。break語句退出循環(huán)語句。pass語句不執(zhí)行任何操作的語句。Exec語句執(zhí)行Python代碼的語句。return語句在函數(shù)中返回值的語句。raise語句拋出異常語句。assert語句斷言語句,測試一個表達式,如果返回值是false,觸發(fā)異常。簡單語句(2)語句解釋if語句條件語句while語句while循環(huán)語句for語句for循環(huán)語句try語句捕獲異常語句with語句對象上下文管理器語句定義函數(shù)語句自定義函數(shù)語句定義類語句用于自定義類語句復合語句復合語句的首行以一個冒號(:)結束,以下是一個或多個縮進的語句??s進的空格數(shù)沒有嚴格限制,但要保持一致,一般為4個空格。在Python中,代碼縮進是一種語法,Python是通過縮進來探測復合語句的邊界,代碼縮進錯誤(位置錯誤)會導致語法錯誤。這種方式可以保持一致的代碼外觀,有助于可讀性。if條件語句的語法如下:

if<條件表達式>:

<代碼塊>如果條件表達式為True,執(zhí)行if語句的代碼;否則的話,執(zhí)行該代碼塊后面的語句。while語句的基本形式為:

while<條件表達式>:

<代碼塊>

else:

<代碼塊>當條件表達式為True時,繼續(xù)while內的語句;當條件表達式為False時,執(zhí)行else后面的語句,else語句是可選的。for循環(huán)語句通常用于遍歷可迭代對象(字符串、列表、元組、字典、文件等)成員,基本形式為:

for<目標>in<對象>:

<代碼塊>內部模塊標準Python庫中含有幾百個模塊,包括:與Python解釋器相關的模塊(如sys、sysconfig等)。通用操作系統(tǒng)服務模塊(如os、io等)。文件和目錄訪問模塊(如os.path、filecmp等)。數(shù)字和數(shù)學計算模塊(如math、random等)。網(wǎng)絡協(xié)議和支持模塊(如urllib、urllib2等)。網(wǎng)絡數(shù)據(jù)處理模塊(如email、json等)。4字符串處理模塊(如string、re等)。日期和時間模塊(如datetime、calendar等)。結構化標簽處理模塊(如HTMLParser、XML等)?!暾牧斜砜刹榭础ython文檔中模塊列表在啟動python軟件后,只有__build-ins__(內置)模塊導入到內存中,這個模塊中的函數(shù)可直接使用。如要用到其他模塊中的函數(shù),首先要利用import語句將其導入,可以是導入整個模塊,也可以是導入模塊中的指定函數(shù)。函數(shù)解釋math.sin(x)math.cos(x)math.tan(x)sin、cos和tan函數(shù),x單位為弧度。math.asin(x)math.acos(x)math.atan(x)arcsin、arccos和arctan函數(shù),返回值的單位為弧度。math.hypot(x,y)sqrt(x*x+y*y),返回原點到(x,y)點的距離。math.degrees(x)弧度轉為度math.radians(x)度轉為弧度math模塊中的函數(shù)math模塊包含了大量數(shù)學函數(shù)在ArcGISDesktop中,對屬性表中的字段進行字段計算(FieldCalculator),如類型為Number,則可利用math模塊中提供的函數(shù),如math.log(!GDP2013!)。函數(shù)解釋urlopen(url[,data])打開一個由URL表示的網(wǎng)絡對象,也可以打開本地文件。importurllibwebfile=urllib.urlopen("")s=webfile.read()printswebfile.close()urlretrieve(url[,filename[,reporthook]])把一個URL表示的網(wǎng)絡對象拷貝(下載)到本地,網(wǎng)絡對象可以是html網(wǎng)頁,也可以是網(wǎng)頁中鏈接的圖像、文本等。importurlliburl=""urllib.urlretrieve(url,"c:\\data\\tmp\\p1.jpg")urllib模塊的主要函數(shù)urllib模塊用于打開及拷貝url表示的網(wǎng)絡對象urlopen函數(shù)的運行結果有些網(wǎng)站提供web服務接口,用戶可以在url中輸入?yún)?shù),返回不同的數(shù)據(jù)。如esri公司的arcgisonline提供很多地圖服務,用戶可以輸入一個坐標范圍,返回該范圍的地圖。importurlliburl="\/ESRI_Imagery_World_2D/MapServer/export?bbox=-180,-90,180,90&f=image"urllib.urlretrieve(url,"c:\\data\\tmp\\world.jpg")importurlliburl="\/ESRI_Imagery_World_2D/MapServer/export?bbox=72,17,136,55&f=image"urllib.urlretrieve(url,"c:\\data\\tmp\\china.jpg")importurlliburl="\/ESRI_Imagery_World_2D/MapServer/export?bbox=120,30,122,32&f=image"urllib.urlretrieve(url,"c:\\data\\tmp\\shanghai.jpg")下載全球、全國和上海全市衛(wèi)星圖像Python介紹ArcPy介紹開發(fā)實例什么是ArcPyArcPy是一個Python包,是ESRI公司在ArcGIS10.0中推出的。ArcGISDesktop安裝后,在安裝目錄下有一個arcpy文件夾。ArcPy包含有Python函數(shù)、類和模塊。ArcGIS10.1中有91個函數(shù)、37個類、5個模塊(每個模塊下又包含多個函數(shù)和類)。1從本質上來說,ArcPy實際上是對ArcObjects的相關類進行封裝,使用戶可以利用Python語言調用ArcObjects的相關類。ArcPy提供的功能:能訪問所有gp(地處理)工具數(shù)據(jù)轉換和數(shù)據(jù)管理數(shù)據(jù)分析自動化制圖使用Python和ArcPy,可以開發(fā)出大量用于處理地理數(shù)據(jù)的實用程序。在ArcGIS的幫助文檔中,有ArcPy的詳細介紹(Geoprocessing\ArcPy),包括ArcPy的函數(shù)、類以及數(shù)據(jù)訪問模塊、制圖模塊、空間分析模塊、地統(tǒng)計分析模塊和時間模塊的介紹,在同一個目錄下的Python則介紹如何利用Python和ArcPy進行各種地處理。ArcPy幫助文檔ArcPy函數(shù)ArcPy提供了很多函數(shù),按類型包括:環(huán)境設置、獲取和設置工具參數(shù)、信息和錯誤處理、工具和工具箱等。這些函數(shù)可以在ArcGIS幫助中了解具體的使用(Geoprocessing\ArcPy\ArcPyfunctions)。

2ArcPy函數(shù)列表函數(shù)的詳細介紹數(shù)據(jù)列表函數(shù)數(shù)據(jù)列表(Listingdata)函數(shù)用于返回當前工作空間的數(shù)據(jù)列表以及數(shù)據(jù)集中的字段、索引列表等。其中,數(shù)據(jù)列表可以指定數(shù)據(jù)類型以及利用通配符參數(shù)(wild_card)對列表數(shù)據(jù)進行限定;字段列表可以指定字段類型。工作空間可以是文件夾,也可以是數(shù)據(jù)庫。函數(shù)解釋ListFiles(wild_card)返回當前工作空間中的文件列表。ListDatasets(wild_card,feature_type)返回當前工作空間中的數(shù)據(jù)集列表。ListFeatureClasses(wild_card,feature_type)返回當前工作空間中的要素類列表。ListRasters(wild_card,Raster_type)返回當前工作空間中的柵格數(shù)據(jù)列表。ListTables(wild_card,Table_type)返回當前工作空間中的表格數(shù)據(jù)列表。ListWorkspacees(wild_card,Workspace_type)返回當前工作空間中的工作空間列表。ListFields(dataset,{wild_card},{field_type})返回數(shù)據(jù)集中的字段列表。ListIndexes(dataset,{wild_card})返回數(shù)據(jù)集中的索引列表。ListVersions(sde_workspace)返回版本列表。數(shù)據(jù)列表函數(shù)ArcGIS支持的字段類型importarcpyfromarcpyimportenvenv.workspace="c:\\data\\USA"fcs=arcpy.ListFeatureClasses()forfcinfcs:printfc顯示指定文件夾中的所有要素類importarcpyfds=arcpy.ListFields("c:\\data\\USA\\states.shp","","String")forfdinfds:顯示states.shp的所有字符串型字段名ArcPy類ArcPy目前已定義30幾個類,包括:envSpatialReferenceCursor和Row幾何對象類(包括PointGeometry、Multipoint、Polyline、Polygon以及Geometry)Raster……3Cursor和RowCursor是一個數(shù)據(jù)訪問對象,也可認為是一個枚舉對象。有三種類型:search、insert和update,分別用于表格數(shù)據(jù)的查詢、插入和更新。

Row對象表示表格數(shù)據(jù)中的一個記錄,可以通過Cursor對象的迭代得到。Cursor對象方法Cursor類型方法解釋Searchnext()返回當前位置的下一個Row對象reset()返回第一個位置的Row對象InsertnewRow()產(chǎn)生一個空的Row對象insertRow(row)在Cursor中插入一個新的row對象next()reset()UpdatedeleteRow(row)刪除一個row對象updateRow(row)利用row更新當前對象next()reset()方法解釋getValue(field_name)或field_name得到字段值setValue(field_name,object)設置字段值isNull(field_name)字段值是否為NullsetNull(field_name)設置字段值為NullRow對象方法importarcpyfromarcpyimportenvenv.workspace=“C:\\Data\\USA"cur=arcpy.SearchCursor("States.shp")forrowincur:printrow.STATE_NAME,row.POP1990打印每個州的名稱和人口幾何對象ArcGIS支持點(point)、多點(Multipoint)、線(Polyline)和多邊形(Polygon)等幾何類型。point幾何類型中,一個記錄只有一個點;而Multipoint幾何類型中,一個記錄可以由多個點組成。Polyline和Polygon幾何類型中,一個記錄可以由多個部分(parts)組成,每個部分都是由點組成。ArcPy中的幾何對象類包括PointGeometry、Multipoint、Polyline、Polygon以及Geometry,其中Geometry是其它類的父類。和幾何對象相關的類:Point類和Array類。Point不是一個幾何對象類,但所有的幾何對象都是基于Point對象來構建,同樣,所有幾何對象的坐標值也是通過Point對象來讀取。產(chǎn)生Point對象句法:

Point({X},{Y},{M},{Z},{ID})

缺省情況下,X、Y和ID為0,M和Z為None。Array是一個陣列對象,可以包含任意數(shù)量的Point對象及其它對象(如Array對象、spatialreferences對象等),有add、append、remove等方法,用來構建由多點組成的幾何對象。句法解釋PointGeometry(inputs,{spatialReference},{hasZ},{hasM})產(chǎn)生點幾何對象。inputs為產(chǎn)生對象的坐標,數(shù)據(jù)類型為Point;sspatialReference為空間參照對象;hasZ和hasM是布爾對象,表示是否支持Z值和M值。Multipoint(inputs,{spatialReference},{hasZ},{hasM})產(chǎn)生多點幾何對象。inputs數(shù)據(jù)類型為Point或Array對象;其它參數(shù)同PointGeometry。Polyline(inputs,{spatialReference},{hasZ},{hasM})產(chǎn)生線幾何對象。參數(shù)同上。Polygon(inputs,{spatialReference},{hasZ},{hasM})產(chǎn)生多邊形幾何對象。參數(shù)同上。Geometry(geometry,inputs,{spatialReference},{hasZ},{hasM})Geometry為幾何類型(point、polygon、polyline或multipoint),其它參數(shù)同上。

創(chuàng)建點、多點、線和多邊形幾何對象函數(shù)利用CopyFeatures工具可以把幾何對象或幾何對象列表寫到要素類中。CopyFeatures_management(in_features,out_feature_class,{config_keyword},{spatial_grid_1},{spatial_grid_2},{spatial_grid_3})importarcpyfromarcpyimportenvenv.workspace="C:\\Data\\tmp"env.overwriteOutput=Truex=30y=35pnt=arcpy.Point(x,y)pointGeometry=arcpy.PointGeometry(pnt)arcpy.CopyFeatures_management(pointGeometry,"point")創(chuàng)建只有一個點的點要素類(可以在ArcGISDesktop的python窗口中運行

)利用迭代方式產(chǎn)生點序列。先確定三個固定點a、b和c,坐標分別為(0,0)、(10,0)和(5,10),然后確定點序列的初始點x0(5,5)。從三個固定點中隨機選取一個點,計算該點與x0之間的中點坐標,得到一個新點x1,并以該點計算下一個點x2。通過循環(huán),得到點序列。假定有100000個點,最終這些點組成的圖案會是什么樣子?importarcpyimportrandomd={"1":[0,0],"2":[10,0],"3":[5,10]}c=[5,5]point=arcpy.Point()array=arcpy.Array()foriinrange(1,101):number=random.choice("123")if(d[number][0]-c[0])>0:x=(d[number][0]-c[0])/2.0+c[0]else:x=(c[0]-d[number][0])/2.0+d[number][0]if(d[number][1]-c[1])>0:y=(d[number][1]-c[1])/2.0+c[1]else:y=(c[1]-d[number][1])/2.0+d[number][1]c=[x,y]point.X=xpoint.Y=yarray.add(point)points=arcpy.Multipoint(array)arcpy.CopyFeatures_management(points,"c:\\data\\p100.shp")Python編程基礎ArcPy介紹開發(fā)實例基于Python和ArcPy編程的主要目的:批處理構建工作流新工具批處理ArcGIS中大多數(shù)工具的數(shù)據(jù)處理是輸入一個數(shù)據(jù),然后輸出一個數(shù)據(jù),不能對多個數(shù)據(jù)進行相同的處理,也不能對同個數(shù)據(jù)進行不同處理(不同參數(shù))。

批處理就是實現(xiàn)對多個數(shù)據(jù)進行相同的處理,以及對同個數(shù)據(jù)進行不同處理(不同參數(shù))。1實例一:對一個文件夾中的數(shù)據(jù)(要素類)進行批處理切割(clip)操作,輸出數(shù)據(jù)存放在另一個文件夾中,每個數(shù)據(jù)的名稱為“clip_”加原有數(shù)據(jù)的文件名。函數(shù)參數(shù)Clip_analysis(in_features,clip_features,out_feature_class,{cluster_tolerance})in_features:輸入要素類clip_features:切割要素類out_feature_class:輸出要素類cluster_tolerance:容差Clip工具函數(shù)Clip操作示意圖importarcpyfromarcpyimportenvenv.workspace="C:\\data\\input"clipFeature="c:\\data\\clipFeature.shp"fcs=arcpy.ListFeatureClasses()forfcinfcs:outFeatureClass="c:\\data\\output\\clip_"+fcarcpy.Clip_analysis(fc,clipFeature,outFeatureClass)批處理切割操作實例二:對一個文件夾中的數(shù)據(jù)(要素類)進行批處理分割(split)操作,每個輸入數(shù)據(jù)分割后產(chǎn)生的多個數(shù)據(jù)存放到一個新建的文件夾中,文件夾名為輸入數(shù)據(jù)的文件名(不包括擴展名)。函數(shù)參數(shù)Split_analysis(in_features,split_features,split_field,out_workspace,{cluster_tolerance})in_features:輸入要素類split_features:分割要素類split_field:分割字段out_workspace:輸出工作空間cluster_tolerance:容差split工具函數(shù)split操作示意圖importarcpyfromarcpyimportenvimportosenv.workspace="C:\\data\\input"splitFeature="c:\\data\\shanghai.shp"fcs=arcpy.ListFeatureClasses()forfcinfcs:path="c:\\data\\output\\"+fc.split(".")[0]os.mkdir(path)arcpy.Split_analysis(fc,splitFeature,"NAME",path)批處理分割操作實例三:利用SimplifyLine(Cartography)工具簡化我國大陸海岸線。設定不同的容差參數(shù)值,得到不同簡化程度的海岸線。對每一個輸出海岸線,計算頂點數(shù)及線長度,并與原始數(shù)據(jù)的頂點數(shù)和線長度進行比較。設置精度閾值,確定符合精度要求、數(shù)據(jù)壓縮比最高的結果。

simplifyLine操作示意函數(shù)參數(shù)SimplifyLine_cartography(in_features,out_feature_class,algorithm,tolerance,{error_resolving_option},{collapsed_point_option},{error_checking_option})in_features:輸入要素類out_feature_class:輸出要素類algorithm:簡化算法,pointremove和bendsimplify。tolerance:容差error_resolving_option:拓撲錯誤的處理collapsed_point_option:零長度線是否作為點數(shù)據(jù)保存。error_checking:拓撲錯誤的檢查simplifyLine工具函數(shù)importarcpyfromarcpyimportenvimportarcpy.cartographyasCAenv.workspace="C:\\data"forrinrange(1,6):tolerance=r*1000output="c:\\data\\tmp\\"+str(tolerance)+".shp"CA.SimplifyLine("coastline.shp",output,"POINT_REMOVE",tolerance)cur=arcpy.SearchCursor(output,"")forrowincur:geometry=row.shapeprintgeometry.pointCountprintgeometry.lengthdelcur,row設定5個容差(1km、2km、3km、4km和5km),輸出不同簡化程度的海岸線,計算點數(shù)和長度。importarcpyfromarcpyimportenvimportarcpy.cartographyasCAenv.workspace="C:\\data"cur=arcpy.SearchCursor("coastline.shp","")forrowincur:geometry=row.shapecoastline_Points=geometry.pointCountcoastline_Length=geometry.lengthprintcoastline_Pointsprintcoastline_Length計算原始海岸線的點數(shù)和長度Accuracy=1.0i=0whileAccuracy>0.8:i=i+1tolerance=i*1000output=arcpy.CreateUniqueName("c:\\data\\tmp\\tolerance.shp")CA.SimplifyLine("coastline.shp",output,"POINT_REMOVE",tolerance)cur=arcpy.SearchCursor(output,"")forrowincur:geometry=row.shapeAccuracy=geometry.length/coastline_Lengthratio=float(geometry.pointCount)/float(coastline_Points)print"tolerance=",tolerance,"Accuracy:",Accuracy,"ratio:",ratiodelcur,rowprint"besttoleranceis%d"%(tolerance)改變容差(每次增加1km),計算符合精度要求、數(shù)據(jù)壓縮比最大的容差,并輸出結果。

構建工作流工作流是由多個處理工具組成,一個工具的輸出可以作為另一個工具的輸入,這樣,原先需要利用多個工具才能實現(xiàn)的工作可以通過一個工作流來實現(xiàn)。工作流運行過程會產(chǎn)生一些臨時(中間)文件,一般情況下,需要在程序運行結束時,刪除這些臨時文件。2實例一:分析道路兩側植被。通過Buffer工具對道路進行緩沖分析。通過Clip工具用道路緩沖范圍對植被圖進行切割。利用SummaryStatistics工具對切割出的植被進行統(tǒng)計(按植被類型統(tǒng)計面積)。函數(shù)參數(shù)Statistics_analysis(in_table,out_table,statistics_fields,{case_field})in_table:輸入表,可以是要素類。out_table:輸出表。statistics_fields:統(tǒng)計字段,參數(shù)類型為復合列表,子列表有兩個元素,數(shù)字型字段和統(tǒng)計類型,可用的統(tǒng)計類型包括SUM、MEAN、MAX、MIN等。case_field:分組字段。Statistics_analysis工具函數(shù)

importarcpyfromarcpyimportenvenv.workspace="C:\\data"inputRoad="majorrds.shp"buf="500"vege="vegetype.shp"stat_Field=[["Shape_Area","SUM"],["Shape_Area","MAX"]]case_Field="HOLLAND95"output="c:\\data\\tmp\\stat"scratch_Name1=arcpy.CreateScratchName("xxxx","","Shapefile","C:\\data")arcpy.Buffer_analysis(inputRoad,scratch_Name1,buf)scratch_Name2=arcpy.CreateScratchName("xxxx","","Shapefile","C:\\data")arcpy.Clip_analysis(vege,scratch_Name1,scratch_Name2)arcpy.Statistics_analysis(scratch_Name2,output,stat_Field,case_Field)arcpy.Delete_management(scratch_Name1)arcpy.Delete_management(scratch_Name2)分析道路兩側植被(程序中設置參數(shù))importarcpyinputRoad=arcpy.GetParameterAsText(0)buf=arcpy.GetParameterAsText(1)inputVege=arcpy.GetParameterAsText(2)stat_Field=arcpy.GetParameterAsText(3)stat_Type=arcpy.GetParameterAsText(4)case_Field=arcpy.GetParameterAsText(5)output=arcpy.GetParameterAsText(6)stat_Fields=[[stat_Field,stat_Type]]scratch_Name1=arcpy.CreateScratchName("xxxx","","Shapefile","C:\\data")arcpy.Buffer_analysis(inputRoad,scratch_Name1,buf)scratch_Name2=arcpy.CreateScratchName("xxxx","","Shapefile","C:\\data")arcpy.Clip_analysis(inputVege,scratch_Name1,scratch_Name2)arcpy.Statistics_analysis(scratch_Name2,output,stat_Fields,case_Field)arcpy.Delete_management(scratch_Name1)arcpy.Delete_management(scratch_Name2)分析道路兩側植被(從工具對話框中獲得參數(shù))參數(shù)設置參數(shù)類型inputRoadFeatureLayerbufDoubleinputVegeFeatureLayerstat_FieldField,參數(shù)屬性中的Obtainedfrom選擇inputVege。stat_TypeString,參數(shù)屬性中的Filter選擇ValueList,并設置列表值,如SUM、MEAN、MAX、MIN等。case_FieldField,參數(shù)屬性中的Obtainedfrom選擇inputVegeoutTableTable工具對話框參數(shù)設置實例二:分析1000米范圍內沒有公園分布的區(qū)域(考慮河流等不能直接通過的障礙)。SpatialAnalyst工具箱提供了基于柵格的距離計算工具,輸出數(shù)據(jù)的柵格值表示與最近目標的距離,其中,EuclideanDistance計算柵格與目標的歐氏距離;CostDistance計算柵格與目標的費用距離(即考慮經(jīng)過不同柵格時的費用)。

在利用CostDistance工具時,需要用到cost_raster(費用柵格數(shù)據(jù)),該數(shù)據(jù)的柵格值表示通過該柵格的費用,空值表示不能通過(即障礙)。函數(shù)參數(shù)CostDistance(in_source_data,in_cost_raster,{maximum_distance},{out_backlink_raster})in_source_data:輸入數(shù)據(jù)in_cost_raster:費用柵格,表示柵格是否可通過或通過柵格的費用,空值表示不能通過。CostDistance工具函數(shù)步驟(首先要產(chǎn)生cost柵格,把河流覆蓋區(qū)域設置為空值,其它區(qū)域的柵格值設置為1):河流多邊形轉柵格(PolygonToRaster_conversion),河流覆蓋的柵格為非空值,其它柵格為空值。利用IsNull工具把空值轉為1,非空值轉為0。利用SetNull工具把0(河流覆蓋區(qū)域)設置為空值。利用CostDistance(in_source_data,in_cost_raster)工具計算每個柵格與公園的距離,in_cost_raster為有空值(河流覆蓋)的柵格數(shù)據(jù)。利用Con工具把距離大于1000的柵格設置為0。函數(shù)說明PolygonToRaster_conversion(in_features,value_field,out_raster_dataset,{cell_assignment},{priority_field},{cellsize})in_features:輸入要素類value_field:值字段out_raster_dataset:輸出柵格數(shù)據(jù)集IsNull(in_raster)in_raster:輸入柵格。該函數(shù)返回一個柵格,輸入柵格中空值(NoData)柵格為1,其它非空柵格為0.SetNull(in_conditional_raster,in_false_raster_or_constant,{where_clause})in_conditional_raster:輸入柵格in_false_raster_or_constant:柵格或常數(shù)(用于給不符合表達式的柵格賦值)where_clause:SQL表達式該函數(shù)返回一個柵格,輸入柵格中符合表達式的柵格為NoData,其它柵格為設定的柵格值或常數(shù)值。Con(in_conditional_raster,in_true_raster_or_constant,{in_false_raster_or_constant},{where_clause})in_conditional_raster:輸入柵格in_true_raster_or_constant:柵格或常數(shù)(用于給符合表達式的柵格賦值)in_false_raster_or_constant:柵格或常數(shù)(用于給不符合表達式的柵格賦值)where_clause:SQL表達式相關的空間分析工具函數(shù)importarcpyfromarcpyimportenvfromarcpy.saimport*arcpy.CheckOutExtension("Spatial")env.workspace="C:\\data"desc=arcpy.Describe("ClipFeature.shp")env.extent=desc.extentsName=arcpy.CreateScratchName("x","","RasterDataset","C:\\data\\tmp")arcpy.PolygonToRaster_conversion("rive

溫馨提示

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

評論

0/150

提交評論