Python 表達(dá)式可通過?幾何對象中的屬性(type、extent、centroid、firstPoint、lastPoint、area、length、isMultipart?和?partCount)進(jìn)行創(chuàng)建。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括錦江網(wǎng)站建設(shè)、錦江網(wǎng)站制作、錦江網(wǎng)頁制作以及錦江網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,錦江網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到錦江省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
!shape.area!
Python 表達(dá)式可以使用具有面積或線性單位的幾何?area?和?length?屬性將值轉(zhuǎn)換為不同的測量單位(例如?!shape.length@kilometers!)。如果數(shù)據(jù)存儲(chǔ)在地理坐標(biāo)系中且具有線性單位(例如英里),則使用測地線算法計(jì)算長度。在地理數(shù)據(jù)中使用面積單位會(huì)產(chǎn)生不正確的結(jié)果,這是由于沿 globe 的十進(jìn)制度并不一致。
面積測量單位關(guān)鍵字:
英畝 | 公畝 | 公頃 | 平方厘米 | 平方分米 | 平方英寸 | 平方英尺 | 平方千米 | 平方米 | 平方英里 | 平方毫米 | 平方碼 | 平方地圖單位 | 未知
線性測量單位關(guān)鍵字:
厘米 | 十進(jìn)制度 | 分米 | 英尺 | 英寸 | 千米 | 米 | 英里 | 毫米 | 海里 | 磅 | 未知 | 碼
在工具對話框中,可將表達(dá)式直接輸入到表達(dá)式參數(shù)中,或者使用“字段計(jì)算器”以交互方式構(gòu)建表達(dá)式。
使用所選要素集(如從創(chuàng)建要素圖層或按屬性選擇圖層內(nèi)的查詢中創(chuàng)建的要素集)時(shí),此工具將只更新所選的記錄。
每次操作僅能對一個(gè)字段應(yīng)用計(jì)算。
現(xiàn)有字段值將被覆蓋。如果想要保留原始字段值,應(yīng)創(chuàng)建輸入表副本
對于 Python 計(jì)算,必須在字段名稱兩旁添加驚嘆號(hào)(!字段名!)。
對于 VB 計(jì)算,字段名稱必須用方括號(hào)括起([字段名])。
計(jì)算文本或字符字段的字符串時(shí),在對話框中,必須對字符串添加雙引號(hào)("字符串"),而在腳本中,還必須對加雙引號(hào)的字符串添加單引號(hào)('"字符串"')。
此工具也可用于更新字符項(xiàng)。應(yīng)對使用字符串的表達(dá)式添加單引號(hào)(例如?[CHARITEM] = ‘新字符串')。但是,如果字符串已包含單引號(hào),則要對該字符串添加雙引號(hào),例如?[CHARITEM] = "類型'A'"。
要計(jì)算數(shù)值字段,可在表達(dá)式參數(shù)中輸入數(shù)值;值的兩旁無需加引號(hào)。
如果已指定 Python 表達(dá)式,則此工具支持?arcgis.rand()?函數(shù)。已為 ArcGIS 工具創(chuàng)建?arcgis.rand()?函數(shù),不應(yīng)將此函數(shù)與 Python Rand() 函數(shù)相混淆。arcgis.rand()?函數(shù)的可用分布的語法在隨機(jī)值的分布語法中進(jìn)行介紹。
表達(dá)式與代碼塊會(huì)相互連接。代碼塊必須返回與表達(dá)式的關(guān)聯(lián);代碼塊的結(jié)果應(yīng)傳入到表達(dá)式中。
代碼塊參數(shù)可用于創(chuàng)建復(fù)雜表達(dá)式。您可以在對話框中直接輸入代碼塊,或在腳本中將代碼塊作為連續(xù)字符串輸入。
Python 數(shù)學(xué)模塊及格式可供代碼塊參數(shù)使用。您可以導(dǎo)入附加模塊。數(shù)學(xué)模塊可提供數(shù)論函數(shù)與表達(dá)函數(shù)、冪函數(shù)與對數(shù)函數(shù)、三角函數(shù)、角度轉(zhuǎn)換函數(shù)、雙曲函數(shù)以及數(shù)學(xué)常數(shù)。要了解更多有關(guān)數(shù)學(xué)模塊的內(nèi)容,請參閱 Python 的幫助。
保存的 ArcGIS 先前版本的 VB .cal 文件可以直接使用或者只需做少量修改后即可使用。如果擁有使用 ArcObjects 的過去版本的 VBA 代碼,則計(jì)算需經(jīng)過修改后才能用于 10.0。
計(jì)算連接數(shù)據(jù)時(shí),您無法直接計(jì)算連接列。然而,您可以直接計(jì)算源表的列。要計(jì)算連接數(shù)據(jù),必須先將連接表或連接圖層添加至 ArcMap。然后可以分別對此數(shù)據(jù)執(zhí)行計(jì)算。這些更改將反映在連接列中。
計(jì)算字段示例
對于平面坐標(biāo)系,任一射線OP與x軸夾角 θ 的范圍,可以取[0,2π)或者(-π,π],如無特殊說明, 我們統(tǒng)一使用后者。
將笛卡爾空間坐標(biāo)系中的點(diǎn) Pc = ( x , y , z ) 表示成球體坐標(biāo)系中的形式 Ps = ( θ , ? , r ) 。
atan2(b,a)是4象限反正切,它的取值不僅取決于正切值b/a,還取決于點(diǎn)(b,a) 落入哪個(gè)象限:
而 atan(b/a) 僅僅根據(jù)正切值為a/b求出對應(yīng)的角度 (可以看作僅僅是2象限反正切):
結(jié)論: atan 和 atan2函數(shù),建議用 atan2函數(shù)
參考文章:
計(jì)算器上一般用shift鍵,再按的tan輸入,就是tan的負(fù)一次方的。
計(jì)算機(jī)先選科學(xué)型,然后在度與弧度下面有個(gè)inv鍵,按了它后就有tan-1次方,就是arctan的意思,arctan是正切的反函數(shù),計(jì)算器上一般用shift鍵加tan鍵,就是tan的負(fù)一次方的那個(gè)。
科學(xué)型計(jì)算器一般都可以計(jì)算,常見的有夏普計(jì)算器、卡西歐計(jì)算器、得力計(jì)算器。arctan也可以寫作arctg,是反正切函數(shù),你看看計(jì)算機(jī)上有沒有arctan或者arc^-1注意各個(gè)鍵位上的標(biāo)示以及該鍵位所對應(yīng)的功能鍵標(biāo)示,有些功能要先按shift鍵、alpha等功能。
where(condition, [x, y]):根據(jù)前面的條件判斷輸出x還是y。
numpy.less(x,y):xy返回True,否則返回False。
argmax(a, axis=None):求得對應(yīng)axis最大值上的自變量。相當(dāng)于y=f(t)中y取最大值是t的值。
1.自定義工具箱是什么
就像名字一樣,自定義工具箱是由個(gè)人創(chuàng)建的工具箱,就像下面這樣,可以理解成一個(gè) .tbx 后綴的壓縮包,每一個(gè)工具箱中都可以添加多個(gè)工具集、腳本工具甚至模型構(gòu)建器工具。
一大堆工具箱
1.1如何添加自定義工具箱(熟悉可跳過)
第一步:右鍵點(diǎn)擊 ArcToolbox - 添加工具箱
第二步:在打開的添加工具箱窗口中選中需要添加的工具,然后點(diǎn)擊右下角的打開即可。
添加工具箱到 Arcmap
1.2如何創(chuàng)建自定義工具箱
點(diǎn)擊右上角的紅色工具箱符號(hào),可以新建并重命名一個(gè)工具箱。
我們這里新創(chuàng)建了一個(gè)海怪工具箱,用于之后的教程演示。
新建工具箱
1.3添加一個(gè)腳本工具
新創(chuàng)建的工具箱就像一個(gè)大箱子,箱子呢是用來裝工具的,你可以直接在工具箱中右鍵,然后點(diǎn)擊添加,再點(diǎn)擊腳本,進(jìn)而創(chuàng)建一個(gè)腳本工具;
亦或是右鍵,點(diǎn)擊新建,再點(diǎn)擊工具集,創(chuàng)建一個(gè)可以自定義名稱的工具集,然后在工具集里新建一個(gè)腳本工具。
這里添加的腳本工具只是一個(gè)空殼,我們后面會(huì)繼續(xù)完善。
新建的工具箱位于 ../Chapter7/海怪工具箱.tbx。
2.工具箱的封裝
工具箱由三部分組成,其中有兩部分需要我們來控制:
一是輸入界面:確定工具箱輸入界面的參數(shù)定義和設(shè)置;
二是 Python 源代碼:功能的實(shí)現(xiàn),為 .py 后綴的腳本文件;
三是對參數(shù)行為提供額外控制的可選驗(yàn)證代碼,其位于工具箱中(這部分自帶,基本上不用修改)。
所以下面的重點(diǎn)就是輸入界面和 Python 源代碼。
2.1工具箱輸入界面
工具箱輸入界面,或者說圖形交互界面(GUI),就像下面的幾張圖一樣,從該界面我們可以控制工具的行為,自定義輸入界面然后配合 Python 腳本,可以實(shí)現(xiàn)多種客制化的功能。
簡單來說,你可以認(rèn)為輸入界面是依托于 Arcmap 的“前端”,腳本代碼就是負(fù)責(zé)運(yùn)行的“后端”。
導(dǎo)入導(dǎo)出工具:
為方便演示,制作一個(gè)非常簡單的工具箱,它的功能呢就是把輸入的要素類(數(shù)據(jù)庫或者 shp )再導(dǎo)出來而已,是完全沒有用的導(dǎo)入導(dǎo)出功能啦,不過作為演示還是非常不錯(cuò)的。
制作完成后的導(dǎo)入導(dǎo)出工具的界面
第一步:
在工具箱中,右鍵點(diǎn)擊添加,再點(diǎn)擊腳本,然后修改名稱,修改成你想要的名字,勾選存儲(chǔ)相對路徑名,然后點(diǎn)擊下一頁。
修改名稱
第二步:
然后添加腳本文件,添加該腳本文件 ../Chapter7/toolscript/input_and_output.py,讀者可以在最后的下載包中找到該文件。
然后點(diǎn)擊下一頁。
鏈接python腳本
第三步:
控制用戶交互界面。ArcGIS 在這里內(nèi)置了一整套簡單但是實(shí)用的圖形控件,比如輸入菜單、下拉框、多選框、單選等,借由這些圖形控件我們可以控制腳本工具的圖形交互界面。
我們這里使用的腳本功能非常簡單,上面也有說到:輸入一個(gè)矢量要素類,不做任何處理,然后輸出一個(gè)矢量要素類。
為了匹配這個(gè)腳本,我們需要設(shè)置一個(gè)輸入圖層的控件,同時(shí)為了能順利的輸出,也需要一個(gè)輸出圖層的控件,注意一個(gè)是輸入一個(gè)是輸出。
從下圖可以看到,左邊(左邊的橙色框)是顯示名稱,其中輸入輸出控件的名稱以及輸入控件的名稱,這里命名為輸入要素和輸出要素;然后在右邊(右邊的橙色框)的數(shù)據(jù)類型下拉框中,我們選擇要素圖層,這里只能做選擇,不能任意輸入。
設(shè)置名稱和數(shù)據(jù)類型
那么輸入輸出是如何區(qū)分的呢?
選中輸入要素(變成藍(lán)色),然后可以看到下方(下方橙色框)的參數(shù)屬性設(shè)置選項(xiàng)卡,這里可以對參數(shù)進(jìn)行調(diào)整。
參數(shù)選項(xiàng)
① 類型:有三種,一般只會(huì)用到 Required 和 Optional,表示必須和可選,用于控制參數(shù)是否可以忽略不填;
② 方向: 兩種,Input 和 Output,表示輸入和輸出,大部分情況都是使用 Input 來獲得參數(shù),Output 用于獲得最后的成果數(shù)據(jù),像是矢量、柵格或者圖表;
③ 多值:Yes 或者 No,用于輸入多個(gè)相同類型的數(shù)據(jù),工具打開后就是下面這樣,在輸入要素中可輸入多個(gè)要素類;
④ 默認(rèn):設(shè)置一個(gè)控件的默認(rèn)值,直接輸入即可??膳浜隙嘀狄煌褂?,使用 ; (英文的分號(hào))分開,
結(jié)果如下,可以看到一打開該工具就已經(jīng)填充上了預(yù)設(shè)的多個(gè)默認(rèn)值(報(bào)錯(cuò)是因?yàn)閿?shù)據(jù)類型不是要素圖層);
⑤ 環(huán)境:工具箱的環(huán)境設(shè)置,比如掩膜、容差范圍、默認(rèn)數(shù)據(jù)庫位置等,一般不預(yù)先設(shè)置;
⑥ 過濾器:選擇文件類型可以在選擇文件時(shí)只顯示特定格式的文件;
⑦ 獲取自:指定數(shù)據(jù)的獲取源。這是個(gè)什么意思呢?比如我們想要獲取圖層A的某個(gè)字段,獲取源就是圖層A。
以下面這種圖作為例子,新增名為字段的控件(上方的橙色框),數(shù)據(jù)類型也是字段,然后參數(shù)屬性中獲取自選擇輸入要素(下方橙色框)。
設(shè)置字段控件
點(diǎn)擊完成后,打開腳本工具。在輸入要素框中選擇一個(gè)圖層,然后再點(diǎn)擊獲取字段,如下就可以選擇圖層中的字段了。
獲取圖層的字段
⑧ 符號(hào)系統(tǒng):在最下面還有一個(gè)符號(hào)系統(tǒng),通常只能作用于輸出的矢量圖層(方向:Output),可為輸出圖層指定設(shè)置好的 lyr 文件樣式。
設(shè)置符號(hào)系統(tǒng)
第四步:
點(diǎn)擊右下方的完成,那么腳本工具的輸入界面就完成了。
2.2 Python 腳本
工具箱輸入界面和 Python 代碼要相互配合才行,工具箱界面中的輸入、輸出以及各種各樣的參數(shù),在 Python 腳本文件中都得一一對應(yīng)上,將輸入界面中的各個(gè)參數(shù)傳給 Python 腳本,這樣才能讓 Python 腳本按照預(yù)期的效果正常運(yùn)行。
看上去有點(diǎn)麻煩,但實(shí)際上 arcpy 中提供了現(xiàn)成的函數(shù)就可以直接獲得參數(shù)。
①參數(shù)對接(獲?。?/p>
至于如何對接參數(shù),我們使用剛剛的那個(gè)腳本文件舉例:
../Chapter7/toolscript/input_and_output.py
# -*- coding:utf-8 -*-
import arcpy
#?1?
input_lyr = arcpy.GetParameterAsText(0)
output = arcpy.GetParameterAsText(1)
if __name__ == '__main__':
lyr = arcpy.mapping.Layer(input_lyr)
arcpy.CopyFeatures_management(lyr, output)
?1?:arcpy 提供了 GetParameterAsText(index) 函數(shù),該函數(shù)根據(jù)輸入界面的排序號(hào)碼獲得指定的參數(shù)。比如 GetParameterAsText(0) 獲得的就是輸入圖層參數(shù), GetParameterAsText(1) 獲得的就是第二個(gè)參數(shù),也就是輸出圖層參數(shù)。
如果有更多參數(shù),以此類推。
②參數(shù)對接中應(yīng)該注意的情況
GetParameterAsText(index) 從輸入界面獲得的參數(shù)都會(huì)轉(zhuǎn)變成字符串,沒錯(cuò)都是字符串。
如果你只是輸入輸出地址這種,那么沒有問題,因?yàn)榈刂繁緛砭褪亲址?,但是如果你設(shè)置了一個(gè)選擇長度范圍的長整型的控件、亦或是某種布爾值選擇,最后輸入到 python 腳本這里都會(huì)變成字符串。
整數(shù)變成字符串,使用 int(str) 規(guī)避;
布爾型變成字符串,True 變成了 "True",F(xiàn)alse 變成了 "False",這樣就不能判斷真假了,需要寫一個(gè)判斷語句或者隨便你,方法很多;
還有就是一個(gè)輸入控件多值的情況,所有值根據(jù)先后連接成一個(gè)字符串,中間由 、(英文分號(hào))間隔,可以使用 split 函數(shù)分開;