关闭

自定义图层加载Arcgis Server松散切片

标签: C#SilverlightArcGISarcgis server地图
2729人阅读 评论(0) 收藏 举报
分类:

           ArcGIS Server提供了丰富的GIS功能,但是对于一个相对简单的项目来说,可能只是使用到了Arcgis Server提供的

地图服务MapServer,这种情况下使用Arcgis Server感觉有些资源浪费,而且Arcgis Server的价格不便宜。这种情况下,

我们可以考虑通过自定义图层的方式来加载Arcgis Server的切片。下面就介绍基于Silverlight Api如何去加载松散切片:


           在ArcgisCache缓存目录下可以找到地图瓦片。如下图,有两个文件conf.xml和conf.cdi,这两个文件里存储了地图

瓦片的基本参数信息。conf.cdi中存储了地图的初始外包范围,conf.xml中存储了坐标系、瓦片和瓦片每个级别的基本参

数。不难发现ArcGISTiledMapServiceLayer图层也就是在内部通过对这两个文件的解析,然后实现加载瓦片的,所以自

定义图层的关键就这解析这两个文件。

 

         *第一步:继承TiledMapServiceLayer,重写GetTileUrl方法。打开切片目录,可以发现瓦片的等级是以L开头的,比

较特殊的是行和列,分别是以R和C开头的8位16进制值表示的(不够8位补零),所以在拼路径的时候需要对十进制进行转

换。

	public override string GetTileUrl(int level, int row, int col)
        {
            return string.Format("{0}{1}/L0{2}/R{3}/C{4}.png", this.TiledUrl, _TILEDS, level, AppendChar(row), AppendChar(col));
        } 
	//16进制转换
   	private string AppendChar(int num)
	{
            string str16 = Convert.ToString(num, 16);
            StringBuilder str = new StringBuilder();
            for (int i = str16.Length; i < 8; i++)
                str.Append("0");
            str.Append(str16);
            return str.ToString();
        }
             

            *第二步:读取conf.cdi和conf.xml文件内的参数。读取的内容主要是三部分,地图外包(Extent)、坐标系(SpatialReference)、

瓦片(TileInfo)和瓦片每级(Lod)的信息。在使用WebClient读取conf.cdi文件的时候,由于不识别这个文件的后缀cdi,可以将其

改成常见的文本格式,例如:txt、ini等。

 //初始化图层外包
        private void InitFullExtent()
        {
            WebClient client = new WebClient();
            client.OpenReadCompleted += (s, e) =>
            {
                try
                {
                    XDocument doc = XDocument.Load(e.Result);
                    XElement env = doc.Element("EnvelopeN");
                    this.FullExtent = new Envelope
                    (
                        Convert.ToDouble(env.Element("XMin").Value),
                        Convert.ToDouble(env.Element("YMin").Value),
                        Convert.ToDouble(env.Element("XMax").Value),
                        Convert.ToDouble(env.Element("YMax").Value)
                    );
                    _CdiIsLoaded = true;
                }
                catch { }
                finally { NotifyLoad(); }
            };
            client.OpenReadAsync(new Uri(string.Format("{0}{1}", this.TiledUrl, _CON_CDI), UriKind.RelativeOrAbsolute));
        }
        //初始化瓦片信息
        private void InitTiledInfo()
        {
            WebClient client = new WebClient();
            client.OpenReadCompleted += (s, e) =>
            {
                try
                {
                    XDocument doc = XDocument.Load(e.Result);
                    XElement tileInfo = doc.Element("CacheInfo").Element("TileCacheInfo");
                    IEnumerable<XElement> lodsInfo = tileInfo.Element("LODInfos").Elements("LODInfo");
                    //初始化坐标系
                    this.SpatialReference = new SpatialReference(Convert.ToInt32(tileInfo.Element("SpatialReference").Element("WKID").Value));
                    //初始化瓦片信息
                    this.TileInfo = new TileInfo()
                    {
                        Height = Convert.ToInt32(tileInfo.Element("TileCols").Value),
                        Width = Convert.ToInt32(tileInfo.Element("TileRows").Value),
                        Origin = new MapPoint() 
                        { 
                            X = Convert.ToDouble(tileInfo.Element("TileOrigin").Element("X").Value),
                            Y = Convert.ToDouble(tileInfo.Element("TileOrigin").Element("Y").Value),
                            SpatialReference = new ESRI.ArcGIS.Client.Geometry.SpatialReference(this.SpatialReference.WKID) 
                        },
                        Lods = new Lod[lodsInfo.Count()]
                    };
                    //初始化瓦片级别信息
                    foreach (XElement lod in lodsInfo)
                    {
                        int index = Convert.ToInt32(lod.Element("LevelID").Value);
                        this.TileInfo.Lods[index] = new Lod()
                        {
                            Resolution = Convert.ToDouble(lod.Element("Resolution").Value),
                        };
                    }
                    _XmlIsLoaded = true;
                }
                catch { }
                finally { NotifyLoad(); }
            };
            client.OpenReadAsync(new Uri(string.Format("{0}{1}", this.TiledUrl, _CON_XML), UriKind.RelativeOrAbsolute));
        }

        注意:必须在conf.cdi和conf.xml文件内的配置信息读取完毕之后,才能Add

