对加载到ArcEngine里的Arcgis Server地图服务的漫游、缩放等地图浏览操作,与对本地地图一样不过,然而查询时,由于数据不再本地,所以不能用查询本地地图的那些代码,需要另外编码,但是查询的步骤还是大体类似,都需要设置查询条件,只是本地数据用IFeatureLayer.Search方法而地图服务数据则用IMapServer.QueryFeatureData,具体步骤如下。
1、获取IMapServer对象
在“ArcEngine获取ArcGIS Server上的地图服务”一文中已经详细介绍了怎样获取IMapServer对象,这里就不赘述了,只直接定义一对象表示已经实例化
IMapServer mapserver;
2、设置查询条件
设置查询条件方式与查询本地数据一样,都是通过社SpatialFilter对象属性实现
SpatialFilter filter = new SpatialFilter();
filter.Geometry = geo;//图形查询方式,设置查询图形
filter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;//空间查询关系
filter.WhereClause=strSql;//设置属性条件查询SQL语句
3、执行查询
IRecordSet rcdset=mapserver.QueryFeatureData(mapname, lyrId, filter);//查询结果保存在IRecordSet对象中,mapname表示地图服务地图的名称,lyrId表示要查询的地图服务子图层的I的号,通常为图层序号
完整代码如下:
/// <summary> /// 服务地图查询 /// </summary> public class Query { /// <summary> /// 地图服务 /// </summary> public IMapServer mapserver; public List<Feature> flist; public Query(IMapServer mapserver) { this.mapserver = mapserver; this.flist = new List<Feature>(); } /// <summary> /// 通过SQL语句查询 /// </summary> /// <param name="mapname"></param>地图名称 /// <param name="lyrId"></param>图层ID,不是图层的index但经常等于它 /// <param name="strSQL"></param>SQl语句 /// <returns></returns>获取的DataTable public DataTable QueryBySQL(String mapname, int lyrId, String strSQL) { IQueryFilter query = new QueryFilter(); query.WhereClause = strSQL;//设置SQL语句 IRecordSet set = new RecordSet(); DataTable dt = null; try { set = mapserver.QueryFeatureData(mapname, lyrId, query); dt = this.GetDtFromRecordSet(set); } catch { dt = null;//当查询结果为空,即查询运算式出错时 } return dt; } /// <summary> /// 查询获取Feature要素 /// </summary> /// <param name="mapname"></param> /// <param name="lyrId"></param> /// <param name="strSQL"></param> /// <returns></returns> public List<IFeature> QueryFeatureBySQL(String mapname, int lyrId, String strSQL) { IQueryFilter query = new QueryFilter(); query.WhereClause = strSQL;//设置SQL语句 IRecordSet set = new RecordSet(); List<IFeature> listFeature = new List<IFeature>(); try { set = mapserver.QueryFeatureData(mapname, lyrId, query); IFeatureCursor cursor=set.get_Cursor(false) as IFeatureCursor; IFeature feature = null; while ((feature=cursor.NextFeature())!=null) { listFeature.Add(feature); } } catch { listFeature= null;//当查询结果为空,即查询运算式出错时 } return listFeature; } /// <summary> /// 空间查询方式 /// </summary> /// <param name="mapname"></param>地图名称 /// <param name="lyrId"></param>图层ID(不通于layerindex但通常是它) /// <param name="geo"></param>用于查询的地理要素 /// <param name="relation"></param>查询的空间条件 /// <returns></returns>查询得到的DataTable public DataTable QueryByGeo(String mapname,int lyrId,IGeometry geo,esriSpatialRelEnum relation) { DataTable dt = null; SpatialFilter filter = new SpatialFilter(); filter.Geometry = geo; filter.SpatialRel = relation;//空间查询关系 try { IRecordSet rcdset=mapserver.QueryFeatureData(mapname, lyrId, filter); dt = this.GetDtFromRecordSet(rcdset); } catch { dt = null; } return dt; } /// <summary> /// 空间查询获取地理要素 /// </summary> /// <param name="mapname"></param>地图名称 /// <param name="lyrId"></param>图层ID(不通于layerindex但通常是它) /// <param name="geo"></param>用于查询的地理要素 /// <param name="relation"></param>查询的空间条件 /// <returns></returns>查询得到的地理要素集 public List<IFeature> QueryFeatureByGeo(String mapname, int lyrId, IGeometry geo, esriSpatialRelEnum relation) { List<IFeature> listFeature = new List<IFeature>(); SpatialFilter filter = new SpatialFilter(); filter.Geometry = geo; filter.SpatialRel = relation;//空间查询关系 try { IRecordSet rcdset = mapserver.QueryFeatureData(mapname, lyrId, filter); IFeatureCursor cursor = rcdset.get_Cursor(false) as IFeatureCursor; IFeature feature = null; while ((feature = cursor.NextFeature()) != null) { listFeature.Add(feature); } } catch { listFeature= null; } return listFeature; } /// <summary> /// 将IRecordSet数据转化为DataTable表 /// </summary> /// <param name="rcdset"></param> /// <returns></returns>转化后的DataTable表 public DataTable GetDtFromRecordSet(IRecordSet rcdset) { if (rcdset == null) { return null; } ITable tb = rcdset.Table; DataTable dt = new DataTable(); for (int i = 0; i < tb.Fields.FieldCount; i++) { //将table的每个字段新建DataTable每个列 DataColumn dc = new DataColumn(tb.Fields.get_Field(i).AliasName);//以字段别名创建列 dt.Columns.Add(dc);//加入新建列 } IFeatureCursor cursor = rcdset.get_Cursor(false) as IFeatureCursor; this.flist.Clear();//清空表 IFeature feature = null; while ((feature = cursor.NextFeature()) != null) { this.flist.Add(feature as Feature); DataRow drow = dt.NewRow();//获取行新实例 for (int i = 0; i < feature.Fields.FieldCount; i++) { if (feature.get_Value(i) is IGeometry) {//当字段值为地理要素时,字段[Shape]类型为IGeometry,也可以通过 Field.type字段判断是否是Geometry类型 drow[i] = this.GetGeometryType(feature.get_Value(i) as IGeometry); } else { drow[i] = feature.get_Value(i).ToString();//依次设置行的列值 } } dt.Rows.Add(drow);//加入行 } return dt; } /// <summary> /// 将地理要素类型转化为文字 /// </summary> /// <param name="geotype"></param>地理要素 /// <returns></returns>文字表达形式 private String GetGeometryType(IGeometry geo) { esriGeometryType geotype = geo.GeometryType; String type = ""; switch (geotype) { case esriGeometryType.esriGeometryPoint: type = "点"; break; case esriGeometryType.esriGeometryPolyline: type = "线"; break; case esriGeometryType.esriGeometryPolygon: type = "面"; break; default: type = "未知"; break; } return type; } }

浙公网安备 33010602011771号