2013-03-15 4 views
1

Я хочу создать kml-файл в C#. Теперь у меня есть две проблемы:Создать kml-файл с помощью элементов xml

  1. Что такое synatx, чтобы добавить элемент KML в файле XML, чтобы иметь строку ниже в моем файле KML?

    <kml xmlns="http://www.opengis.net/kml/2.2"> 
    
  2. У меня есть массив точек, которые я хотел бы, чтобы сформировать LineString. Как я предполагаю, чтобы заполнить элемент координат в xml для файла kml?. Ниже приведен мой код.

КОД:

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> 

+0

Обратите внимание, что Polystyle заполнить элемент имеет значение 1 или 0 => "2" не является действительным. – JasonM1

ответ

3

Вы можете создать документ KML просто как обычный документ XML

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; 

Я не работал с объект LineString в формате 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); 

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/"); 

Это в основном включает в себя перемещение моего предыдущего кода вокруг и создания единого XmlElement для каждого из основных элементов, необходимых в файле KML, а затем итерация по координатам после их разбиения на строку.

+0

Спасибо за ответ. Поскольку я хочу закончить с помощью элемента linestring из массива точек, как я буду использовать его в меток для каждого цикла? @Donald Dunlop –

+1

Я предполагаю, что ваш linestring находится в формате «место | место | место», и каждое «место» составлено для места = «Имя, описание, широта, долгота», так как это может сделать ваш массив, полученный от Split («|»), а затем выполните цикл for, повторяющийся через этот массив, и разделив каждый элемент с использованием символа «,». –

+0

Я изменил цикл foreach на цикл for, который использует расщепление linestring –

0

Наиболее прямым решением является токенизация маршрута (строка строки) и добавление координат в строковый буфер, а затем вывод в качестве значения. Не нужно создавать объекты CoordinateCollection и отдельные векторные объекты.

ПРИМЕЧАНИЕ. Чтобы быть действительным KML, вы должны сначала вывести значение долготы, затем широту, разделенную запятой (,) без пробелов между значениями lon-lat и пробелами, должны отдельно отделять каждую пару lon-lat при значении высоты ,

Вот C# решение, используя System.Xml.XmlTextWriter класс:

XmlTextWriter writer = new XmlTextWriter(...); 
    writer.WriteStartElement("kml", "http://www.opengis.net/kml/2.2"); 
    ... 
    writer.WriteStartElement("LineString"); 
    StringBuilder sb = new StringBuilder(); 
    foreach (string point in route) 
    { 
     string[] route_point = point.Split(delimiterPoint); 
     if (route_point.Length >= 2) 
     { 
      double lon = double.Parse(route_point[0]); 
      double lat = double.Parse(route_point[1]); 
      sb.Append(' ').Append(lon).Append(',').Append(lat); 
      // coordinates.Add(new Vector(lat, lon)); 
     } 
    } 
    writer.WriteStartElement("coordinates"); 
    writer.WriteValue(sb.ToString()); 
    writer.WriteEndElement(); // end coordinates 
    writer.WriteEndElement(); // end LineString 
    writer.WriteEndElement(); // end Placemark 
    ... 
    writer.Close();