在C#中實現MapX從數據庫讀取數據形成新圖層分為兩個問題: 1. MapX從數據庫讀取數據形成新圖層; 2. 將DataTable轉換為ADO的Recordset。這裡的第二個問題是由第一個問題引起的,因為MapX是一個COM控件,而且它只支持ADO的數據訪問方式,而C#編程時一般會使用ADO.NET方式,為此需要在兩種方式之間做一下轉換。(當然也可以在C#中使用ADO方式,但這畢竟是落後的方法。該解決辦法可參考文章《Visual Basic.NET中使用ADO訪問數據庫》)。對第二個問題的解決辦法,參見作者的另一篇文章《將DataTable對象轉換為Recordset對象》(http://blog.csdn.Net/allentao/archive/2005/05/11/373634.ASPx),本文章只講述在得到了Recordset對象後,如何解決第一個問題。 步驟如下: 1. 創建CMapXFIElds對象,並對應數據庫中字段添加字段; 2. 創建CMapXBindLayer對象,指定其坐標值字段的序號; 3. 向map.DataSets中添加數據集,從而生成新的圖層; 4. 指定新圖層中要素的顯示風格,本文采用顯示位圖的方式,為此需要將要顯示的位圖放入MapX安裝目錄的CUSTSYMB文件夾下。
代碼如下:
private void CreatNewLayerfromDB(string layerName, ADODB.Recordset rsNoPass)
{ this.DeleteLayerByName(layerName); //將原有層刪除
CMapXFields flds=new FIEldsClass();
// Describe the structure of the Unbound dataset flds.Add("stationid", "theid", AggregationFunctionConstants.miAggregationIndividual, FieldTypeConstants.miTypeString); flds.Add("address", "address", AggregationFunctionConstants.miAggregationIndividual, FieldTypeConstants.miTypeString); flds.Add("longitude", "longitude", AggregationFunctionConstants.miAggregationSum, FieldTypeConstants.miTypeNumeric); //經度 flds.Add("latitude", "latitude", AggregationFunctionConstants.miAggregationSum, FIEldTypeConstants.miTypeNumeric); //緯度
CMapXBindLayer bindLayerObject=new BindLayerClass(); bindLayerObject.LayerName=layerName; bindLayerObject.RefColumn1=3; bindLayerObject.RefColumn2=4; bindLayerObject.LayerType=BindLayerTypeConstants.miBindLayerTypeXY;
CMapXDataset dataSet=map.DataSets.Add(DatasetTypeConstants.miDataSetADO, rsNoPass, layerName, "stationid", "address", bindLayerObject, flds, false );
CMapXLayer layer=map.Layers._Item(layerName); layer.OverrideStyle= true; string picName="icon.BMP"; if(layer.Style.SupportsBitmapSymbols == true) { layer.Style.SymbolType = SymbolTypeConstants.miSymbolTypeBitmap; layer.Style.SymbolBitmapSize = 60; layer.Style.SymbolBitmapTransparent = true; layer.Style.SymbolBitmapName = picName;
}
}
private void DeleteLayerByName(string layerName)
{ int count=map.Layers.Count;
for(int i=1; i {
if(map.Layers._Item(i).Name==layerName)
map.Layers.Remove(i);
}
}
說明: MapX控件中的序號是從1開始的,這一點可從上面的代碼中Layers集合與FIElds集合的序號使用上可以看出。