一、空间查询实现思路
通过主界面将MapControl传到空间查询的界面,用户可以通过“选择图层”的下拉框选择不同的图层,再选择“空间关系”,目前有的为相交、包含、穿越、接触,用户可以再点击不同的图形直接在地图上进行画框查询,若查询出结果,在地图上高亮显示,系统会自动弹出属性表框,用户可以直接查看所选要素的相关信息。
二、空间查询流程图
三、关键代码
1、选择图层
代码与属性查询相同
2、选择空间关系方法:
public esriSpatialRelEnum getSpatialRel()
{
if (cobSRel.SelectedIndex == 0)
{
return (esriSpatialRelEnum)1;
}
else if (cobSRel.SelectedIndex == 1)
{
return (esriSpatialRelEnum)8;
}
else if (cobSRel.SelectedIndex ==2)
{
return (esriSpatialRelEnum)6;
}
else if (cobSRel.SelectedIndex == 3)
{
return (esriSpatialRelEnum)4;
}
else
{
return (esriSpatialRelEnum)1;
}
}
3、点击图形时,设置一个值,在主界面获得值:
private void button1_Click(object sender, EventArgs e)
{
Flag = 2;
}
private void button5_Click(object sender, EventArgs e)
{
Flag = 3;
}
private void button2_Click(object sender, EventArgs e)
{
Flag = 4;
}
private void button3_Click(object sender, EventArgs e)
{
Flag = 5;
}
private void button4_Click(object sender, EventArgs e)
{
Flag = 6;
}
public int setFlag()
{
return Flag;
}
4、主界面axMapControl1_OnMouseDown事件,当空间查询框弹出来时,进行判断,获得空间查询选择的图层,以及设置的Flag值:
代码如下:
if (psQ != 1)
{
if (!pspatialQueryForm.IsDisposed)
{
ISpatialFilter pSpatialFilter = new SpatialFilter();
IGeometry geometry = null;
flag = pspatialQueryForm.setFlag();//获得窗体传来的flag值
IFeatureLayer pFeatureLayer = pspatialQueryForm.SelectLayer();//获得需要查询的图层
IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
//根据flag值获得geometry
switch (flag)
{
case 2:
ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass();
point.PutCoords(e.mapX, e.mapY);
geometry = point as IGeometry;
break;
case 3:
geometry = axMapControl1.TrackLine();
break;
case 4:
geometry = axMapControl1.TrackRectangle();
break;
case 5:
geometry = axMapControl1.TrackCircle();
break;
case 6:
geometry = axMapControl1.TrackPolygon();
break;
default:
ESRI.ArcGIS.Geometry.IPoint point1 = new ESRI.ArcGIS.Geometry.PointClass();
point1.PutCoords(e.mapX, e.mapY);
geometry = point1 as IGeometry;
break;
}
//将geometry赋给pSpatialFilter
pSpatialFilter.Geometry = geometry;
//设置空间关系(从空间查询窗体获得)
pSpatialFilter.SpatialRel = pspatialQueryForm.getSpatialRel();
List<IFeature> pFeatures = new List<IFeature>();//框选的数据集
List<IFeature> pFeatureFr = new List<IFeature>();//框选的数据集
try
{
IFeatureCursor featureCursor = pFeatureLayer.Search(pSpatialFilter, false);
IFeature pFeature;
pFeatureSelection.CombinationMethod = esriSelectionResultEnum.esriSelectionResultNew;
while ((pFeature = featureCursor.NextFeature()) != null)
{
pFeatureSelection.Add(pFeature);
axMapControl1.Refresh();
pFeatures.Add(pFeature);//将高亮显示的要素在属性表中展示出来
}
pFeatureFr = pFeatures;
//将高亮显示的要素在属性表中展示出来
if (pFeatureFr.Count!=0)
{
FrmAttribute frm = new FrmAttribute(pFeatures);
frm.Show();
}
//pFeatureFr = null;
}
catch (Exception pException)
{
MessageBox.Show(pException.Message);
}
}
四、注意事项
空间查询和属性查询的原理差不多,核心代码实现并不是很困难,但是在两个窗体之间互相传值,在主界面中点击地图进行操作时,会出现很多问题,在关掉空间查询窗体时,在点击主界面的地图会报错,无法正确根据空间关系查询出结果等,最后在多次调试下,添加全局变量和利用pspatialQueryForm.IsDisposed解决了这个问题。