解析KML文件并提取coordinates中的经纬度坐标信息
从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中的经纬度坐标信息的更多相关文章
- Java(Android)解析KML文件
參考自:http://blog.csdn.net/yyywyr/article/details/38359049 http://blog.csdn.net/warrenwyf/article/deta ...
- python解析json文件信息到csv中
json格式多种多样,本代码着重看函数部分 import json, csv, os import pandas as pd josns_root = 'jsons' csvs_root = 'csv ...
- c#两种方式调用google地球,调用COM API以及调用GEPLUGIN 与js交互,加载kml文件,dae文件。将二维高德地图覆盖到到三维谷歌地球表面。
网络上资源很多不全面,自己在开发的时候走了不少弯路,在这里整理了最全面的google全套开发,COM交互,web端交互.封装好了各种模块功能. 直接就可以调用. 第一种方式:调用COMAPI实现调用g ...
- 命令行工具解析Crash文件,dSYM文件进行符号化
备份 文/爱掏蜂窝的熊(简书作者)原文链接:http://www.jianshu.com/p/0b6f5148dab8著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序 在日常开发 ...
- Java是如何解析xml文件的(DOM)
Java解析xml文件 在Java程序中读取xml文件的过程也称为"解析xml文件": 解析的目的: 获取 节点名和节点值 获取 属性名.属性值. 四中解析方式: DOM SAX ...
- python 解析 XML文件
如下使用xml.etree.ElementTree模块来解析XML文件.ElementTree模块中提供了两个类用来完成这个目的: ElementTree表示整个XML文件(一个树形结构) Eleme ...
- 遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件
XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...
- 基于 RTF specification v1.7 的 RTF 文件解析及 OLE 对象提取(使用 Python 开发)
0x01 Office RTF 文件介绍 RTF 文件也称富文本格式(Rich Text Format, 一般简称为 RTF),意为多文本格式是由微软公司开发的跨平台文档格式.大多数的文字处理软件都能 ...
- Logstash:解析 JSON 文件并导入到 Elasticsearch 中
转载自:https://elasticstack.blog.csdn.net/article/details/114383426 在今天的文章中,我们将详述如何使用 Logstash 来解析 JSON ...
随机推荐
- thinkphp数据查询方法总结select ,find,getField,query
thinkphp已经封装好了常用的查询方法,且都比较实用,对于不常用的查询框架也保留了原始查询方法query. 1 2 $Model = new Model() // 实例化一个model对象 没有对 ...
- PHP接入支付宝支付
创建应用 使用支付宝账号登录开放平台创建应用,应用创建成功之后可以得到APPID等相关信息 接着需要设置RSA密钥,可以使用蚂蚁金服开放平台提供的生成工具,生成完密钥需在开放平台中填写. 代码接入 引 ...
- python修改文件的属性
1.执行attrib系统命令 ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [+I | -I] [drive:][path][filename] [/ ...
- Oracle win32_11gR2_client.zip
先将下载下来的ZIP文件解压,并运行setup.exe文件. 第一步:选择管理员(0MB)(A),然后点击下一步 第二步:选择语言,点击下一步 第三步:选择安装的路径,然后点击下一步 第四步:执行到第 ...
- HAproxy 代理技术原理探究
HAproxy 技术分享 简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 ...
- 【转】高效率编辑器VIM
最近实习的时候需要在服务器上做Debug,不得不用到vim的相关操作.以前对vim这种被码农无数赞扬的神器望而却步,但今天试了之后感觉还是不错的.以后争取少用鼠标,少用insert模式. 这是从网上看 ...
- MySQL 语句分析
公司使用的数据库是 MySQL 数据库,我对于 MySQL 的了解仅仅是上学的时候学过PHP略微了解. 我认为,作为一个后端程序员,除了在意功能能不能实现之外, 在实现功能之后,还要去想有没有更好的办 ...
- 机器学习<1>:基础概念
本文是笔者学习李航老师的经典教材<统计学习方法>第一章的学习笔记,分享在此,作为机器学习系列的开篇文章,在本系列中,将会逐一总结介绍主要的机器学习算法的基本原理.基于Python的具体实现 ...
- CF1027F Session in BSU
link 花絮: 这场看起来打得还不错的样子……(别问我是用哪个号打的). 然后听说这题的思想被出了好多次,女生赛也出过,quailty算法,然而当时没反应过来,而且时间不多啦. 题意: 有n个人,每 ...
- Codeforces Round #279 (Div. 2) B - Queue 水题
#include<iostream> #include<mem.h> using namespace std; ],q[]; int main() { int n,x,y; m ...