2

C#でkmlファイルを作成したい。今、私は2つの問題を抱えています:

  1. kml ファイルに以下の行を含めるために、xml ファイルに kml 要素を追加する synatx は何ですか?

    <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>

4

2 に答える 2

3

通常の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ファイルに必要な主要な要素ごとに1つのXmlElementを作成し、それらを行文字列に分割した後、座標を反復処理する必要があります。

于 2013-03-15T10:56:13.767 に答える
0

最も直接的な解決策は、ルート (線の文字列) をトークン化し、文字列バッファーに座標を追加してから、値として出力することです。CoordinateCollection を作成して Vector オブジェクトを分離する必要はありません。

注: 有効な KML であるためには、最初に経度の値を出力し、次に緯度をコンマ (,) で区切って出力する必要があります。経度と緯度の値の間には空白を入れず、空白で各経度と緯度のペアをオプションで高度値で区切る必要があります。

System.Xml.XmlTextWriterクラスを使用した C# ソリューションを次に示します。

    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();
于 2013-03-15T18:57:46.757 に答える