搜尋核心演算法
- 從設定檔讀取需搜尋的圖層名稱集合 (避免全圖層遍歷提升效能)。
- 逐層建立
Search 條件:NAME LIKE \"%{keyword}%\"。
- 呼叫
Layer.Search(condition, null) 取得 Feature 集合。
- 將
Feature 包裝為 Dataset 以便統一存取屬性。
- 遍歷
Feature 擷取名稱、座標等資訊,封裝為 ResultOfSearching 存入 Dictionary。
- 搜尋完成移除暫時
DataSets。
關鍵程式碼
foreach (string layerName in layerNameArray)
{
if (string.IsNullOrEmpty(layerName)) continue;
try
{
string condition = $@"NAME LIKE ""%{searchKeyword}%""";
var mapLayer = _map.Layers._Item(layerName);
if (mapLayer == null) continue;
var features = mapLayer.Search(condition, null);
if (features == null || features.Count == 0) continue;
// 建立暫時 Dataset 方便屬性存取
var ds = _map.DataSets.Add(DatasetTypeConstants.miDataSetLayer, mapLayer,
layerName, 0, 0, 0, Type.Missing, false);
var results = new Dictionary();
// TODO: 遍歷 features 擷取屬性、座標,填入 results
_map.DataSets.RemoveAll(); // 清理暫時 Dataset
}
catch (Exception ex) { LogHelper.Error(ex); }
}
效能優化建議
- 僅搜尋設定檔指定的圖層 (如 POI、道路、行政區),忽略背景影像、註記等大圖層。
- 大量資料考慮建立空間索引或全文檢索引擎 (Lucene.NET) 輔助。
- 結果分頁顯示,避免一次回傳過多資料導致 UI 凍結。