C# List转KML经纬度文件

1,741 阅读8分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

前言:

之前在做项目的时候,遇到一个需求,需要我将list封装好的数据转换成KML经纬度文件,通过自己的学习和查询,想着总结一下,方便自己将来复习,其实不是很难,技术也不是很新,大家有更好的方法和技术,一起探讨一下,互相学习,一起进步,创作不易,点赞评论关注,不喜勿喷。
1235468912310

一、什么是KML文件

KML(Keyhole Markup Language,Keyhole 标记语言)最初是由Google旗下的Keyhole 公司开发和维护的一种基于XML 的标记语言,利用XML 语法格式描述地理空间数据(如点、线、面、多边形和模型等),适合网络环境下的地理信息协作与共享。2008 年4月,KML的最新版本2.2 被OGC 宣布为开放地理信息编码标准,并改由OGC 维护和发展。(讲人话:就是和XML文件差不多,就是谷歌地图标记坐标的一种文件格式,可以记录路径线,点,面吗,以及各种形状)

image-20220808213816947

二、关键代码语法

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>

方法较多建议收藏

Close()关闭此流和基础流。
Dispose()释放 XmlWriter 类的当前实例所使用的所有资源。(继承自 XmlWriter)
Dispose(Boolean)释放由 XmlWriter 占用的非托管资源,还可以另外再释放托管资源。(继承自 XmlWriter)
DisposeAsync()以异步方式执行与释放或重置非托管资源相关的应用程序定义的任务。(继承自 XmlWriter)
DisposeAsyncCore()以异步方式执行与释放或重置托管资源相关的应用程序定义的任务。(继承自 XmlWriter)
Equals(Object)确定指定对象是否等于当前对象。(继承自 Object)
Flush()将缓冲区中的所有内容刷新到基础流,并同时刷新基础流。
FlushAsync()将缓冲区中的所有内容异步刷新到基础流,并同时刷新基础流。(继承自 XmlWriter)
GetHashCode()作为默认哈希函数。(继承自 Object)
GetType()获取当前实例的 Type。(继承自 Object)
LookupPrefix(String)返回在当前命名空间范围中为该命名空间 URI 定义的最近的前缀。
MemberwiseClone()创建当前 Object 的浅表副本。(继承自 Object)
ToString()返回表示当前对象的字符串。(继承自 Object)
WriteAttributes(XmlReader, Boolean)当在派生类中被重写时,写出在 XmlReader 中当前位置找到的所有属性。(继承自 XmlWriter)
WriteAttributesAsync(XmlReader, Boolean)在 XmlReader 中的当前位置异步写出找到的所有属性。(继承自 XmlWriter)
WriteAttributeString(String, String)当在派生类中被重写时,写出具有指定的本地名称和值的属性。(继承自 XmlWriter)
WriteAttributeString(String, String, String)当在派生类中被重写时,写入具有指定的本地名称、命名空间 URI 和值的属性。(继承自 XmlWriter)
WriteAttributeString(String, String, String, String)当在派生类中被重写时,写出具有指定的前缀、本地名称、命名空间 URI 和值的属性。(继承自 XmlWriter)
WriteAttributeStringAsync(String, String, String, String)异步写出具有指定前缀、本地名称、命名空间 URI 和值的属性。(继承自 XmlWriter)
WriteBase64(Byte[], Int32, Int32)将指定的二进制字节编码为 Base64 并写出结果文本。
WriteBase64Async(Byte[], Int32, Int32)将指定的二进制字节异步编码为 Base64 并写出结果文本。(继承自 XmlWriter)
WriteBinHex(Byte[], Int32, Int32)将指定的二进制字节编码为 BinHex 并写出结果文本。
WriteBinHexAsync(Byte[], Int32, Int32)将指定的二进制字节异步编码为 BinHex 并写出结果文本。(继承自 XmlWriter)
WriteCData(String)写出包含指定文本的 块。
WriteCDataAsync(String)异步写出一个包含指定文本的 <[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8XBlLho-1659970976379)(docs.microsoft.com/zh-cn/dotne…)])
WriteCharEntity(Char)为指定的 Unicode 字符值强制生成字符实体。
WriteCharEntityAsync(Char)为指定的 Unicode 字符值异步强制生成字符实体。(继承自 XmlWriter)
WriteChars(Char[], Int32, Int32)以每次一个缓冲区的方式写入文本。
WriteCharsAsync(Char[], Int32, Int32)以每次一个缓冲区的方式异步写入文本。(继承自 XmlWriter)
WriteComment(String)写出包含指定文本的注释 。
WriteCommentAsync(String)异步写出一个包含指定文本的注释 。(继承自 XmlWriter)
WriteDocType(String, String, String, String)写出具有指定名称和可选属性的 DOCTYPE 声明。
WriteDocTypeAsync(String, String, String, String)异步写入具有指定名称和可选属性的 DOCTYPE 声明。(继承自 XmlWriter)
WriteElementString(String, String)写入具有指定的本地名称和值的元素。(继承自 XmlWriter)
WriteElementString(String, String, String)写入具有指定的本地名称、命名空间 URI 和值的元素。(继承自 XmlWriter)
WriteElementString(String, String, String, String)写入具有指定的前缀、本地名称、命名空间 URI 和值的元素。(继承自 XmlWriter)
WriteElementStringAsync(String, String, String, String)异步写入具有指定的前缀、本地名称、命名空间 URI 和值的元素。(继承自 XmlWriter)
WriteEndAttribute()关闭上一个 WriteStartAttribute(String, String, String) 调用。
WriteEndAttributeAsync()异步关闭前一个 WriteStartAttribute(String, String) 调用。(继承自 XmlWriter)
WriteEndDocument()关闭任何打开的元素或特性并将写入器重新设置为起始状态。
WriteEndDocumentAsync()异步关闭任何打开的元素或属性并将写入器重新设置为起始状态。(继承自 XmlWriter)
WriteEndElement()关闭一个元素并弹出相应的命名空间范围。
WriteEndElementAsync()异步关闭一个元素并弹出相应的命名空间范围。(继承自 XmlWriter)
WriteEntityRef(String)按 &name; 写出实体引用。
WriteEntityRefAsync(String)按 &name; 异步写出实体引用。(继承自 XmlWriter)
WriteFullEndElement()关闭一个元素并弹出相应的命名空间范围。
WriteFullEndElementAsync()异步关闭一个元素并弹出相应的命名空间范围。(继承自 XmlWriter)
WriteName(String)写出指定的名称,确保它是符合 W3C XML 1.0 建议的有效名称。
WriteNameAsync(String)异步写出指定的名称,确保它是符合 W3C XML 1.0 建议 (www.w3.org/TR/1998/REC…)) 的有效名称。(继承自 XmlWriter)
WriteNmToken(String)写出指定的名称,确保它是符合 W3C XML 1.0 建议的有效 NmToken
WriteNmTokenAsync(String)异步写出指定的名称,确保它是符合 W3C XML 1.0 建议 (www.w3.org/TR/1998/REC…)) 的有效 NmToken。(继承自 XmlWriter)
WriteNode(XmlReader, Boolean)当在派生类中被重写时,将全部内容从读取器复制到写入器并将读取器移动到下一个同级的开始位置。(继承自 XmlWriter)
WriteNode(XPathNavigator, Boolean)将所有内容从 XPathNavigator 对象复制到编写器。 XPathNavigator 的位置保持不变。(继承自 XmlWriter)
WriteNodeAsync(XmlReader, Boolean)将所有内容从读取器异步复制到写入器并将读取器移动到下一个同级的开头。(继承自 XmlWriter)
WriteNodeAsync(XPathNavigator, Boolean)从编写器的 XPathNavigator 对象中异步复制所有内容。 XPathNavigator 的位置保持不变。(继承自 XmlWriter)
WriteProcessingInstruction(String, String)写出在名称和文本之间有空格的处理指令,如下所示:。
WriteProcessingInstructionAsync(String, String)异步写出在名称和文本之间有空格的处理指令,如下所示:。(继承自 XmlWriter)
WriteQualifiedName(String, String)写出命名空间限定的名称。 此方法查找位于给定命名空间范围内的前缀。
WriteQualifiedNameAsync(String, String)异步写出命名空间限定的名称。 此方法查找位于给定命名空间范围内的前缀。(继承自 XmlWriter)
WriteRaw(Char[], Int32, Int32)从字符缓冲区手动写入原始标记。
WriteRaw(String)从字符串手动写入原始标记。
WriteRawAsync(Char[], Int32, Int32)从字符缓冲区手动异步写入原始标记。(继承自 XmlWriter)
WriteRawAsync(String)从字符串手动异步写入原始标记。(继承自 XmlWriter)
WriteStartAttribute(String)写入具有指定本地名称的属性的开头。(继承自 XmlWriter)
WriteStartAttribute(String, String)写入具有指定本地名称和命名空间 URI 的属性的开头。(继承自 XmlWriter)
WriteStartAttribute(String, String, String)写入属性的开头。
WriteStartAttributeAsync(String, String, String)异步写入具有指定前缀、本地名称和命名空间 URI 的属性的开头。(继承自 XmlWriter)
WriteStartDocument()写入版本为“1.0”的 XML 声明。
WriteStartDocument(Boolean)写入版本为“1.0”的 XML 声明和独立的属性。
WriteStartDocumentAsync()异步写入版本为“1.0”的 XML 声明。(继承自 XmlWriter)
WriteStartDocumentAsync(Boolean)异步写入版本为“1.0”的 XML 声明和独立的属性。(继承自 XmlWriter)
WriteStartElement(String)当在派生类中被重写时,写出具有指定的本地名称的开始标记。(继承自 XmlWriter)
WriteStartElement(String, String)当在派生类中被重写时,写入指定的开始标记并将其与给定的命名空间关联起来。(继承自 XmlWriter)
WriteStartElement(String, String, String)写入指定的开始标记并将其与给定的命名空间和前缀关联起来。
WriteStartElementAsync(String, String, String)异步写入指定的开始标记并将其与给定的命名空间和前缀关联起来。(继承自 XmlWriter)
WriteString(String)写入给定的文本内容。
WriteStringAsync(String)异步写入给定的文本内容。(继承自 XmlWriter)
WriteSurrogateCharEntity(Char, Char)为代理项字符对生成并写入代理项字符实体。
WriteSurrogateCharEntityAsync(Char, Char)为代理项字符对异步生成并写入代理项字符实体。(继承自 XmlWriter)
WriteValue(Boolean)写入 Boolean 值。(继承自 XmlWriter)
WriteValue(DateTime)写入 DateTime 值。(继承自 XmlWriter)
WriteValue(DateTimeOffset)写入 DateTimeOffset 值。(继承自 XmlWriter)
WriteValue(Decimal)写入 Decimal 值。(继承自 XmlWriter)
WriteValue(Double)写入 Double 值。(继承自 XmlWriter)
WriteValue(Int32)写入 Int32 值。(继承自 XmlWriter)
WriteValue(Int64)写入 Int64 值。(继承自 XmlWriter)
WriteValue(Object)写入对象值。(继承自 XmlWriter)
WriteValue(Single)写入一个单精度浮点数。(继承自 XmlWriter)
WriteValue(String)写入 String 值。(继承自 XmlWriter)
WriteWhitespace(String)写出给定的空白区域。
WriteWhitespaceAsync(String)异步写出给定的空白区域。(继承自 XmlWriter)

三、效果展示

效果展示有一下:这个程序是将list经纬度的点转换为KML文件,并能读出,后面代码可以直接拷贝用

image.png

image-20220808221106520

image-20220808221349991

注:为了方便查看你可以将kml文件后缀名改为xml,到时候再改回来就可以了

image.png

四、代码解析展示

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文件格式设置文件流,注意为了防止你搞混淆,建议你在设计时一个标签一个标签的来,并做好注解方便自己查看,比如你想要在这个标签里面设置点,你可以先把两个标签设置好,再到里面编写其他内容,类似我们编程打花括号一样{},一对一对,这样不会搞错,创作不易,点赞关注收藏评论,不喜勿喷,你的关注是我最大的动力我将持续更新。

haoping211