WH23  

对加载到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;
        }
        
    }
View Code

 

 

 

posted on 2013-06-09 11:03  ones10  阅读(990)  评论(0)    收藏  举报