AE 如何获取server上地图图层的要素信息

新人,有没有老哥来教一下的。最近已知搞不出来,,我想获取到server上的地图图层的要素信息,现在的情况就是通过IMapServerRESTLayer连接server或者通过IMapServerLayer连接都是可以获取到图层的,图层能显示在mapcontrol里面但是不能获取到图层的要素信息。我在想是我获取的方式不对还是我哪一步有问题才获取不到的。。上传的图时server上地图服务的图层功能
 
 
    private IMapServer mapserver;
        /// <summary>
        /// 地图服务
        /// </summary>
        public IMapServer MpServer
        {
            get
            {
                return this.mapserver;
            }

        }

        #region<<获取ArcGisServer地图服务标识,连接服务器
        /// <summary>
        /// 获取ArcGisServer地图服务标识,连接服务器
        /// </summary>
        /// <param name="pHostOrUrl"></param>服务器主机URL
        /// <param name="pServiceName"></param>服务名称
        /// <param name="pIsLAN"></param>主机是否是在局域网或者是互联网
        /// <returns></returns>
        private IAGSServerObjectName GetMapServer(string pHostOrUrl, string pServiceName, bool pIsLAN)
        {

            //设置连接属性
            IPropertySet pPropertySet = new PropertySet();
            if (pIsLAN)
                pPropertySet.SetProperty("machine", pHostOrUrl);
            else
                pPropertySet.SetProperty("url", pHostOrUrl);

            //打开连接

            IAGSServerConnectionFactory pFactory = new AGSServerConnectionFactory();
            //创建服务器连接工作空间

            IAGSServerConnection pConnection = pFactory.Open(pPropertySet, 0);
            //打开获取服务器

            IAGSEnumServerObjectName pServerObjectNames = pConnection.ServerObjectNames;
            //获取服务器上所有服务的标识属性,即服务标识集合
            pServerObjectNames.Reset();
            //使指针指向服务开头
            IAGSServerObjectName ServerObjectName = pServerObjectNames.Next();
            //获取服务标识
            while (ServerObjectName != null)
            {
                if ((ServerObjectName.Name.ToLower() == pServiceName.ToLower()) &&
                    (ServerObjectName.Type == "MapServer"))
                {//判断获取所需服务
                    break;
                }
                ServerObjectName = pServerObjectNames.Next();
            }
            //返回对象
            return ServerObjectName;//返回服务标识
        }

        #endregion


        public void GetServerLyr()
        {
            string serverUrl = "http://192.168.0.161:6080/arcg ... 3B%3B
            string mapservername = "ZhangPu/ZPBackDev";
            bool isLan = false;
            ILayer lyr = null;
            //获得服务对象名称
            IAGSServerObjectName pServerObjectName = GetMapServer(serverUrl, mapservername, isLan);//获取地图
            IName pName = (IName)pServerObjectName;
            //访问地图服务
            IAGSServerObject pServerObject = (IAGSServerObject)pName.Open();
            IMapServer pMapServer = (IMapServer)pServerObject;
            mapserver = pMapServer;//获取地图服务对象
            IMapServerLayer pMapServerLayer = new MapServerLayer() as IMapServerLayer;
            //连接地图服务

            pMapServerLayer.ServerConnect(pServerObjectName, pMapServer.DefaultMapName);
            //添加数据图层
            lyr = pMapServerLayer as ILayer;
 List<IFeatureLayer> layers = new List<IFeatureLayer>();
   func(lyr, layers);
            void func(ILayer layer1, List<IFeatureLayer> lsFeatureLayer)
            {
           
                //MessageBox.Show(layer.GetType().ToString());
                if (layer1 is IFeatureLayer)
                    lsFeatureLayer.Add(layer1 as IFeatureLayer);
                else if(layer1 is ICompositeLayer)
                {
                    ICompositeLayer cl = layer1 as ICompositeLayer;
                    for(int i=0;i<cl.Count;i++)
                    {
                        var l = cl.Layer[i];
                        func(l, lsFeatureLayer);
                    }
                }
            }
}

   IMapServerRESTLayer mapServerRESTLayer = new MapServerRESTLayerClass();

            mapServerRESTLayer.Connect("http://192.168.0.161:6080/arcg ... 6quot;);

这是两种获取方式获取的server上的地图服务,但是都获取不到地图要素信息
 
TIM图片20190716105207.png
已邀请:

feisishui

赞同来自:

获取要素,要拿到对应的layer的datasource,然后设置条件,自己去查询。就是相当于自己做soe扩展,自己做一些复杂的分析。

张晓旭

赞同来自:

//获取地图服务并能够按照属性进行查询
        public DataTable ServerGetTable()
        {
            IAGSServerObjectName3 pSOName = null;
            IAGSServerObjectName3 psoname = null;
            IAGSServerConnection con = null;// new AGSServerConnection();
            IAGSServerConnectionFactory2 confactory = new AGSServerConnectionFactory() as IAGSServerConnectionFactory2;
            IPropertySet propertyset = new PropertySet();

            propertyset.SetProperty("url", "http://*******/arcgis/rest/services");

            con = confactory.Open(propertyset, 0);
            IAGSEnumServerObjectName enumSOName = con.ServerObjectNames;

            pSOName = (IAGSServerObjectName3)enumSOName.Next();
            while (pSOName != null)
            {
                if ((pSOName.Type == "MapServer") && (pSOName.Name == "**"))
                {
                    psoname = pSOName;
                    break;
                }
                pSOName = (IAGSServerObjectName3)enumSOName.Next();
            }
            IName pName = psoname as IName;
            IMapServer mapserver = pName.Open() as IMapServer;
            string name = mapserver.DefaultMapName;

            DataTable pDatatable = new DataTable();
            IQueryFilter pQueryFilter = new QueryFilterClass();
            pQueryFilter.WhereClause = "WATREGID like '%" + textBox1.Text.ToString().Trim() + "%'";
            IRecordSet recordSet = mapserver.QueryFeatureData(mapserver.DefaultMapName, 10, pQueryFilter);
            ITable table = recordSet.Table;
            if (table == null) { return null; }
            return ConvertITable(table);

        }
 
        //将ITable转换为Table
        public DataTable ConvertITable(ITable table)
        {

            DataTable ExpertInfo;
            ExpertInfo = new DataTable("ExpertInfo");
            try
            {
                IQueryFilter que = new QueryFilterClass();
                ICursor pCursor = table.Search(que, true);
                IRow pRow = pCursor.NextRow();
                if (pRow != null)
                {
                    for (int i = 0; i < pRow.Fields.FieldCount; i++)
                    {
                        ExpertInfo.Columns.Add(pRow.Fields.get_Field(i).Name);
                    }
                    while (pRow != null)
                    {
                        DataRow pDataRow = ExpertInfo.NewRow();
                        for (int j = 0; j < pCursor.Fields.FieldCount; j++)
                            pDataRow[j] = pRow.get_Value(j);
                        ExpertInfo.Rows.Add(pDataRow);
                        pRow = pCursor.NextRow();
                    }
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            return ExpertInfo;
        }
 

要回复问题请先登录注册