一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

在ArcGIS中創(chuàng)建Python工具(二) | kikita & Maps

 Albert_E 2019-03-16

上一篇中我們了解到有兩種方式在 ArcGIS 中創(chuàng)建 Python工具,這一篇就來(lái)看看如何在標(biāo)準(zhǔn)工具箱中創(chuàng)建腳本工具。

ArcGIS Help 中腳本工具的幫助過(guò)于枯燥,在這里,我以一個(gè)具體的實(shí)例來(lái)總結(jié)構(gòu)建腳本工具的過(guò)程,我要實(shí)現(xiàn)的需求是做個(gè)快速實(shí)現(xiàn)羽化邊界效果的小工具,預(yù)期得到如下的效果:

上面效果在ArcMap中完全可以手工運(yùn)行幾個(gè)工具實(shí)現(xiàn),但是過(guò)程稍微繁瑣,那么需求來(lái)了,如何做個(gè)自定的一鍵生成羽化邊界的小工具?

1 準(zhǔn)備Python腳本文件

第一步,先寫(xiě)好腳本工具的核心 —— python腳本文件。

腳本中我希望根據(jù)指定環(huán)間距自動(dòng)生成一個(gè)9環(huán)的緩沖面,然后添加一個(gè)字段,用于存儲(chǔ)給各個(gè)緩沖面的透明度百分比。

看下圖就知道我想做什么了:

寫(xiě)一個(gè)py文件,將要用到的工具串聯(lián)起來(lái)實(shí)現(xiàn)自己的需求,大致是下面的樣子。這不是最終要做成腳本工具的版本,只是為了預(yù)先了解要如何實(shí)現(xiàn),后面還要修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
__author__ = 'kikita'

# FileName: EasyFeathering.py

import arcpy
# arcpy.env.workspace = "D:\something\Data.gdb"

# Script Tool Parameters
InputFeature = "InterestArea"
OutputFeature = "OutFeathering"
SingleRingWidth = 10000

# Some Predefined Parameters
distances = []
level = 9
bufferUnit = "meters"
NewField = "Percent"


# My Easy Feathering function
for i in range(level):
distances.append(SingleRingWidth*(i+1))
i = i+1

print str(distances)
print "Distance Complete!"

arcpy.MultipleRingBuffer_analysis(InputFeature, OutputFeature, distances, bufferUnit, "", "ALL","OUTSIDE_ONLY")
print "Success to execute Multi Ring Buffer."

arcpy.AddField_management(OutputFeature,NewField,"double")
print "Success to add Transparency Percent Field."

arcpy.CalculateField_management(OutputFeature, NewField, "!OBJECTID! *10", "PYTHON", "")
print "Success to Calculate Transparency Percent Field."

2 腳本工具參數(shù)配置

有了py文件之后,如何把它塞進(jìn)工具箱里呢?

在ArcMap的Catalog窗口中,找一個(gè)自己喜歡的任意文件夾,新建一個(gè)Toolbox,然后右鍵 Add –> Script,進(jìn)入向?qū)?,這些操作如果不了解,可以點(diǎn) 這里 查查幫助,照著做即可,不贅述。

這里我主要說(shuō)說(shuō)參數(shù)傳遞。

我希望做好的工具中,我只去指定三個(gè)參數(shù),分別是:輸入的興趣區(qū)域面(input Feature ),多環(huán)緩沖的環(huán)間距(Single Ring width ),輸出結(jié)果(output Feature )。預(yù)覽下工具界面:

那么問(wèn)題又來(lái)了,這三個(gè)參數(shù)如何從工具界面?zhèn)鹘o真正執(zhí)行工具的 python 腳本?我們需要對(duì)前面的腳本參數(shù)定義部分做個(gè)修改,使用 arcpy 提供的 GetParameterAsText()函數(shù)即可在工具界面和腳本之間傳遞參數(shù)。用下面的代碼替換前面對(duì)這三個(gè)參數(shù)的替換:

1
2
3
4
# Script Tool Parameters
InputFeature = arcpy.GetParameterAsText(0)
SingleRingWidth = arcpy.GetParameterAsText(1)
OutputFeature = arcpy.GetParameterAsText(2)

