測地線演算法
㈠ gis緩沖區分析中給定固定緩沖值和以欄位值緩沖的區別
區別如下:
固定數值的緩沖和不同寬度的緩沖(基於每一個欄位),不僅僅是給路線做相同寬度的緩沖,還可以在一個線圖層中,對不同子類的線設置不同寬度的緩沖。
分為歐式緩沖區和測地線緩沖區,歐式緩沖區測量的是平面上的距離,適合投影坐標系下的小區域使用(投影之後存在變形,而歐式緩沖區是根據任意位置所有映射距離均相同這一錯誤假設為前提,所以當回到實際橢球體上時緩沖距離就不正確了,投影變形越大的地方越不準確);當輸入要素為地理坐標系,由線性單位(比如米、英尺)指定緩沖距離時,使用的就是測地線緩沖演算法,生成測地線緩沖區,因為根據橢球上的實際情況計算距離,計算復雜,所以生成的速度較歐式緩沖區較慢。在全球尺寸內進行任意類型的距離分析時,應使用測地線緩沖區,因為測地線緩沖區在所有區域均較為准確,而歐氏緩沖區在高變形區域准確度較低。
㈡ python編寫用pow()函數計算球的體積
使用鍵盤輸入值並不是編輯表中值的唯一方式。在某些情況下,為了設置欄位值,可能要對單條記錄甚至是所有記錄執行數學計算。您可以對所有記錄或選中記錄執行簡單計算和高級計算。此外,還可以在屬性表中的欄位上計算面積、長度、周長和其他幾何屬性。以下各部分包括使用欄位計算器的若干示例。使用 Python、SQL 和 Arcade 執行計算。
本主題著重於基於 Python 的計算欄位示例。要了解有關 Arcade 表達式的詳細信息,請參閱 ArcGIS Arcade 指南。要了解有關 SQL 表達式的詳細信息,請參閱計算欄位。
註:
Python 強制將縮進作為語法的一部分。請使用兩個或四個空格來定義每個邏輯級別。將語句塊的開頭和結尾對齊並且保持一致。
Python 計算表達式欄位將使用驚嘆號 (!!) 括起。
命名變數時,請注意 Python 區分大小寫,因此 value 不同於 Value。
輸入語句後,如果想將其寫入文件,請單擊導出。導入按鈕將提示您查找和選擇一個現有的計算文件。
在表達式中應用任意 Python 函數。
訪問地理處理函數和對象。
訪問要素幾何的屬性。
訪問新的隨機值運算符。
使用 if-then-else 邏輯對值進行重分類。
面積測量單位關鍵字:
ACRES | ARES | HECTARES | SQUARECENTIMETERS | SQUAREDECIMETERS | SQUAREINCHES | SQUAREFEET | SQUAREKILOMETERS | SQUAREMETERS | SQUAREMILES | SQUAREMILLIMETERS | SQUAREYARDS | SQUAREMAPUNITS | UNKNOWN
線性測量單位關鍵字:
CENTIMETERS | DECIMALDEGREES | DECIMETERS | FEET | INCHES | KILOMETERS | METERS | MILES | MILLIMETERS | NAUTICALMILES | POINTS | UNKNOWN | YARDS
簡單計算
僅通過一個短表達式就可以計算出多種計算結果。
簡單字元串示例
一系列 Python 字元串函數均支持使用字元串,包括 capitalize、rstrip 和 replace。
將 CITY_NAME 欄位中字元串的首字母大寫。
!CITY_NAME!.capitalize()
去掉 CITY_NAME 欄位中自字元串結尾起的所有空白區。
!CITY_NAME!.rstrip()
將 STATE_NAME 欄位中的「california」全部替換為「California」。
!STATE_NAME!.replace("california", "California")
在 Python 中,字元串欄位中的字元可以通過索引和分割操作進行訪問。索引操作將在索引位置提取字元,而分割操作則會提取一組字元。在下表中,假設 !fieldname! 是值為 "abcde" 的字元串欄位。
示例
說明
結果
!fieldname![0]
第一個字元
"a"
!fieldname![-2]
倒數第二個字元
"d"
!fieldname![1:4]
第二、三和四個字元
"bcd"
Python 也支持使用 format() 方法的字元串格式。
將合並後的 FieldA 和 FieldB 以冒號分隔開。
"{}:{}".format(!FieldA!, !FieldB!)
常見 Python 字元串操作
簡單數學示例
Python 提供了處理數字的工具。Python 也支持一些數值和數學函數,包括 math、cmath、decimal、random、itertools、functools 和 operator。
運算符
說明
示例
結果
x + y
x 加上 y
1.5 + 2.5
4.0
x - y
x 減去 y
3.3 - 2.2
1.1
x * y
x 乘以 y
2.0 * 2.2
4.4
x / y
x 除以 y
4.0 / 1.25
3.2
x // y
x 除以 y(向下取整除法)
4.0 // 1.25
3.0
x % y
x 模 y
8 % 3
2
-x
x 的負數表達式
x = 5
-x
-5
+x
x 不變
x = 5
+x
5
x ** y
以 x 為底,以 y 為指數的冪
2 ** 3
8
乘
!Rank! * 2
根據給定的半徑欄位計算球體的體積。
4.0 / 3.0 * math.pi * !Radius! ** 3
舊版本:
在 ArcGIS Pro 中,使用的是 Python 3,在 ArcGIS Desktop 中,使用的 Python 2。Python 2 使用的是整型數學計算,這就意味著兩個整型值相除將始終生成整型值 (3 / 2 = 1)。在 Python 3 中,兩個整型值相除將生成浮點型值 (3 / 2 = 1.5)。
Python 內置函數
Python 包含多個可用的內置函數,包括 max、min、round 和 sum。
Python 內置函數
通過欄位列表計算每條記錄的最大值。
max([!field1!, !field2!, !field3!])
通過欄位列表計算每條記錄的總和。
sum([!field1!, !field2!, !field3!])使用代碼塊
通過 Python 表達式和代碼塊參數可執行以下操作:
表達式類型
代碼塊
Python 3
支持 Python 功能。使用 Python 函數 (def) 表示代碼塊。在適當的情況下,幾何屬性將通過地理處理對象表示(如點對象)。
Arcade
支持 Arcade 功能。
SQL
支持 SQL 表達式。
執行 SQL 表達式可以更好地支持使用要素服務和企業級地理資料庫的計算,尤其是在性能方面。使用該表達式可以將單次請求設置為要素服務或資料庫,而不必一次執行一個要素或一行的計算。
舊版本:
在 ArcGIS Desktop 中,計算欄位工具支持 VB、PYTHON 和 PYTHON_9.3 表達式類型。VB 表達式類型,在某些產品中受支持,但在 64 位產品中不受支持,其中包括 ArcGIS Pro。
出於相後兼容性考量,ArcGIS Pro 中仍然支持 PYTHON 和 PYTHON_9.3 關鍵字,但是不會作為選擇列出。使用這些關鍵字的 Python 腳本將可繼續使用。
Python 3 表達式類型與舊版 PYTHON_9.3 關鍵字的唯一區別在於 Python 3 會將日期欄位中的值作為 Python datetime 對象返回。
註:
Python 3 表達式類型與隨 ArcGIS Pro 安裝的 Python 版本無關。這只是歷史上的第三個 Python 相關關鍵字(繼 PYTHON 和 PYTHON_9.3 之後。
各 Python 函數可通過 def 關鍵字定義,關鍵字後為函數名稱及函數的輸入參數。可編寫 Python 函數,使 Python 函數能夠接受任何數量的輸入參數(也可以沒有任何參數)。函數將通過 return 語句返回值。函數名稱可由您自行選取(不得使用空格,也不得以數字開頭)。
註:
如果函數未通過 return 語句顯式返回值,則函數將返回 None。
註:
請牢記,Python 強制要求將縮進作為語法的一部分。請使用四個空格來定義每個邏輯級別。將語句塊的開頭和結尾對齊並且保持一致。
代碼示例 - 數學
在使用以下數學示例時,請假設表達式類型為 Python 3。
將欄位的值四捨五入為保留兩位小數。
表達式:
round(!area!, 2)
通過 math 模塊將米轉換成英尺。以轉換值為底,以 2 為指數進行冪運算,然後再乘以 area。
表達式:
MetersToFeet((float(!shape.area!)))
代碼塊:
import math
def MetersToFeet(area):
return math.pow(3.2808, 2) * area通過 Python 邏輯計算欄位
可以使用 if、else 和 elif 語句將邏輯模式包含在代碼塊中。
按照欄位值進行分類。
表達式:
Reclass(!WELL_YIELD!)
代碼塊:
def Reclass(WellYield):
if (WellYield >= 0 and WellYield <= 10):
return 1
elif (WellYield > 10 and WellYield <= 20):
return 2
elif (WellYield > 20 and WellYield <= 30):
return 3
elif (WellYield > 30):
return 4代碼實例 - 幾何
除以下代碼示例外,請參閱下方的「幾何單位轉換」部分,以了解有關轉換幾何單位的詳細信息。
計算某要素的面積。
表達式:
!shape.area!
計算某要素的最大 x 坐標。
表達式:
!shape.extent.XMax!
計算某要素中的折點數。
表達式:
MySub(!shape!)
代碼塊:
def MySub(feat):
partnum = 0
# Count the number of points in the current multipart feature
partcount = feat.partCount
pntcount = 0
# Enter while loop for each part in the feature (if a singlepart
# feature, this will occur only once)
while partnum < partcount:
part = feat.getPart(partnum)
pnt = part.next()
# Enter while loop for each vertex
while pnt:
pntcount += 1
pnt = part.next()
# If pnt is null, either the part is finished or there
# is an interior ring
if not pnt:
pnt = part.next()
partnum += 1
return pntcount
將點要素類中每個點的 x 坐標平移 100。
表達式:
shiftXCoordinate(!SHAPE!)
代碼塊:
def shiftXCoordinate(shape):
shiftValue = 100
point = shape.getPart(0)
point.X += shiftValue
return point幾何單位轉換
幾何欄位的面積和長度屬性可通過用 @ 符號表示的單位類型進行修改。
註:
如果數據存儲在地理坐標系中且具有線性單位(例如英尺),則會通過測地線演算法轉換長度計算的結果。
警告:
轉換地理坐標系中數據的面積單位會生成不正確的結果,這是由於沿 globe 的十進制度並不一致。
計算某要素的長度(以碼為單位)。
表達式:
!shape.length@yards!
計算某要素的面積(以英畝為單位)。
表達式:
!shape.area@acres!
測地線面積和長度也可以通過帶 @(後跟測量單位關鍵字)的 geodesicArea 和 geodesicLength 屬性進行計算。
計算某要素的測地線長度(以碼為單位)。
表達式:
!shape.geodesicLength@yards!
計算某要素的測地線面積(以英畝為單位)。
表達式:
!shape.geodesicArea@acres!代碼實例 - 日期
日期和時間可使用 datetime 和 time 模塊進行計算。
計算當前日期。
表達式:
time.strftime("%d/%m/%Y")
計算當前日期和時間。
表達式:
datetime.datetime.now()
計算的日期為 2000 年 12 月 31 日。
表達式:
datetime.datetime(2000, 12, 31)
計算當前日期和欄位中的值之間的天數。
表達式:
(datetime.datetime.now() - !field1!).days
通過向欄位中的日期值添加 100 天來計算日期。
表達式:
!field1! + datetime.timedelta(days=100)
計算欄位中的日期值為一周中的周幾(例如,星期天)。
表達式:
!field1!.strftime('%A')代碼實例 - 字元串
可以使用多種 Python 編碼模式來完成字元串計算。
返回最右側三個字元。
表達式:
!SUB_REGION![-3:]
將所有大寫字母 P 替換為小寫字母 p。
表達式:
!STATE_NAME!.replace("P","p")
通過空格分隔符串連兩個欄位。
表達式:
!SUB_REGION! + " " + !STATE_ABBR!轉換為正確的大小寫形式
下列各例顯示的是轉換單詞的不同方法,這些方法可使每個單詞的首字母變為大寫、其餘字母變為小寫。
表達式:
' '.join([i.capitalize() for i in !STATE_NAME!.split(' ')])表達式:
!STATE_NAME!.title()正則表達式
Python 的 re 模塊提供了正則表達式匹配操作,可用於對字元串執行復雜的模式匹配和替換規則。
re - 正則表達式運算正則表達式的用法
使用單詞 Street 替換 St 或 St.,在字元串的末尾生成一個新單詞。
表達式:
update_street(!ADDRESS!)
代碼塊:
import re
def update_street(street_name):
return re.sub(r"""(St|St.)""",
'Street',
street_name)累加計算和順序計算
可以使用全局變數來進行累加計算和順序計算。
根據某間隔值計算順序 ID 或數字。
表達式:
autoIncrement()
代碼塊:
rec=0
def autoIncrement():
global rec
pStart = 1 # adjust start value, if req'd
pInterval = 1 # adjust interval value, if req'd
if (rec == 0):
rec = pStart
else:
rec = rec + pInterval
return rec
計算數值型欄位的累加值。
表達式:
accumulate(!FieldA!)
代碼塊:
total = 0
def accumulate(increment):
global total
if total:
total += increment
else:
total = increment
return total
計算數值型欄位的百分比增量。
表達式:
percentIncrease(float(!FieldA!))
代碼塊:
lastValue = 0
def percentIncrease(newValue):
global lastValue
if lastValue:
percentage = ((newValue - lastValue) / lastValue) * 100
else:
percentage = 0
lastValue = newValue
return percentage隨機值
可以使用 random 模塊來計算隨機值。
通過 numpy 站點包來計算 0.0 和 1.0 之間的隨機浮點值。
表達式:
getRandomValue()
代碼塊:
import numpy
def getRandomValue():
return numpy.random.random()
使用隨機模塊來計算 0 與 10 之間的隨機整數。
表達式:
random.randint(0, 10)
代碼塊:
import random計算空值
在 Python 表達式中,可通過 Python None 來計算空值。
註:
僅當該欄位為空時,才可以進行以下計算。
使用 Python None 計算空值。
表達式:
None相關主題
有關欄位計算的基礎知識
授權轉載:gisoracle
網課學習 + 權威結業證書
我們精心匯總了一些相對簡單
培訓考核通過便可獲取的證書
自然資源部職鑒中心發證
可用於招投標、資質系統
等
測繪師繼續教育20學時
中國測繪網新媒體中心
商務合作/微信 214979525
㈢ 分水嶺演算法的應用
數學形態學一個應用是分水嶺演算法,為了便於理解,可以將圖像的灰度空間與地球表面的地形高度相類比,據此,發明了應用於圖像領域的分水嶺演算法。
假設,如下圖所示的一個島嶼,要從 點走到 點,虛線所表示的是最短的直線距離,也就是歐式距離,考慮到現實情況,不能穿過水面到達目標地點,所以,能夠從起點到終點的實際通行路線中最短的距離成為測地線距離。
通過以上分析,給出測地線距離的定義:
給定指定連通域 ,測地線距離就是 中兩個像素點 和 之間的最短(可執行)路徑的長度,用公式定義如下:
如下圖所示,假定一個連通域 包含了若干個子區域 ,用公式表示 所表示的測地線影響域為:
以上公式可以理解為,區域 中的像素點到 域的測地線距離比其他域更小的點的軌跡的集合,也就是以 域中的種子點出發,其測地線距離比其他域的種子點都要小的點集所構成的區域。如下圖所示:
SKIZ表示區域 中的點不屬於任何一個測地線影響域,也就是域 中的點到兩個測地線影響域的中測地線距離相等。區域 中構成 的SKIZ,記作 ,用公式的表述如下:
注意:, 表示區域 以外的 中的所有點的集合集合
如下圖所示的山脈地形圖,包含山谷和山峰,在水平面不斷上升的過程中,會逐漸淹沒掉一些較低的區域,而為了防止水溢出,需要不斷在山脊上修建大壩,這個過程不斷進行,最後會得到一個區域分割的效果。
在一副圖像上實現分水嶺演算法,與上述過程相似,只不過是通過灰度值充當水平面的角色,對圖像進行不斷的填埋,最後得到區域分割的效果圖。
如上圖所示的動畫中,不斷用灰度值代表的水平面淹沒圖像中的最小值,最後得到分割後的圖像。綜上,分水嶺演算法的步驟可以總結如下:
如下圖所示,另外一種分水嶺演算法的原理是,指定初始的種子點,只對種子點所在的鄰域像素進行分類,而不考慮其他區域。
如下圖所示的圖片,以最小點開始,進行分水嶺演算法,會將整幅圖分割成許多小區域,造成過分割的效果。為了解決這一問題,有以下三種解決方案:
最後,通過合並一些小區域再利用分水嶺演算法進行分割的效果如下圖所示:
如下圖所示,展示了通過分水嶺演算法分割血細胞的流程:
㈣ arcgis9.3怎麼使用python
Python 表達式可通過 幾何對象中的屬性(type、extent、centroid、firstPoint、lastPoint、area、length、isMultipart 和 partCount)進行創建。
!shape.area!
Python 表達式可以使用具有面積或線性單位的幾何 area 和 length 屬性將值轉換為不同的測量單位(例如 !shape.length@kilometers!)。如果數據存儲在地理坐標系中且具有線性單位(例如英里),則使用測地線演算法計算長度。在地理數據中使用面積單位會產生不正確的結果,這是由於沿 globe 的十進制度並不一致。
面積測量單位關鍵字:
英畝 | 公畝 | 公頃 | 平方厘米 | 平方分米 | 平方英寸 | 平方英尺 | 平方千米 | 平方米 | 平方英里 | 平方毫米 | 平方碼 | 平方地圖單位 | 未知
線性測量單位關鍵字:
厘米 | 十進制度 | 分米 | 英尺 | 英寸 | 千米 | 米 | 英里 | 毫米 | 海里 | 磅 | 未知 | 碼
在工具對話框中,可將表達式直接輸入到表達式參數中,或者使用「欄位計算器」以交互方式構建表達式。
使用所選要素集(如從創建要素圖層或按屬性選擇圖層內的查詢中創建的要素集)時,此工具將只更新所選的記錄。
每次操作僅能對一個欄位應用計算。
現有欄位值將被覆蓋。如果想要保留原始欄位值,應創建輸入表副本
對於 Python 計算,必須在欄位名稱兩旁添加驚嘆號(!欄位名!)。
對於 VB 計算,欄位名稱必須用方括弧括起([欄位名])。
計算文本或字元欄位的字元串時,在對話框中,必須對字元串添加雙引號("字元串"),而在腳本中,還必須對加雙引號的字元串添加單引號('"字元串"')。
此工具也可用於更新字元項。應對使用字元串的表達式添加單引號(例如 [CHARITEM] = 『新字元串')。但是,如果字元串已包含單引號,則要對該字元串添加雙引號,例如 [CHARITEM] = "類型'A'"。
要計算數值欄位,可在表達式參數中輸入數值;值的兩旁無需加引號。
如果已指定 Python 表達式,則此工具支持 arcgis.rand() 函數。已為 ArcGIS 工具創建 arcgis.rand() 函數,不應將此函數與 Python Rand() 函數相混淆。arcgis.rand() 函數的可用分布的語法在隨機值的分布語法中進行介紹。
表達式與代碼塊會相互連接。代碼塊必須返回與表達式的關聯;代碼塊的結果應傳入到表達式中。
代碼塊參數可用於創建復雜表達式。您可以在對話框中直接輸入代碼塊,或在腳本中將代碼塊作為連續字元串輸入。
Python 數學模塊及格式可供代碼塊參數使用。您可以導入附加模塊。數學模塊可提供數論函數與表達函數、冪函數與對數函數、三角函數、角度轉換函數、雙曲函數以及數學常數。要了解更多有關數學模塊的內容,請參閱 Python 的幫助。
保存的 ArcGIS 先前版本的 VB .cal 文件可以直接使用或者只需做少量修改後即可使用。如果擁有使用 ArcObjects 的過去版本的 VBA 代碼,則計算需經過修改後才能用於 10.0。
計算連接數據時,您無法直接計算連接列。然而,您可以直接計算源表的列。要計算連接數據,必須先將連接表或連接圖層添加至 ArcMap。然後可以分別對此數據執行計算。這些更改將反映在連接列中。
計算欄位示例
㈤ 圖像分割演算法那麼多 如何正確的使用適合的演算法
從學術角度講圖像分割主要分成3大類,一是基於邊緣的,二是基於區域的,三是基於紋理的。由於基於紋理的也可以看成是基於區域的,所以有些專家也把分割方法分成基於邊緣和基於區域兩大類。
選擇演算法的時候主要參考你要分割的圖像樣本的特點。
如果圖像的邊界特別分明,比如綠葉和紅花,在邊界處紅綠明顯不同,可以精確提取到邊界,這時候用基於邊緣的方法就可行。但如果是像醫學圖像一樣,輪廓不是特別明顯,比如心臟圖像,左心房和左心室顏色比較接近,它們之間的隔膜僅僅是顏色比它們深一些,但是色彩上來說很接近,這時候用基於邊緣的方法就不合適了,用基於區域的方法更好。再比如帶紋理的圖像,例如條紋衫,如果用基於邊緣的方法很可能就把每一條紋都分割成一個物體,但實際上衣服是一個整體,這時候用基於紋理的方法就能把紋理相同或相似的區域分成一個整體。
不過總體來說,基於區域的方法近些年更熱一些,如Meanshift分割方法、測地線活動輪廓模型、JSEG等。
㈥ 中間中心度的計算方法
計算方法為其他任何兩點的測地線,以及過該點的測地線數目之比。(測地線表示兩點之間的最短距離)。
中間中心度表示該點的「中間人」程度,即媒介程度。分為相對和絕對。
度中心性(Degree Centrality)是在網路分析中刻畫節點中心性(Centrality)的最直接度量指標。一個節點的節點度越大就意味著這個節點的度中心性越高,該節點在網路中就越重要。
相關概念:
度中心性只是衡量節點中心性的指標之一,以下舉出其它三個衡量節點中心性的主要指標:
接近中心性(Closeness Centrality)。反映在網路中某一節點與其他節點之間的接近程度。
中介中心性/中間中心性(Between Centrality)。以經過某個節點的最短路徑數目來刻畫節點重要性的指標。
特徵向量中心性(Eigenvector Centrality)。一個節點的重要性既取決於其鄰居節點的數量(即該節點的度),也取決於其鄰居節點的重要性。