解析http://219.142.81.86/igserver/ogc/kvp/TAS10R52000J49/WMTSServer服务的元数据

// 测试httpWebRequest读取 wmts元数据
string address = "http://219.142.81.86/igserver/ogc/kvp/TAS10R52000J49/WMTSServer";
var request = (HttpWebRequest)WebRequest.Create(address);
var response = (HttpWebResponse)request.GetResponse();
var stream = response.GetResponseStream();

if (stream == null) return;

var xmlReader = new XmlTextReader(stream);
var xmlDocument = new XmlDocument();
xmlDocument.Load(xmlReader);

string namespace_uri = xmlDocument.DocumentElement.NamespaceURI;
var nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);
nsmgr.AddNamespace("wmts", namespace_uri);

XmlNode node = xmlDocument.SelectSingleNode("//wmts:Layer", nsmgr);
if (node == null)    return;        
string LowerCorner, UpperCorner;
// 得到layer节点的所有子节点
XmlNodeList xnl = node.ChildNodes;

double west = 0;
double east = 0;
double south = 0;
double north = 0;
foreach (XmlNode xn1 in xnl)
 {
  if (xn1.Name == "ows:BoundingBox" || xn1.Name == "ows:WGS84BoundingBox")
  {
            XmlElement xe = (XmlElement)xn1;
            //得到crs属性
            string crs = xe.GetAttribute("crs").ToString();

// 得到BoundBox节点的所有子节点                   
            XmlNodeList xn10 = xn1.ChildNodes;
            LowerCorner = xn10.Item(0).InnerText;
            UpperCorner = xn10.Item(1).InnerText;
            string[] cc = LowerCorner.Split(' ');
            west = Convert.ToDouble(cc[0]);
            south = Convert.ToDouble(cc[1]);
            string[] uu = UpperCorner.Split(' ');
            east = Convert.ToDouble(uu[0]);
            north = Convert.ToDouble(uu[1]);
  }                
       // 将节点转换为元素,便于得到节点的属性值
       //XmlElement xe = (XmlElement)xn1;
       // 得到Type和ISBN两个属性的属性值
       //string type = xe.GetAttribute("ows:Type").ToString();   //<book Type="必修课" ISBN="7-111-19149-2">
}

XmlNodeList nodes = xmlDocument.SelectNodes("//wmts:TileMatrixSet", nsmgr);
            if (nodes.Count <= 0) return;

Dictionary<int, _tileMatrix> tileMatrixSet = new Dictionary<int,_tileMatrix>();  
            int minLevel = 9999;
            int maxLevel = -9999;
            
            foreach (XmlNode xn1 in nodes)
            {
                if (xn1.ParentNode == null || xn1.ParentNode.Name != "Contents")
                    continue;
                
                XmlNodeList xn11 = xn1.ChildNodes;
                foreach (XmlNode xn110 in xn11)
                {
                    if (xn110.Name == "TileMatrix")
                    {
                        XmlNodeList xn10 = xn110.ChildNodes;
                        string strlevel = xn10.Item(0).InnerText;
                        string[] temp = strlevel.Split(':');
                        int cn = temp.Count();
                        int level = 0;
                        if (cn == 1)
                            level = Convert.ToInt32(temp[0]);
                        else
                            level = Convert.ToInt32(temp[cn-1]);
                        
                        double ScaleDenominator = Convert.ToDouble(xn10.Item(1).InnerText);
                        string[] TopLeftCorner = xn10.Item(2).InnerText.Split(' ');
                        double top = Convert.ToDouble(TopLeftCorner[0]);
                        double left = Convert.ToDouble(TopLeftCorner[1]);
                        int TileWidth = Convert.ToInt32(xn10.Item(3).InnerText);
                        int TileHeight = Convert.ToInt32(xn10.Item(4).InnerText);
                        int cols = Convert.ToInt32(xn10.Item(5).InnerText);
                        int rows = Convert.ToInt32(xn10.Item(6).InnerText);

_tileMatrix ts = new _tileMatrix();
                        ts.level = level;
                        ts.cornerTop = top;
                        ts.cornerLeft = level;
                        ts.tileWidth = TileWidth;
                        ts.tileHeight = TileHeight;
                        ts.tileCols = cols;
                        ts.tileRows = rows;
                        tileMatrixSet.Add(level, ts);

minLevel = Math.Min(minLevel, level);
                        maxLevel = Math.Max(maxLevel, level);
                    }
                }                 
            }
          
            xmlReader.Close();

