閑話不多,代碼如下:
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "*.mxd|*.mxd";
ofd.ShowDialog();
string fp = ofd.FileName;
axMapControl1.LoadMxFile(fp,0,Type.Missing);
}
bool bu = false;
private void button2_Click(object sender, EventArgs e)
{
bu = true;
}
private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
try
{
if (bu)
{
//先建立一張表,按照自己的想法;需要兩張表???
//或者建立List也行,需要合適的方法賦值給TreeList
DataTable pDataTable = new DataTable();
pDataTable.Columns.Add("ID");
pDataTable.Columns.Add("Name");
pDataTable.Columns.Add("ParentID");
DataRow pDataRow = null;
for (int i = 0; i < axMapControl1.Map.LayerCount;i++ )
{
pDataRow=pDataTable.NewRow();
string lyrName = axMapControl1.Map.get_Layer(i).Name;
pDataRow["ID"] = lyrName;
pDataRow["Name"] = lyrName;
pDataRow["ParentID"] = -1;
pDataTable.Rows.Add(pDataRow);
//開始點選查詢
IMap pMap;
pMap = axMapControl1.Map as IMap;
//擷取點圖層
IFeatureLayer pFeatureLayer;
pFeatureLayer = pMap.get_Layer(i) as IFeatureLayer;
IFeatureClass pFeatureClass;
pFeatureClass = pFeatureLayer.FeatureClass;
//擷取滑鼠點擊點
IPoint pPoint;
pPoint = new PointClass();
pPoint.PutCoords(e.mapX, e.mapY);
IGeometry pGeometry;
//定義緩衝區
double db = 2;
ITopologicalOperator pTop;
pTop = pPoint as ITopologicalOperator;
pGeometry = pTop.Buffer(db);
//選取
pMap.SelectByShape(pGeometry, null, false);
pMap.ClearSelection();
//空間過濾運算
ISpatialFilter pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.Geometry = pGeometry;
//設定為不同的要素類型的圖層
switch (pFeatureClass.ShapeType)
{
case esriGeometryType.esriGeometryPoint:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
break;
case esriGeometryType.esriGeometryPolyline:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
break;
case esriGeometryType.esriGeometryPolygon:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
}
pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
//指標
IFeatureCursor pFeatureCursor;
pFeatureCursor = pFeatureClass.Search(pSpatialFilter, false);
IFeature pFeature;
pFeature = pFeatureCursor.NextFeature();
//開始遍曆
while (pFeature != null)
{
//擷取要素的欄位名和欄位值
int n = pFeature.Fields.FieldCount; //這句話很重要,得到欄位數目;
string sName;
// object oValue;
string sValue;
//這句話的對象需要隨著地圖的改變而改變。可以是ID,FID 等帶有唯一標識身份的 東西。
int index=pFeature.Fields.FindField("ObjectID");
if (index == -1)
return;
IField pField = pFeature.Fields.get_Field(index);
sName = pField.Name;
sValue = pFeature.get_Value(index).ToString();
pDataRow = pDataTable.NewRow();
//之所以這樣賦值是為了保證ID的唯一性;
pDataRow["ID"] = lyrName + sValue;
//賦值給ObjectID等的值,這樣是為了好合并表;
pDataRow["Name"] = sValue;
pDataRow["ParentID"] = lyrName;
pDataTable.Rows.Add(pDataRow);
//}
//}
pFeature = pFeatureCursor.NextFeature();
}
}
// dataGridView1.DataSource = pDataTable;
treeList1.DataSource = pDataTable;
treeList1.ParentFieldName="ParentID";
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}