前提・実現したいこと
複数のPlacemarkのラグを保持したKMLファイルを作りたいです。
該当のソースコード
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Xml; 7using System.Xml.Linq; 8 9namespace CreatKMLfile 10{ 11 public class Place // 緯度経度等の情報 12 { 13 public static string comma = ","; // comma 14 public string lon; 15 public string lat; 16 public string alt; 17 18 public Place(string lon, string lat, string alt) 19 { 20 } 21 public class CreatKMLfile 22 { 23 public static void Main() 24 { 25 var placelist = new Place[] { 26 new Place("135", "35", "17"), 27 new Place("132", "35", "17"), 28 new Place("131", "35", "17") 29 }; 30 createKml(placelist); 31 } 32 33 private static void createKml(Place[] placelist) 34 { 35 // Namespaceの定義 36 XNamespace name1 = "http://www.opengis.net/kml/2.2"; 37 XNamespace name2 = "http://www.google.com/kml/ext/2.2"; 38 XNamespace name3 = "http://www.opengis.net/kml/2.2"; 39 XNamespace name4 = "http://www.w3.org/2005/Atom"; 40 41 42 XDocument xml = new XDocument( 43 new XDeclaration("1.0", "utf-8", "true"), 44 new XElement(name1 + "kml", 45 new XAttribute("xmlns", name1), 46 new XAttribute(XNamespace.Xmlns + "gx", name2), 47 new XAttribute(XNamespace.Xmlns + "kml", name3), 48 new XAttribute(XNamespace.Xmlns + "atom", name4), 49 new XElement(name1 + "Document", 50 new XElement(name1 + "name", "KMLSample.kml"), 51 new XElement(name1 + "open", "1"), 52 new XElement(name1 + "Style", 53 new XElement(name1 + "IconStyle", 54 new XElement(name1 + "scale", "3")), 55 new XElement(name1 + "LabelStyle", 56 new XElement(name1 + "scale", "5"))), 57 new XElement(name1 + "Folder", 58 new XElement(name1 + "name", "Kyoto sample"), 59 new XElement(name1 + "open", "1"), 60 new XElement(name1 + "Placemark", 61 new XElement(name1 + "name", "Somewhere of Kyoto"), 62 new XElement(name1 + "description", "Here is Kyoto"), 63 new XElement(name1 + "LookAt", 64 new XElement(name1 + "longitude", placelist[].lon), 65 new XElement(name1 + "latitude", placelist[].lat), 66 new XElement(name1 + "altitude", placelist[].alt), 67 new XElement(name1 + "heading", "0"), 68 new XElement(name1 + "tilt", "0"), 69 new XElement(name1 + "range", "1304.699887442112"), 70 new XElement(name1 + "altitudeMode", "absolute")), 71 new XElement(name1 + "Point", 72 new XElement(name1 + "coordinates", placelist[].lon, Place.comma, placelist[].lat, Place.comma, placelist[].alt))))))); 73 74 xml.Save(@"C:\sample\KMLSample01.kml"); // kmlファイルとして保存 75 } 76 } 77 } 78}
試したこと
関連文書を読んではいますが、自分自身C#を習い始めた初心者でもあるため理解が難しく、
そもそも配列を使っているので、そこから接近できたらと思っていますが、難しく感じています。
一番詰まってる部分を言いますと、
・placelistの配列のPlace達の要素(緯度経度等)をどうやって連続的に読み込ませるか?
です。
環境としてはVisual studio 2019です。
KMLなんて1ミリも知らないので適当ですが、テンプレート的な文字列やファイルを作っておき、
XDocumentにParseやLoadして使う方が楽じゃないでしょうか。(その後いじくりまわす)
XNamespace ns0 = "http://www.test.com/base";
XNamespace ns1 = "http://www.test.com/test/1";
var xml = "<a xmlns=\"http://www.test.com/base\" xmlns:o=\"http://www.test.com/test/1\">";
xml += "<b/>\r\n";
xml += "<b/>\r\n";
xml += "<b/>\r\n";
xml += "</a>";
var doc = XDocument.Parse(xml);
var beles = doc.Descendants(ns0 + "b");
foreach (var bele in beles) {
bele.Add(new XElement(ns0 + "c", "c element"));
bele.Add(new XElement(ns1 + "d", "d element"));
}
Console.WriteLine(doc.ToString());