使用C# + httpWebRequest 解析WMTS服务元数据的更多相关文章

  1. WMTS服务解析

    WMTS服务解析 1.基本思路 拼接地址,请求xml文件 ↓ 处理获取的xml文件,返回参数 ↓ 获取xml解析得到的参数,组织结构 2.对应函数 requestWMTS (olUrl) ↓ hand ...

  2. 使用C++/libCurl/Jsoncpp读取arcgis wmts 服务(restful模式)

    前言: 最近工作需要将arcgis的wmts服务接入我们的3DGis系统平台,要求用户只输入一个rest模式的wmts服务地址,系统即可自动获取并解析其元数据信息,生成wmts图层,并渲染显示.经过多 ...

  3. WCF分布式开发步步为赢(3)WCF服务元数据交换、配置及编程开发

    今天我们继续WCF分布式开发步步为赢(3)WCF服务元数据交换.配置及编程开发的学习.经过前面两节的学习,我们了解WCF分布式开发的相关的基本的概念和自定义宿主托管服务的完整的开发和配置过程.今天我们 ...

  4. WCF之服务元数据

    服务元数据是用来获得服务的EndPoint的信息,也就是它的ABC. 服务有两种方案可以发布自己的元数据. 一种是基于HTTP-GET协议提供元数据: 一种是元数据交换方式,它往往使用一个专门的终结点 ...

  5. ajax调用handler,使用HttpWebRequest访问WCF服务

    引言 随着手机及移动设备的普及,移动端的应用也进入了热潮.以前PC端的门户网站,大多也均推出了适配移动设备的网站或者APP,再差的也注册了个公众号.在移动应用开发中,目前据我所了解到的解决方案有:1. ...

  6. Netty 4源码解析:服务端启动

    Netty 4源码解析:服务端启动 1.基础知识 1.1 Netty 4示例 因为Netty 5还处于测试版,所以选择了目前比较稳定的Netty 4作为学习对象.而且5.0的变化也不像4.0这么大,好 ...

  7. 超图不支持JPEG格式的WMTS服务

    就目前面而言,超图不支持JPEG格式的WMTS服务,只支持PNG格式的. <本篇完>

  8. 如何在Skyline中加载ArcGISServer发布的WMS和WMTS服务

    如何在Skyline中加载ArcGISServer发布的WMS和WMTS服务? 我这里的测试环境是ArcGISServer10.1和TerraExplorer Pro7.0,主要过程截图如下,

  9. (二十)ArcGIS JS 加载WMTS服务(超图示例)

    前言 在前一篇中说到我们可以通过加载WMS服务解决用ArcGIS API加载超图发布的服务,但是WMS服务在加载效率上是低于切片服务的,加上超图的IServer,无力吐槽,所以,在加载速度的要求下,切 ...

随机推荐

  1. 使用matlab表示“段数不确定”的分段函数

    示例函数: 分段函数f(x)的段数为数组a的长度减1,在表达f(x)时,不能直接使用a的长度5-1=4. 方法1: 先计算每个间隔点的函数值f(a2),f(a3),f(a4),再循环表示f(x). f ...

  2. 简单的oracle sql语句练习

    简单的oracle sql语句练习 求每个部门的平均薪水 select deptno,avg(sal) from emp group by deptno 每个部门同一个职位的最大工资 select d ...

  3. 【转】Serializers 序列化组件

    https://www.cnblogs.com/MayDayTime/p/9890582.html 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON ...

  4. 洛谷P1345 [USACO5.4]奶牛的电信 [最小割]

    题目传送门 奶牛的电信 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,..., ...

  5. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 xor (根号分治)

    xor There is a tree with nn nodes. For each node, there is an integer value a_ia​i​​, (1 \le a_i \le ...

  6. 深入理解javascript函数系列第一篇

    前面的话 函数对任何一门语言来说都是核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即对象,程序可以随意操控它们.函数可以嵌套在其他函数中 ...

  7. stl upper_bound()

    http://blog.csdn.net/niushuai666/article/details/6734650   upper_bound( a , b , k )返回有序升序序列[a,b)中能放下 ...

  8. 数组中找出最小的K个数

    题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...

  9. 为什么MyISAM会比Innodb的查询速度快

    INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多: 1)数据块,INNODB要缓存,MYISAM只缓存索引块,  这中间还有换进换出的减少: 2)innodb寻址要映射到块,再 ...

  10. 深入浅出JDBC-操作时间与大对象(Clob/Blob)

    一.时间(Date.Time.Timestamp) java.sql.Date/java.sql.Time/java.sql.Timestamp extends java.util.Date publ ...