从googleEarh导出的kml文件

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>
  <!-- Begin Style Definitions -->
  <Style id="line1">
    <LineStyle>
      <color>FF808080</color>
      <width>1</width>
    </LineStyle>
  </Style>
  <Folder>
    <name>Line Features</name>
    <description>Line Features</description>
    <Placemark>
      <description>Unclassified Line Feature</description>
      <styleUrl>#line1</styleUrl>
      <LineString>
        <coordinates>
          115.9676728167,40.4840735806,0
          115.9537842111,40.4823857889,0
          115.9563131444,40.4703987611,0
          115.9551753833,40.4662973972,0
          115.9554458000,40.4636396361,0
          115.9397187972,40.4622803889,0
          115.9405904556,40.4562066889,0
          115.9408371611,40.4549313694,0
          115.9422346222,40.4538901583,0
          115.9448324639,40.4514630028,0
          115.9574561306,40.4524817889,0
          115.9619367944,40.4513946639,0
        </coordinates>
      </LineString>
    </Placemark>
  </Folder>
</Document>
</kml>

做工程中遇到需要解析kml文件并提取其中的经纬度坐标信息的需求,从网上查了一圈资料发现都不好用,干脆自己写,用正则表达式regex和split()方法实现了坐标信息提取功能。

主要遇到的问题是coordinates中的InnerText文本中有\t  \n \r \f 或多空格问题,需要将这些因素排除。

\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符

这些符号用正则表达式字符替换方式直接清除

Regex reg = new Regex("\f|\n|\r|\t");
string modified = reg.Replace(tt, "");

多空格问题用split的StringSplitOptions.RemoveEmptyEntries来清除

string[] ss = modified.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);//清除空格

这样就能得到纯粹的x,y,z字符串数组了.OK。

***********************************************************************************************************************************************

想了2种思路,目前第1种思路已经测试通过了,第2种思路懒得写了,哪位如果有兴趣实现了的话告诉我一声喔,,也算是饮水思源啦。

************************************************************************************************************************************************

代码如下:

private void KMLFileLoadButton_Click(object sender, EventArgs e)
{// 读取googleEarth的导出的kml/kmz路径文件
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "KML文件(*.kml)|*.kml|所有文件|*.*";
            if (dlg.ShowDialog() != DialogResult.OK)
                return;
            string destPath = dlg.FileName;//CopyToRelavitePath(dlg.FileName);
            if (destPath == null)
                return;

XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(destPath);
            XmlElement root = xmldoc.DocumentElement;
            /////规范命名空间
            XmlNode _document = root.GetElementsByTagName("Document")[0];
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldoc.NameTable);
            if (_document== null || _document.Attributes["xmlns"]==null)
            {
                nsmgr.AddNamespace("ns", root.Attributes["xmlns"].Value);
            }
            else
            {
                nsmgr.AddNamespace("ns", _document.Attributes["xmlns"].Value);
            }

NGlbLine geo = new NGlbLine(3, false);
            XmlNodeList xmlmark = root.GetElementsByTagName("Placemark");
            for (int m = 0; m < xmlmark.Count; m++)
            {
                XmlNodeList xmlmarkChilds = xmlmark[m].ChildNodes;
                for (int n = 0; n < xmlmarkChilds.Count; n++)
                {
                    XmlNode node = xmlmarkChilds[n];
                    if (node.Name == "LineString" || node.Name == "LineRing")
                    {
                        XmlNode coordsNode = node.FirstChild;
                        while (coordsNode != null && coordsNode.Name != "coordinates")
                        {
                            coordsNode = coordsNode.NextSibling;
                        }
                        if (coordsNode == null)
                            continue;
                        // 思路1 :用正则表达式去除字符串首位的制表符、换行符等符号,然后用' '来划分为string[]
                        string tt = coordsNode.InnerText;
                        Regex reg = new Regex("\f|\n|\r|\t");
                        string modified = reg.Replace(tt, "");
                        string[] ss = modified.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);//清除空格
                        for (int cc = 0; cc < ss.Length; cc++)
                        {
                            string[] aa = ss[cc].Split(',');
                            if (aa.Length == 3)                           
                                geo.AddPoint(Convert.ToDouble(aa[0]), Convert.ToDouble(aa[1]), Convert.ToDouble(aa[2]));                            
                            else if (aa.Length == 2)                            
                                geo.AddPoint(Convert.ToDouble(aa[0]), Convert.ToDouble(aa[1]), 0);                                                       
                        }
                        
                        // 思路2 :用regex正则表达式匹配 类似 115.9676728167,40.4840735806,0的样式字段

}
                }
            }

  .............................................
 }

