一、約束規則
約束規則用于指定要素上允許的屬性配置和一般關系。
與計算規則不同,約束規則不用于填充屬性,而是用于確保要素滿足特定條件。
簡單理解,約束規則就是約束你的編輯操作在什么情況下可執行。
如果出現不符合規則的操作,就會報錯,操作中斷。
1、禁止刪除特定的要素
如果你想控制你的編輯操作,避免某些圖斑被誤刪除,就可以設定這樣的規則。
比如在用地圖斑中,我不想【耕地】被刪除,可以將觸發器選擇為【刪除】,在表達式中輸入:
if ($feature.DLMC != "耕地")
{return true;
}
刪除的圖斑如果【DLMC】的字段值為“耕地”,就會彈出錯誤。
2、限制編輯內容在特定范圍內
比如數據庫里有2個圖層,(因為代碼要通過數據庫這一共同聯系作為媒介,所以2個圖層一定要在同一數據庫內)。
限制設施點必須在用地范圍的邊界內。
將觸發器選擇為【插入、更新】,在表達式中輸入:
// 從同一個數據庫里找到“用地范圍”
var fw = FeatureSetByName($datastore, "用地范圍", null, false);
// 用地范圍和當前編輯的設施點相交,如果結果不為空(數量大于0),就給予通過。
// 否則就報錯
return Count(Intersects(fw, Geometry($feature))) > 0
新創建的設施點如果在用地范圍外,就會彈出錯誤。
3、禁止碎面
可以通過限制圖斑的面積來禁止碎面的產生。
將觸發器選擇為【插入、更新】,在表達式中輸入:
// 獲取圖斑面積
var mj = area(geometry($feature));
// 如果面積大于1平方米,就通過
if(mj>1)return true
新創建或修改的圖斑面積小于1平方米,就會彈出錯誤:
4、禁止超短線
通過計算相鄰點之間的距離,可以禁止畫出超短線。
將觸發器選擇為【插入、更新】,在表達式中輸入:
// 獲取環
var rings = geometry($feature)["rings"]
// 逐環處理
for(var i in rings){// 環內每個點處理for(var j=0; j < count(rings[i])-1; j++) {// 算距離 var dis = Distance(rings[i][j],rings[i][j+1],'meters')if(dis>1)return true}
}
創建或修改的時候,如果邊界點之間的距離小于1米,就會彈出錯誤:
5、禁止尖銳角
通過計算相鄰3個點之間的角度,可以禁止畫出尖銳角。
將觸發器選擇為【插入、更新】,在表達式中輸入:
// 獲取環
var rings = geometry($feature)["rings"]
// 逐環處理
for(var i in rings){// 環內每個點處理for(var j=0; j < count(rings[i])-2; j++) {// 算角度 var ang = Angle(rings[i][j],rings[i][j+1],rings[i][j+2])// 保證在180度內if(ang>180)ang = 360-ang// 小于20度就報錯if(ang<20)return false}
}
return true
這里我省略了計算最后一個點的情況,要計算的話,需要把第一個點加到列表末尾,有興趣的可以自己試試。
創建或修改的時候,如果邊界點的角度小于20度,就會彈出錯誤:
二、驗證規則
驗證規則用于驗證數據集中的錯誤。根據規則對現有要素進行評估,如果違反規則,則會創建錯誤要素。
表達式寫法和計算、約束差不多。
這部分軟件預制了許多規則,點擊即用型規則,可以看到如下:
但是我試用過后,發現過程繁瑣,而且有疑似bug,總之不太好用,有興趣的可以自行嘗試。
后面有空可以專門出一篇關于屬性規則使用步驟的文章。