携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
前言:
之前在做项目的时候,遇到一个需求,需要我将list封装好的数据转换成KML经纬度文件,通过自己的学习和查询,想着总结一下,方便自己将来复习,其实不是很难,技术也不是很新,大家有更好的方法和技术,一起探讨一下,互相学习,一起进步,创作不易,点赞评论关注,不喜勿喷。
一、什么是KML文件
KML(Keyhole Markup Language,Keyhole 标记语言)最初是由Google旗下的Keyhole 公司开发和维护的一种基于XML 的标记语言,利用XML 语法格式描述地理空间数据(如点、线、面、多边形和模型等),适合网络环境下的地理信息协作与共享。2008 年4月,KML的最新版本2.2 被OGC 宣布为开放地理信息编码标准,并改由OGC 维护和发展。(讲人话:就是和XML文件差不多,就是谷歌地图标记坐标的一种文件格式,可以记录路径线,点,面吗,以及各种形状)
二、关键代码语法
XmlTextWriter kml = new XmlTextWriter(file, Encoding.UTF8);//使用XML文件流的形式进行数据转换
kml.WriteStartDocument();//最先开始都需要一个:根节点
kml.WriteStartElement("kml", "http://earth.google.com/kml/2.1"); //这个代表<KML>最先开始的标签类似我们的html语言的<HTML>标签
kml.WriteAttributeString("xmlns", "gx", null, "http://www.google.com/kml/ext/2.2");//添加属性
kml.WriteStartElement("scale"); 表示建立一个 带尖括号标签名称为scale //<scale>
kml.WriteString("1.0"); 标签中的内容
kml.WriteEndElement(); 表示建立一个 带尖括号结束标签名称为scale //<scale>
复制代码
方法较多建议收藏
三、效果展示
效果展示有一下:这个程序是将list经纬度的点转换为KML文件,并能读出,后面代码可以直接拷贝用
注:为了方便查看你可以将kml文件后缀名改为xml,到时候再改回来就可以了
四、代码解析展示
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
namespace FileConversion
{
public class AddKmlFile
{
public void addKmlFile(List<string> mapConfigs)
{
int name = 1;
string localFilePath = "";//文件路径
SaveFileDialog save = new SaveFileDialog();
save.Filter = "Kml(*.kml)|*.kml"; //设置文件类型
save.RestoreDirectory = true; //保存对话框是否记忆上次打开的目录 ,将kml文件你需要保存的位置
if (save.ShowDialog() == DialogResult.OK)//点了保存按钮进入
{
localFilePath = save.FileName.ToString(); //获得文件路径
string fileName = localFilePath.Substring(localFilePath.LastIndexOf("\") + 1); //获取文件名,不带路径
FileStream file = new FileStream(localFilePath, FileMode.Create);
XmlTextWriter kml = new XmlTextWriter(file, Encoding.UTF8);
kml.WriteStartDocument();//根节点
kml.WriteStartElement("kml", "http://earth.google.com/kml/2.1"); //<kml>
kml.WriteAttributeString("xmlns", "gx", null, "http://www.google.com/kml/ext/2.2");
kml.WriteAttributeString("xmlns", "kml", null, "http://www.opengis.net/kml/2.2");
kml.WriteAttributeString("xmlns", "atom", null, "http://www.w3.org/2005/Atom");
kml.WriteStartElement("Document"); //<Document>
//style
kml.WriteStartElement("Style"); //<Style id="point_color1">
kml.WriteAttributeString("id", "point_color1");
kml.WriteStartElement("IconStyle"); //<IconStyle>
kml.WriteStartElement("scale"); //<scale>
kml.WriteString("1.0");
kml.WriteEndElement(); //<scale>
kml.WriteStartElement("Icon"); //<Icon>
kml.WriteStartElement("href"); //<href>
kml.WriteString("http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png");
kml.WriteEndElement(); //</href>
kml.WriteEndElement(); //</Icon>
kml.WriteEndElement(); //<IconStyle>
kml.WriteStartElement("LabelStyle"); //<LabelStyle>
kml.WriteStartElement("scale"); //<scale>
kml.WriteString("1.0");
kml.WriteEndElement(); //</scale>
kml.WriteStartElement("color"); //<color>
kml.WriteString("FFFF0080");
kml.WriteEndElement(); //</color>
kml.WriteEndElement(); //</LabelStyle>
kml.WriteEndElement(); //</Style >
//style
kml.WriteStartElement("Style"); //<Style id="point_color1">
kml.WriteAttributeString("id", "point_color2");
kml.WriteStartElement("IconStyle"); //<IconStyle>
kml.WriteStartElement("scale"); //<scale>
kml.WriteString("1.2");
kml.WriteEndElement(); //<scale>
kml.WriteStartElement("Icon"); //<Icon>
kml.WriteStartElement("href"); //<href>
kml.WriteString("http://maps.google.com/mapfiles/kml/pushpin/ltblu-pushpin.png");
kml.WriteEndElement(); //</href>
kml.WriteEndElement(); //</Icon>
kml.WriteEndElement(); //<IconStyle>
kml.WriteStartElement("LabelStyle"); //<LabelStyle>
kml.WriteStartElement("scale"); //<scale>
kml.WriteString("1.2");
kml.WriteEndElement(); //</scale>
kml.WriteStartElement("color"); //<color>
kml.WriteString("FF00FF80");
kml.WriteEndElement(); //</color>
kml.WriteEndElement(); //</LabelStyle>
kml.WriteEndElement(); //</Style >
//stylemap
kml.WriteStartElement("StyleMap"); //<StyleMap id="point_num1">
kml.WriteAttributeString("id", "point_num1");
kml.WriteStartElement("Pair"); //<Pair>
kml.WriteStartElement("key"); //<key>
kml.WriteString("normal");
kml.WriteEndElement(); //</key>
kml.WriteStartElement("styleUrl"); //<styleUrl>
kml.WriteString("#point_color1");
kml.WriteEndElement(); //</styleUrl>
kml.WriteEndElement(); //</Pair>
kml.WriteStartElement("Pair"); //<Pair>
kml.WriteStartElement("key"); //<key>
kml.WriteString("highlight");
kml.WriteEndElement(); //</key>
kml.WriteStartElement("styleUrl"); //<styleUrl>
kml.WriteString("#point_color2");
kml.WriteEndElement(); //</styleUrl>
kml.WriteEndElement(); //</Pair>
kml.WriteEndElement(); //</StyleMap>
//name
kml.WriteStartElement("name"); //<name>
kml.WriteString(fileName); //以文件名作为name
kml.WriteEndElement(); //</name >
//Placemark
kml.WriteStartElement("Placemark"); //<Placemark>
kml.WriteStartElement("Name"); //<name>
kml.WriteString("HQ1");
kml.WriteEndElement(); //</name>
kml.WriteStartElement("description"); //< description>
kml.WriteEndElement(); //</description>
kml.WriteStartElement("styleUrl"); //<styleUrl>
kml.WriteString("#point_num1");
kml.WriteEndElement(); //</styleUrl>
kml.WriteStartElement("Point"); //<Point>
kml.WriteStartElement("altitudeMode"); //<altitudeMode>
kml.WriteString("clampToGround");
kml.WriteEndElement(); //</altitudeMode>
kml.WriteStartElement("drawOrder", "http://www.google.com/kml/ext/2.2"); //<gx:drawOrder>
kml.WriteString("1");
kml.WriteEndElement(); //</gx:drawOrder>
kml.WriteEndElement(); //</Point>
kml.WriteEndElement(); //</Placemark>
//Placemark
foreach (string data in mapConfigs)
{
kml.WriteStartElement("Placemark"); //<Placemark>
kml.WriteStartElement("name"); //<name>
kml.WriteString("A-" + (name++).ToString()); //不知道具体name使用A前缀后累加
kml.WriteEndElement(); //</name>
kml.WriteStartElement("description"); //< description>
kml.WriteEndElement(); //</description>
kml.WriteStartElement("styleUrl"); //<styleUrl>
kml.WriteString("#point_num1");
kml.WriteEndElement(); //</styleUrl>
kml.WriteStartElement("Point"); //<Point>
kml.WriteStartElement("altitudeMode"); //<altitudeMode>
kml.WriteString("clampToGround");
kml.WriteEndElement(); //</altitudeMode>
kml.WriteStartElement("coordinates"); //< coordinates>
kml.WriteString(data);
kml.WriteEndElement(); //< coordinates />
kml.WriteStartElement("drawOrder", "http://www.google.com/kml/ext/2.2"); //<gx:drawOrder>
kml.WriteString("1");
kml.WriteEndElement(); //</gx:drawOrder>
kml.WriteEndElement(); //</Point>
kml.WriteEndElement(); //</Placemark>
}
kml.WriteEndElement();//</Document>
kml.WriteEndElement(); // </kml>
kml.WriteEndDocument();//根节点
kml.Close();
}
return;
}
}
}
复制代码
五、总结
你可以根据你需要的kml文件格式设置文件流,注意为了防止你搞混淆,建议你在设计时一个标签一个标签的来,并做好注解方便自己查看,比如你想要在这个标签里面设置点,你可以先把两个标签设置好,再到里面编写其他内容,类似我们编程打花括号一样{},一对一对,这样不会搞错,创作不易,点赞关注收藏评论,不喜勿喷,你的关注是我最大的动力我将持续更新。