gpt4 book ai didi

c# - 使用 xml 元素创建 kml 文件

转载 作者:行者123 更新时间:2023-11-30 22:19:42 25 4
gpt4 key购买 nike

我想在 C# 中创建一个 kml 文件。现在我有两个问题:

  1. 为了在我的 kml 文件中包含以下行,在 xml 文件中添加 kml 元素的语法是什么?

    <kml xmlns="http://www.opengis.net/kml/2.2">
  2. 我有一个点数组,我想将它们组成线串。我应该如何为 kml 文件填充 xml 中的坐标元素?以下是我目前的代码。

代码:

public void MakeKmlFile(string line)
{
CoordinateCollection coordinates = new CoordinateCollection();

char[] delimiterLine = { '|' };
char[] delimiterPoint = { ',' };
string[] route = line.Split(delimiterLine);

foreach (string point in route)
{
string[] route_point = line.Split(delimiterPoint);
double lat = double.Parse(route_point[1]);
double lon = double.Parse(route_point[0]);
coordinates.Add(new Vector(lat, lon));
}

XmlTextWriter writer = new XmlTextWriter("route.xml", System.Text.Encoding.UTF8);
writer.Formatting = Formatting.Indented;
writer.WriteStartElement("Document");
writer.WriteStartElement("Folder");
writer.WriteStartElement("name");
writer.WriteString("route");
writer.WriteEndElement();
writer.WriteStartElement("Placemark");
writer.WriteStartElement("Style");
writer.WriteStartElement("LineStyle");
writer.WriteStartElement("color");
writer.WriteString("ff0000ff");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteStartElement("PolyStyle");
writer.WriteStartElement("fill");
writer.WriteString("2");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteStartElement("LineString");
writer.WriteStartElement("coordinates");

这是我得到的结果:

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Name>Points.kml</Name>
<Placemark />
<Placemark />
<Placemark />
<Placemark />
<Placemark />
</Document>

最佳答案

您可以像创建普通 XML 文档一样创建 KML 文档

    XmlDocument xDoc = new XmlDocument();
XmlDeclaration xDec = xDoc.CreateXmlDeclaration("1.0", "utf-8", null);

XmlElement rootNode = xDoc.CreateElement("kml");
rootNode.SetAttribute("xmlns", @"http://www.opengis.net/kml/2.2");
xDoc.InsertBefore(xDec, xDoc.DocumentElement);
xDoc.AppendChild(rootNode);
XmlElement docNode = xDoc.CreateElement("Document");
rootNode.AppendChild(docNode);

XmlElement nameNodeMain = xDoc.CreateElement("Name");
XmlText nameTextMain = xDoc.CreateTextNode("Points.kml");
docNode.AppendChild(nameNodeMain);
nameNodeMain.AppendChild(nameTextMain);

这为您的文档设置了基本结构,然后您需要做的就是添加每个地标(最好通过循环完成)

    char[] delimiterLine = { '|' };
char[] delimiterPoint = { ',' };
string[] places = line.Split(delimiterLine);
for (int i = 0; i < places.length; i++)
{
string[] placeMark = places[i].split(delimiterPoint);
XmlElement placeNode = xDoc.CreateElement("Placemark");
docNode.AppendChild(placeNode);

XmlElement nameNode = xDoc.CreateElement("Name");
XmlText nameText = xDoc.CreateTextNode(placeMark[0]);
placeNode.AppendChild(nameNode);
nameNode.AppendChild(nameText);

XmlElement descNode = xDoc.CreateElement("Description");
XmlText descText = xDoc.CreateTextNode(placeMark[1]);
placeNode.AppendChild(descNode);
descNode.AppendChild(descText);

XmlElement pointNode = xDoc.CreateElement("Point");
placeNode.AppendChild(pointNode);

XmlElement coordNode = xDoc.CreateElement("coordinates");
XmlText coordText = xDoc.CreateTextNode(string.Format("{0},{1}", placeMark[2], placeMark[3]));
pointNode.AppendChild(coordNode);
coordNode.AppendChild(coordText);
}
return xDoc;

我以前没有在 KML 中使用过 LineStrings,但我怀疑这样做的代码会遵循以下几行:

    XmlDocument xDoc = new XmlDocument();
XmlDeclaration xDec = xDoc.CreateXmlDeclaration("1.0", "utf-8", null);

XmlElement rootNode = xDoc.CreateElement("kml");
rootNode.SetAttribute("xmlns", @"http://www.opengis.net/kml/2.2");
xDoc.InsertBefore(xDec, xDoc.DocumentElement);
xDoc.AppendChild(rootNode);
XmlElement docNode = xDoc.CreateElement("Document");
rootNode.AppendChild(docNode);

XmlElement nameNodeMain = xDoc.CreateElement("Name");
XmlText nameTextMain = xDoc.CreateTextNode("Points.kml");
docNode.AppendChild(nameNodeMain);
nameNodeMain.AppendChild(nameTextMain);

XmlElement placeNode = xDoc.CreateElement("Placemark");
docNode.AppendChild(placeNode);

XmlElement nameNode = xDoc.CreateElement("Name");
XmlText nameText = xDoc.CreateTextNode("Test line");
placeNode.AppendChild(nameNode);
nameNode.AppendChild(nameText);

XmlElement lineStringNode = xDoc.CreateElement("LineString");
placeNode.AppendChild(lineStringNode);

XmlElement coordNode = xDoc.CreateElement("coordinates");

char[] delimiterLine = { '|' };
char[] delimiterPoint = { ',' };
string[] places = line.Split(delimiterLine);
for (int i = 0; i < places.length; i++)
{
string[] placeMark = places[i].split(delimiterPoint);

XmlText coordText = xDoc.CreateTextNode(string.Format("{0},{1}", placeMark[0], placeMark[1]));
pointNode.AppendChild(coordNode);
}


coordNode.AppendChild(coordText);

xDoc.Save("./KML/");

它基本上涉及移动我以前的代码并为 KML 文件中所需的每个主要元素创建一个 XmlElement,然后在将它们拆分为行字符串后遍历坐标。

关于c# - 使用 xml 元素创建 kml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15430363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com