ArcGIS制圖之Sub Points點抽稀


簡介

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 的值,表示要刪除或者不在地圖上顯示的要素。可通過定義查詢操作來控制地圖顯示內容,如下圖所示。也可以直接刪除不顯示的要素。

結果

抽稀效果如下:對於本來就稀疏的位置,並沒有進行抽稀。對於原來密集的地區(小於最小鄰近距離)抽稀效果比較良好。

源碼和工具下載:http://www.400gb.com/file/125432726


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM