在GIS中,地標或者道路等信息查找是一項很重要的功能,類似於我們查找數據庫記錄那樣,需要模糊 進行匹配,一般來說,找到需要的地標或者道路等地圖元素後,雙擊可以定位到地圖的具體位置,並放大 地圖,類似於Google Map的Fly to功能。
由於地圖的信息是按照層來存儲的,所以我們查找信息 的時候,也是按照一層層來進行檢索,由於MapInfo的地圖一般有很多層,每層進行遍歷會比較花費時間 ,所以一般的專業系統,都只是關系一部分層,我們通常在配置文件中指定感興趣的層名集合,然後查找 的時候,在這些層中查找,這樣可以提高檢索的速度。
我們看看操作層的代碼,是如何實現的。
foreach (string layer in layerNameArray)
{
if (string.IsNullOrEmpty(layer))
continue;
try
{
#region 每層的查詢
string condition = string.Format("NAME like \"%{0}%\"", SearchLocation);
MapXLib.Layer mapLayer = TarMap.Layers._Item(layer);
if (mapLayer != null)
{
feature = mapLayer.Search(condition, null);
int count = feature.Count;
if (feature != null)
{
MapXLib.Dataset ds = TarMap.DataSets.Add(MapXLib.DatasetTypeConstants.miDataSetLayer, mapLayer, layer,
0, 0, 0, Missing.Value, false);
Dictionary<string, ResultOfSearching> resultList = new Dictionary<string, ResultOfSearching>();
//To Do 遍 歷特性代碼,待續
TarMap.DataSets.RemoveAll();
}
}
#endregion
}
catch (Exception ex)
{
LogHelper.Error(ex);
}
}
查找的時候,我們得到了每個Feature,然後對Feature的ID和Name進行判斷查找,如何有匹配的,就表示 找到了一個對象,如果最後一個也沒有,那麼本次地圖查找應該沒有匹配的元素了,Feature的查找代碼 如下所示
#region 遍歷特性
for (int i = 1; i < feature.Count; i++)
{
try
{
object objLocation = ds.get_Value(feature[i], "Name");
object objID = ds.get_Value(feature[i], "Id");
string strLocation = (objLocation == null) ? "" : objLocation.ToString();
string strID = (objID == null) ? "" : objID.ToString();
if (!resultList.ContainsKey(strID) && feature[i].FeatureID != 0)
{
ResultOfSearching searchInfo = new ResultOfSearching();
searchInfo.FeatureID = feature[i].FeatureID;
searchInfo.ID = strID;
searchInfo.Layer = layer;
searchInfo.Location = feature [i].Name;
if (!resultList.ContainsKey(strID))
{
resultList.Add(strID, searchInfo);
}
if (!allResultList.ContainsKey(strID))
{
allResultList.Add(strID, searchInfo);
}
}
}
catch(Exception ex)
{
//LogHelper.Error(ex);
}
}
#endregion
我們遍歷每層,對 每層的Feature的信息進行查找,把結果放到集合中,當我們返回集合的時候,我們就可以把搜索到的信 息顯示在樹形控件中了。
if (searchResult != null && searchResult.Count > 0)
{
this.tvwResult.BeginUpdate();
TreeNode node = null;
foreach (ResultOfSearching info in searchResult.Values)
{
if (!string.IsNullOrEmpty(info.Location))
{
node = tvwResult.Nodes.Add (info.Location);
node.Tag = info;
}
}
this.tvwResult.EndUpdate();
this.tssl_Status.Text = string.Format("從地圖上找到 {0} 結果", searchResult.Count);
}
else
{
this.tssl_Status.Text = "地圖上找不到您 需要的數據";
}
最後我們看到查找信息的界面如下所示
文章來源:http://www.cnblogs.com/wuhuacong/archive/2009/10/30/1593222.html