簡介
Sub Points工具是 Esri 中國自主開發的一個插件,該工具優先考慮點在空間分布上的均勻合理性,並結合點數據中包含的 "優先級" 屬性進行篩選。通過獲取每個點在一定范圍內擁有的相鄰點的數目信息,得到地圖中點密度的分布狀況。抽稀時在若干相臨近的點中首先比較優先級,保留優先級高的;優先級相同時比較 NAME 字段,保留 NAME 長度短的;兩者都相同時隨機選擇。使用 Sub Points 進行點抽稀的數據,必須包含"優先級"和"name"兩個字段。其中優先級用來設置數據的重要性,在抽稀過程中綜合考慮數據的優先級別。
修改程序
原始版本是基於10.0開發的,在10.1及以上版本需要修改兩處:
一是SubPointsFunctionFactory.cs文件中CreateGPFunctionNames方法的MinimumProduct屬性修改為:
functionName.MinimumProduct = esriProductCode.esriProductCodeBasic;
二是SubPointsFunction.cs文件中IsLicensed()函數修改為:
IAoInitialize myAoInitialize = new AoInitializeClass(); ILicenseInformation myLic = (ILicenseInformation)myAoInitialize; string myLic= myLic.GetLicenseProductName(myAoInitialize.InitializedProduct()); if (myLic == "Advanced") return true; else return false;
如果這兩處不修改將會出現許可報錯的問題:
三是SubPointsFunction.cs字段名稱的修改。在10.0的版本中字段名稱是小寫,從10.1起字段名稱為大寫(本來arcgis不區分大小寫,但程序代碼中的判斷語句區分了大小寫,沒有使用大小寫轉換函數)。
int iInputFID = pPDTable.FindField("INPUT_FID"); int iNearFID = pPDTable.FindField("NEAR_FID"); int iDistance = pPDTable.FindField("DISTANCE");
除此之外,我還修改了界面的語言為中文。
使用方法
第一步,注冊文件。將GPSubPoints.dll拷到arcgis安裝目錄下(如C:\Program Files (x86)\ArcGIS\Desktop10.1\bin),在dll上右鍵,選擇打開方式為ESRIRegAsm.exe (瀏覽到C:\Program Files (x86)\Common Files\ArcGIS\bin\ESRIRegAsm.exe),一般情況下會注冊成功,並彈出提示消息。(如果安裝360等,請將它加入白名單)
第二步,添加工具。打開ArcMap,在我的工具箱(非系統工具箱)上添加工具箱,然后添加工具,選擇sub points.
第三步,生成鄰近表。使用點距離工具生成鄰近表,輸入和鄰近要素都為需要進行抽稀的點數據,搜索半徑為抽稀后任意兩個點的最大距離。
第四步,新建字段。在需要抽稀的點數據屬性表中新建名稱"NAME"和"優先級"( short)的字段,並給"優先級"字段賦值。其中優先級用來設置數據的重要性,在抽稀過程中綜合考慮數據的優先級別。如果沒有相應的字段將會報錯或警告。
第五步,執行抽稀工具。輸入鄰近表和要進行抽稀的要素,執行抽稀。
第六步,定義查詢。結果並未生成新數據、也未刪除原來的點,只是增加了標記字段status. 對於 status > -99 的值,表示要保留顯示的要素; 對於 status = -99 的值,表示要刪除或者不在地圖上顯示的要素。可通過定義查詢操作來控制地圖顯示內容,如下圖所示。也可以直接刪除不顯示的要素。
結果
抽稀效果如下:對於本來就稀疏的位置,並沒有進行抽稀。對於原來密集的地區(小於最小鄰近距離)抽稀效果比較良好。