對(duì)應(yīng)的腳本工具參數(shù)配置:

為工具配置參數(shù)的時(shí)候,有2個(gè)原則需要遵守:

  • 工具對(duì)話框中的參數(shù)順序必須與腳本中的參數(shù)順序一致。
  • 每個(gè)腳本工具參數(shù)都有關(guān)聯(lián)的數(shù)據(jù)類型。ArcGIS的地理處理不會(huì)將值發(fā)送給數(shù)據(jù)類型不正確的腳本,從這點(diǎn)上看,腳本工具比下一篇要說(shuō)到的腳本工具箱多了一個(gè)優(yōu)勢(shì),就是,在參數(shù)值發(fā)送給腳本之前會(huì)有數(shù)據(jù)類型檢驗(yàn)。

修改Python腳本文件后,現(xiàn)在就運(yùn)行工具,發(fā)現(xiàn)可以得到預(yù)期的結(jié)果:

但是有點(diǎn)不完美,就是在工具的運(yùn)行過(guò)程中,工具給我返回的信息并不充足,我只知道 “Running Script EasyFeathering …”,而不了解工具在做什么,執(zhí)行到了哪個(gè)步驟。這不是好的體驗(yàn)。

3 消息

工具和用戶之間的所有溝通均通過(guò)消息來(lái)實(shí)現(xiàn)。接著上一步提出的問(wèn)題,如何在工具進(jìn)度窗口中傳遞消息給用戶?

雖然在開(kāi)始調(diào)試腳本的時(shí)候,如開(kāi)頭代碼所示,我加了些 Print 語(yǔ)句,方便我了解自己的腳本獨(dú)立執(zhí)行時(shí)的狀態(tài),但是如果運(yùn)行腳本工具,這些print語(yǔ)句是看不到的。可以使用 ArcPy中提供的有關(guān)消息的函數(shù),AddMessage、AddWarning、AddError等向工具進(jìn)度條界面發(fā)送消息。這里我做了個(gè)簡(jiǎn)單的步驟的消息性提示,以及,如果結(jié)果沒(méi)有記錄輸出,會(huì)提示警告。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
__author__ = 'kikita'

# FileName: EasyFeathering.py

import arcpy

#arcpy.env.workspace = "D:\IncidentSupport2015\something\Data.gdb"

# Get the input values from tool UI
InputFeature = arcpy.GetParameterAsText(0)
SingleRingWidth = arcpy.GetParameterAsText(1)
OutputFeature = arcpy.GetParameterAsText(2)


# Some Predefined Parameters
distances = []
level = 9
bufferUnit = "meters"
NewField = "Percent"


# My Easy Feathering function
for i in range(level):
distances.append(int(SingleRingWidth)*(i+1))
i = i+1
arcpy.AddMessage("Step1 Distance list Complete!")


arcpy.MultipleRingBuffer_analysis(InputFeature, OutputFeature, distances, bufferUnit, "", "ALL","OUTSIDE_ONLY")
arcpy.AddMessage("Step2 Success to execute Multi Ring Buffer.")

arcpy.AddField_management(OutputFeature,NewField,"double")
arcpy.AddMessage("Step3 Success to add Transparency Percent Field.")

arcpy.CalculateField_management(OutputFeature, NewField, "!OBJECTID! *10", "PYTHON", "")

InputFeatureCount = int(arcpy.GetCount_management(OutputFeature).getOutput(0))
if InputFeatureCount == 0:
arcpy.AddWarning("{0} has no features.".format(OutputFeature))
else:
arcpy.AddMessage("Step4 Success to Calculate Transparency Percent Field.")

這樣在工具的執(zhí)行過(guò)程中,我就收到了消息:

到這里,工具的功能部分就完成了。

4 顯示結(jié)果圖層

我進(jìn)一步希望腳本工具運(yùn)行之后,自動(dòng)顯示在當(dāng)前的地圖文檔中,從而避免重復(fù)設(shè)置透明度的操作。

  1. 為輸出參數(shù)配置模板圖層。

  1. 在處理設(shè)置中,激活設(shè)置