到Map中。

       此处,我是将瓦片拷贝到Silverlight的宿主网站的目录下,在Silverlight端使用WebClient读取。对于紧凑的切片,

在GetTileUrl中每一次请求时需要对bundlx和bundle格式的文件进行解析,那么切片就必须放在xap包内部,考虑到xap不

易过大,所以就没有使用这种方式实现。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

自己写一个读取Arcgis Server切片的后台服务

Arcgis Server的切片得要有Arcgis Server的支持才能使用,这样就显得比较麻烦,如果对于已经切好的切片怎么样通过自己写的程序来调用展示呢,本文讲解的内容就是这些。
  • GISShiXiSheng
  • GISShiXiSheng
  • 2016-10-22 10:32
  • 3926

自定义图层加载Arcgis Server松散切片

ArcGIS Server提供了丰富的GIS功能,但是对于一个相对简单的项目来说,可能只是使用到了Arcgis Server提供的 地图服务MapServer,这种情况下使用Arcgis Server...
  • li_fighting
  • li_fighting
  • 2013-10-12 11:30
  • 2729

OpenLayers学习--加载ArcGIS缓存

数据准备 使用ArcGIS发布地图,并切图得到hu
  • devCopper
  • devCopper
  • 2014-09-22 17:56
  • 7169

arcgis server for flex 编程时设置mxd文档中图层为自定义符号时flex程序不做相应改变的bug

最近做arcgis server 的flex开发用到了自定义符号,先用FontCreator制作自定义字符,生成字库并安装 arcmap中编辑符号如图所示,保存修改的MXD文档,结果生成的f...
  • qq379797807
  • qq379797807
  • 2012-11-13 19:24
  • 490

arcgis server 9.2代码阅读笔记二:在页面上动态加载图层

代码来源 ARCGIS 9.2例子  // Copyright 2006 ESRI // // All rights reserved under the copyright laws of the ...
  • jc_loveyou88
  • jc_loveyou88
  • 2011-06-23 18:15
  • 262

扩展TiledMapServiceLayer,加载ArcGIS Server发布的切片地图

通常情况下我们直接使用ArcGISTiledMapServiceLayer来加载ArcGIS Server 发布的地图服务。但若我们需自定义一些功能的话,需扩展TiledMapServiceLayer...
  • liujie634
  • liujie634
  • 2015-03-03 17:35
  • 805

Leaflet,OpenLayers3加载ArcGIS切片(png格式,Exploded松散型)

Leafletjs,Openlayers3加载ArcGIS地图的Exploded松散型切片。这里不借助GIS服务器,而是直接通过图片访问的方式加载ArcGIS切片。
  • dahongdahong
  • dahongdahong
  • 2016-10-08 11:06
  • 4207

ArcGIS API for Flex(六)加载自定义Web平铺图层

运行 <![C
  • vector5210
  • vector5210
  • 2014-10-28 09:32
  • 1142

利用ArcGIS Server动态图层改变地图服务的图层样式

ArcGIS Server10.1及以后的版本新增了动态服务的新特性,利用动态服务,用户可以通过api轻松的在本地对地图服务进行修改,如图层样式,向地图服务添加本地数据。最近刚好一个项目,需要用户可以...
  • u010176013
  • u010176013
  • 2015-10-04 23:38
  • 2045

arcgis server之道路网图层创建拓扑及网络数据集、几何网络数据集服务发布

路网服务发布首先需要建立好道路的网络集,为了保证道路网络分析的准确性,建立网络集之前,要对道路图层进行拓扑差错,确保道路的连通性。具体操作流程为:道路拓扑差错-建立几何网络集-路网服务发布。    ...
  • sinat_34719507
  • sinat_34719507
  • 2017-01-16 19:09
  • 1790
    个人资料
    • 访问:25666次
    • 积分:596
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:5篇
    • 译文:0篇
    • 评论:7条
    最新评论