質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

1390閲覧

C#で複数のPlacemarkのラグを保持したKMLファイルを作りたいです。

hangil700

総合スコア0

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/05/11 11:31

前提・実現したいこと

複数の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です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hey_CH

2021/05/11 12:36

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());
guest

回答1

0

複数のPlacemarkのラグを保持したKMLファイルを作りたいです。

タグですかね?
KMLについてまったくわかっていませんが、こうなればいいんでしょうか?(固定値で関係ない部分は省略)

xml

1<?xml version="1.0" encoding="utf-8"?> 2<kml xmlns="http://www.opengis.net/kml/2.2"> 3 <Document> 4 <Folder> 5 <Placemark> 6 <LookAt> 7 <longitude>135</longitude> 8 <latitude>35</latitude> 9 <altitude>17</altitude> 10 </LookAt> 11 <Point> 12 <coordinates>135,35,17</coordinates> 13 </Point> 14 </Placemark> 15 <Placemark> 16 <LookAt> 17 <longitude>132</longitude> 18 <latitude>35</latitude> 19 <altitude>17</altitude> 20 </LookAt> 21 <Point> 22 <coordinates>132,35,17</coordinates> 23 </Point> 24 </Placemark> 25 <Placemark> 26 <LookAt> 27 <longitude>131</longitude> 28 <latitude>35</latitude> 29 <altitude>17</altitude> 30 </LookAt> 31 <Point> 32 <coordinates>131,35,17</coordinates> 33 </Point> 34 </Placemark> 35 </Folder> 36 </Document> 37</kml>

だとして、
方針としてはPlacemark以外の部分をまず作ってしまいます。
その後Folderを取得し、必要分Placemarkを追加します。

cs

1using System.Linq; 2using System.Xml.Linq; 3 4namespace Questions337759 5{ 6 class Place 7 { 8 public string Lon; 9 public string Lat; 10 public string Alt; 11 12 public Place(string lon, string lat, string alt) 13 => (Lon, Lat, Alt) = (lon, lat, alt); 14 15 public override string ToString() => $"{Lon},{Lat},{Alt}"; 16 } 17 18 class Program 19 { 20 static void Main() 21 { 22 var placelist = new Place[] { 23 new Place("135", "35", "17"), 24 new Place("132", "35", "17"), 25 new Place("131", "35", "17") 26 }; 27 28 var xml = CreateKml(placelist); 29 xml.Save(@"KMLSample01.kml"); 30 } 31 32 private static XDocument CreateKml(Place[] placelist) 33 { 34 XNamespace ns = "http://www.opengis.net/kml/2.2"; 35 36 var xml = new XDocument( 37 new XDeclaration("1.0", "utf-8", "true"), 38 new XElement(ns + "kml", 39 new XAttribute("xmlns", ns), 40 new XElement(ns + "Document", 41 new XElement(ns + "name", "KMLSample.kml"), 42 new XElement(ns + "open", "1"), 43 new XElement(ns + "Style", 44 new XElement(ns + "IconStyle", 45 new XElement(ns + "scale", "3")), 46 new XElement(ns + "LabelStyle", 47 new XElement(ns + "scale", "5"))), 48 new XElement(ns + "Folder", 49 new XElement(ns + "name", "Kyoto sample"), 50 new XElement(ns + "open", "1"))))); 51 52 var folder = xml.Descendants(ns + "Folder").First(); 53 54 foreach (var place in placelist) 55 { 56 var placemark = new XElement(ns + "Placemark", 57 new XElement(ns + "name", "Somewhere of Kyoto"), 58 new XElement(ns + "description", "Here is Kyoto"), 59 new XElement(ns + "LookAt", 60 new XElement(ns + "longitude", place.Lon), 61 new XElement(ns + "latitude", place.Lat), 62 new XElement(ns + "altitude", place.Alt), 63 new XElement(ns + "heading", "0"), 64 new XElement(ns + "tilt", "0"), 65 new XElement(ns + "range", "1304.699887442112"), 66 new XElement(ns + "altitudeMode", "absolute")), 67 new XElement(ns + "Point", 68 new XElement(ns + "coordinates", place))); 69 70 folder.Add(placemark); 71 } 72 73 return xml; 74 } 75 } 76}

説明が足りないとは思うのですが、hangil700さんがどこまでわかっているかがわからないので不明点があればコメントしてください。
説明を追加します。

投稿2021/05/12 11:22

編集2023/07/27 13:40
TN8001

総合スコア9244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問