這樣在運(yùn)行工具之后,結(jié)果即自動(dòng)添加顯示。

5 配置路徑

如果是在本機(jī)使用腳本工具,一般我們會(huì)使用絕對(duì)路徑,但是如果希望分享自己的工具給別人,就要考慮路徑問(wèn)題,也就是新用戶運(yùn)行腳本工具時(shí),相關(guān)的腳本文件和其他用到的資源能否訪問(wèn)到。我的工具按照如下的結(jié)構(gòu)組織:

在腳本工具的屬性中,可以配置存儲(chǔ)相對(duì)路徑引用 py 文件:

PS:但是不要想太多,這個(gè)設(shè)置僅僅會(huì)將腳本文件所在位置按照相對(duì)路徑存儲(chǔ),而不會(huì)將腳本內(nèi)部的路徑進(jìn)行轉(zhuǎn)換。

這個(gè)示例中我還需要用到一個(gè)圖層文件作為模板,如果希望使用相對(duì)路徑使用,就建議將符號(hào)化信息寫(xiě)在腳本內(nèi)部,而不是在參數(shù)窗口中配置。所以,要繼續(xù)修改下Python腳本文件。

在腳本文件的最后追加兩行代碼,我這里將獲取與Python腳本文件在相同目錄下的lyr文件:

1
2
3
4
5
6
7
# Layer files are located in same folder as the .py file
PythonFilePath = os.path.dirname(__file__)
params = arcpy.GetParameterInfo()
params[2].symbology = os.path.join(PythonFilePath, "FeatheringEffectTemplate.lyr")

# Pass message
arcpy.AddMessage("Finding Feathering Effect Template Layer ..." +"/n"+ os.path.join(PythonFilePath, "FeatheringEffectTemplate.lyr"))

OK,路徑的問(wèn)題就解決了。

6 幫助文檔

還可以進(jìn)一步為工具添加幫助文檔,讓更多的人了解如何使用這個(gè)工具。

在ArcCatalog 或者ArcMap的Catalog 中,在腳本工具上右鍵,點(diǎn)擊 Item Description 菜單,點(diǎn)擊 Edit 就可以對(duì)工具的幫助文檔進(jìn)行編輯。

這樣當(dāng)別人打開(kāi)你的工具時(shí),就看到幫助嘍。

好啦,關(guān)于ArcGIS 中使用腳本工具的過(guò)程就說(shuō)到這里。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    免费人妻精品一区二区三区久久久| 在线懂色一区二区三区精品| 日韩欧美一区二区久久婷婷| 黄色av尤物白丝在线播放网址 | 亚洲中文在线中文字幕91| 欧美日韩亚洲精品在线观看| 国产精品欧美激情在线| 久久一区内射污污内射亚洲| 日韩精品小视频在线观看| 黄色av尤物白丝在线播放网址 | 大胆裸体写真一区二区| 欧美成人黄色一级视频| 国产又粗又深又猛又爽又黄| 黑鬼糟蹋少妇资源在线观看| 欧美日韩久久精品一区二区| 色哟哟在线免费一区二区三区| 伊人国产精选免费观看在线视频| 亚洲人妻av中文字幕| 爱在午夜降临前在线观看| 日韩精品少妇人妻一区二区| 91插插插外国一区二区| 亚洲一区二区三区在线免费| 在线欧美精品二区三区| 91精品视频免费播放| 日本人妻的诱惑在线观看| 99国产高清不卡视频| 国产在线一区中文字幕 | 中文字幕乱码亚洲三区| 亚洲精品一区二区三区日韩| 伊人色综合久久伊人婷婷| 日韩欧美第一页在线观看| 99久久精品午夜一区| 欧美黑人在线一区二区| 熟女乱一区二区三区丝袜| 91精品欧美综合在ⅹ| 午夜福利视频偷拍91| 人妻久久这里只有精品| 国产精品推荐在线一区| 夫妻性生活一级黄色录像| 夫妻性生活一级黄色录像| 久久re6热在线视频|