扩展DynamicMapServiceLayer和TiledMapServiceLayer,实现访问wms数据和自定义切图数据

来源:互联网 发布:科罗拉多矿业学院 知乎 编辑:程序博客网 时间:2024/05/01 15:16

一下代码是silverlight写的,flex思路都一样,只是一些方式有些不一样,flex里都是重载属性,flex的例子里都有,自己下载下来看看

1:扩展DynamicMapServiceLayer

    如果后台数据通过geoserver发布wms数据,我们可以通过继承DynamicMapServiceLayer的接口实现访问geoserver发布的wms服务,可以参考http://bbs.esrichina-bj.cn/ESRI/thread-45582-1-1.html

代码如下

调用代码

          /// <summary>
        /// gepserver的wms数据加载
        /// </summary>
        private void LoadWmsMapServiceLayer()
        {
            int KWID = 4326;
            Envelope extent=  new ESRI.ArcGIS.Client.Geometry.Envelope(-124.731, 24.956, -66.97, 49.372);
            extent.SpatialReference = new SpatialReference(KWID);
            string Url = "http://localhost:8080/geoserver/wms";

      string [] layers=new string []{'topp:states'};
            WMSMapServiceLayer wms = new WMSMapServiceLayer(extent, KWID, Url,layers);
            this.mymap.Layers.Add(wms);

        }

 

 

自定义wms类

  public class WMSMapServiceLayer:DynamicMapServiceLayer  继承接口,实现GetUrl方法
    {
        List<string> _layers = new List<string>();
        public WMSMapServiceLayer(Envelope extent, int KWID, string url,string [] layers)
        {
            this.FullExtent = extent;    //地图范围
            this.SpatialReference = new ESRI.ArcGIS.Client.Geometry.SpatialReference(KWID);  //空间参考
            this.Url = url;     wms地址

            this.Version = "1.1.1";   //wms版本
            this.Layers = layers;    //请求的图层
           // _layers.Add("topp:states");

        }

        public string Url { get; set; }
        public string Version { get; set; }
        public string[] Layers
        {  
            get { return _layers.ToArray(); }
            set { _layers = new List<string>(value); OnLayerChanged(); }
        }
      public override void Initialize()
        {
            this.FullExtent = Extent;   设置范围  //不设置就无法实现

 this.SpatialReference = new SpatialReference(KWID);
            base.Initialize();
         
        }

//重写获取数据接口的方法

        public override void GetUrl(ESRI.ArcGIS.Client.Geometry.Envelope extent, int width, int height, DynamicMapServiceLayer.OnUrlComplete onComplete)
        {
            int extentWKID = extent.SpatialReference.WKID;
            StringBuilder mapURL = new StringBuilder();
            mapURL.Append( Url);
            mapURL.Append("?service=WMS");
            mapURL.Append("&request=GetMap");
            mapURL.AppendFormat("&width={0}", width);
            mapURL.AppendFormat("&height={0}", height);
            mapURL.AppendFormat("&format={0}", "image/png");
            mapURL.AppendFormat("&layers={0}", String.Join(",", Layers));
            mapURL.Append("&styles=");
            mapURL.AppendFormat("&bgcolor={0}", "0xFFFFFF");
            mapURL.AppendFormat("&transparent={0}", "true");
            mapURL.AppendFormat("&version={0}", Version);
            switch (Version)
            {
                case ("1.1.1"): mapURL.AppendFormat("&SRS=EPSG:{0}", extentWKID);
                    mapURL.AppendFormat(CultureInfo.InvariantCulture, "&bbox={0},{1},{2},{3}",
                        extent.XMin, extent.YMin, extent.XMax, extent.YMax); break;
            }
          //把哪些字符串拼接起来,跟openlayer一样的
            onComplete(mapURL.ToString(), width, height, new ESRI.ArcGIS.Client.Geometry.Envelope() 
            { 
                XMin = extent.XMin, YMin = extent.YMin, XMax = extent.XMax, YMax = extent.YMax        
            });      
        }
       
    }

 

 

 

2:扩展TiledMapServiceLayer  ,跟扩展DynamicMapServiceLayer差不多,关键就是设置一些访问必须的属性

 public class CustomTileCache:TiledMapServiceLayer
    {
        public CustomTileCache(Envelope extent, int KWID, string url, int width, int height, int level, double resolution)
        {
            this.Extent = extent;
            this.KWID = KWID;
            this.Url = url;
            this.Width = width;
            this.Height = height;
            this.Resolution = resolution;
            this.Level = level;
        }
        public Envelope Extent { get; set;}
        public int KWID { get; set; }
        public string Url { get; set; }
        public int Width { get; set; }
        public int Height { get; set; }
        public int Level { get; set; }
        public double Resolution { get; set; }
        public override void Initialize()
        {
            this.FullExtent = Extent;   //范围
            this.SpatialReference = new SpatialReference(this.KWID);  空间参考
            this.TileInfo = new TileInfo()      瓦片的具体信息
            {
                Height = Height,  每张瓦片的高度,一般为256或者512
                Width = Width,
                Origin = new MapPoint(this.FullExtent.XMin, this.FullExtent.YMax)   //下图有解释

                {
                    SpatialReference = new SpatialReference(KWID)
                },
                Lods = new Lod[Level]
                //Lod [] lods=new Lod[];
            };
            for (int i = 0; i < this.TileInfo.Lods.Length; i++)
            {

                TileInfo.Lods[i] = new Lod()    设置分辨率。 切图方式不一样,这里就不一样,我是比例尺是1/2方式去切的
                {
                    Resolution = Resolution
                };
                Resolution = Resolution / 2;

            }
            base.Initialize();
        }
        public override string GetTileUrl(int level, int row, int col)
        {

//自己数据的切片规则
            string url = Url + "zoom_" + (level + 1).ToString() + "/x" + col.ToString() + "/" + (level + 1).ToString() + "_" + col.ToString() + "_" + row.ToString() + ".png";
            return url;

        }
    }

 可以查一些瓦片切图的资料

 

原创粉丝点击