从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. js判断一个字符串是否是数字

    function isNumber(val) { var regPos = /^\d+(\.\d+)?$/; //非负浮点数 var regNeg = /^(-(([0-9]+\.[0-9]*[1-9 ...

  2. java 代码中设置 临时 环境变量

    System.setProperty("hadoop.home.dir", "D:\\software\\software_install\\dev_install\\h ...

  3. @react-native-community/async-storage在Android上的手动link问题

    PS C:\Users\linjin\Desktop\RN_APP> react-native link @react-native-community/async-storage error ...

  4. Entity Framework Core(3)-配置DbContext

    设计时 DbContext 配置 EF Core 设计时工具如迁移需要能够发现和创建的工作实例DbContext以收集有关应用程序的实体类型以及它们如何映射到数据库架构的详细信息的类型. 此过程可以为 ...

  5. Django基础-Lesson1

    web框架概念 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统. 对于所有的Web应用,本质上其实就是一个socket服务端, ...

  6. java设计模式(三)模板模式

    抽象类中公开定义了执行它的方法的方式,子类可以按需求重写方法实现,但调用将以抽象类中定义的方式进行,典型应用如银行办理业务流程.冲泡饮料流程.下面给出简单例子,用沸水冲泡饮料,分为四步:将水煮沸.泡制 ...

  7. 撩课-Java每天5道面试题第11天

    86.如何获得高效的数据库逻辑结构? 从关系数据库的表中 删除冗余信息的过程 称为数据规范化, 是得到高效的关系型数据库表的逻辑结构 最好和最容易的方法. 规范化数据时应执行以下操作: 1.将数据库的 ...

  8. Codechef December Challenge 2014 Chef and Apple Trees 水题

    Chef and Apple Trees Chef loves to prepare delicious dishes. This time, Chef has decided to prepare ...

  9. faceNet编译问题

    1.执行align_dataset_mtcnn.py出现无法导入检测模型的问题 a.现象如下 Creating networks and loading parameters Traceback (m ...

  10. IO流-递归遍历目录下指定后缀名结尾的文件名称

    /* *自定义遍历目录下指定后缀名结尾文件的名称的方法: * * param file:指定目录 name:指定后缀名 */ 1 public static void FileName(File fi ...