解析KML文件并提取coordinates中的经纬度坐标信息的更多相关文章

  1. Java(Android)解析KML文件

    參考自:http://blog.csdn.net/yyywyr/article/details/38359049 http://blog.csdn.net/warrenwyf/article/deta ...

  2. python解析json文件信息到csv中

    json格式多种多样,本代码着重看函数部分 import json, csv, os import pandas as pd josns_root = 'jsons' csvs_root = 'csv ...

  3. c#两种方式调用google地球,调用COM API以及调用GEPLUGIN 与js交互,加载kml文件,dae文件。将二维高德地图覆盖到到三维谷歌地球表面。

    网络上资源很多不全面,自己在开发的时候走了不少弯路,在这里整理了最全面的google全套开发,COM交互,web端交互.封装好了各种模块功能. 直接就可以调用. 第一种方式:调用COMAPI实现调用g ...

  4. 命令行工具解析Crash文件,dSYM文件进行符号化

    备份   文/爱掏蜂窝的熊(简书作者)原文链接:http://www.jianshu.com/p/0b6f5148dab8著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序 在日常开发 ...

  5. Java是如何解析xml文件的(DOM)

    Java解析xml文件 在Java程序中读取xml文件的过程也称为"解析xml文件": 解析的目的: 获取 节点名和节点值 获取 属性名.属性值. 四中解析方式: DOM SAX ...

  6. python 解析 XML文件

    如下使用xml.etree.ElementTree模块来解析XML文件.ElementTree模块中提供了两个类用来完成这个目的: ElementTree表示整个XML文件(一个树形结构) Eleme ...

  7. 遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件

    XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...

  8. 基于 RTF specification v1.7 的 RTF 文件解析及 OLE 对象提取(使用 Python 开发)

    0x01 Office RTF 文件介绍 RTF 文件也称富文本格式(Rich Text Format, 一般简称为 RTF),意为多文本格式是由微软公司开发的跨平台文档格式.大多数的文字处理软件都能 ...

  9. Logstash:解析 JSON 文件并导入到 Elasticsearch 中

    转载自:https://elasticstack.blog.csdn.net/article/details/114383426 在今天的文章中,我们将详述如何使用 Logstash 来解析 JSON ...

随机推荐

  1. Hadoop整理三(Hadoop分布式计算框架MapReduce)

    一.概念 MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",是它们的主要思想.它极大 ...

  2. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

  3. JavaSE基础之矩阵运算

    JavaSE基础之矩阵运算 1.矩阵类:Matrix.java 包括矩阵的加.乘运算,行列式的求解,最大最小元素等 package cn.com.zfc.help; import java.text. ...

  4. [BZOJ4561][JLOI2016]圆的异或并(扫描线)

    考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变. 将每个圆拆成两边,左端加右端删.每次加圆时考虑它外面最内层的括号属于谁.用se ...

  5. Template(Updating)

    1.Splay (Tyvj1728) #include <bits/stdc++.h> using namespace std; ,INF=<<; ],sz[MAXN],cnt ...

  6. gzez某蒟蒻lyy的博客

    在gz,想去sn幻想乡也行,现在高一并且是已经高二但仍然是机房最弱,没救了 愿诸位身体健康 水平不行,写出来的东西很sb,但还是会偶尔记录一下... 数学公式测试:$\binom n{n_1\cdot ...

  7. 【转】说下lua使用场景

    [今日话题]说下lua使用场景 – flea 1. 我们有用,一些逻辑相对简单,没有复杂的数据交互,访问频次超高的接口实现,可以用lua,省得用phpfpm,太重,浪费资源. – 付坤   2. 也可 ...

  8. java设计模式(五)责任链模式

    很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上某个对象决定处理此请求,应用场景如单位审批流程等. 要点:1)抽象处理者角色:定义处理请求接口及设定下家引用    2 ...

  9. java的注解

    本文转载自:http://www.cnblogs.com/mandroid/archive/2011/07/18/2109829.html 一.概念 Annontation是Java5开始引入的新特征 ...

  10. Codeforces Round #356 (Div. 2) B. Bear and Finding Criminal 水题

    B. Bear and Finding Criminals 题目连接: http://www.codeforces.com/contest/680/problem/B Description Ther ...