今回は、円の図形と中心のマーカーをkmlファイルに出力する方法の説明です。
kmlファイルは、xmlファイルの一種です。
vb.netでは、xmlファイルを簡単に作ることができます。
今回の方法は、xmlWriterを使って、1行づつ書き込んでいく方法です。
vb.netでのxmlファイルの作成方法は、この記事が参考になると思います。
まずは、Kmlに変換するボタンのクリックイベントを説明します。
ボタンの名称は「Butt_円のKML作成」です。
保存するファイル名を指定するため、SaveFileDialogコントロールもフォームに配置しています。
SaveFileDialogコントロールの名称は「SaveFileDialog_KML」としています。
Private Sub Butt_円のKML作成_Click(sender As Object, e As EventArgs) Handles Butt_円のKML作成.Click Try 'ファイル保存ダイアログを開いて、保存するファイル名を指定します。 SaveFileDialog_KML.Filter = "KMLファイル(*.KML)|*.kml|すべてのファイル(*.*)|*.*" SaveFileDialog_KML.FilterIndex = 1 SaveFileDialog_KML.Title = "KMLファイルの保存先" If SaveFileDialog_KML.ShowDialog() = Windows.Forms.DialogResult.Cancel Then 'キャンセルボタンを押された時の処理 MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Stop) Exit Sub End If 'クラス「XML_Edit」の「sub_kml円作成」メソッドを呼び出します。 '引数は、KMLファイルのフルパスを渡しています。 XML_Edit.sub_kml円作成(SaveFileDialog_KML.FileName) 'ファイルが作成されたら、メッセージを表示して、kmlファイルに関連付けられたソフトでファイルを開きます。 MessageBox.Show("KMLが保存されました。", "KML保存完了", MessageBoxButtons.OK, MessageBoxIcon.Information) Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(SaveFileDialog_KML.FileName) Catch ex As Exception '例外処理 MessageBox.Show("エラー発生(Butt_円のKML作成_Click)" & vbCr & ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub
次に上のプロシージャで呼び出しているクラス「XML_Edit」の内容です。
xmlの編集を行うために、「System.xml」をインポートしておきます。
Imports System.Xml Public Class XML_Edit Public Shared Sub sub_kml円作成(D_Path As String) 'D_Pathはフルパスを指定 Dim writer As XmlWriter = Nothing 'xmlwriterクラス Dim settings As XmlWriterSettings = New XmlWriterSettings() 'テキストボックスのバックカラーをhtml16進数に変換 KMLの場合、赤と青が逆なので注意 Dim htmlColor As String = String.Format("{0:X2}{1:X2}{2:X2}", F_地図表示.txt_円の色.BackColor.B, F_地図表示.txt_円の色.BackColor.G, F_地図表示.txt_円の色.BackColor.R) '透過率をhtml16進数に変換 Dim html透過 As String = CStr(Hex(F_地図表示.txt_透明度.Text * 2.55)) '100%が255になるので、2.55倍する 'ファイル名から、KMLドキュメントの名前を設定 Dim myName As String = System.IO.Path.GetFileNameWithoutExtension(D_Path) '文字コードを指定 settings.Encoding = System.Text.Encoding.UTF8 'kmlはUTF-8で記述する 'settings.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") 'インデントを設定すると、改行されて出力される settings.Indent = True settings.IndentChars = vbTab '書き込み先のテキストファイル writer = XmlWriter.Create(D_Path, settings) 'この時点で空のxmlファイルが作成される 'XML作成開始 writer.WriteStartDocument() 'ルート要素<kml>の宣言 writer.WriteStartElement("kml") 'ここはエラーになるので記述しない。記述がなくてもGoogleEarthでは読み込める。 'writer.WriteAttributeString("xmlns", "", "http://www.opengis.net/kml/2.2") 'writer.WriteAttributeString("xmlns:gx", "", "http://www.google.com/kml/ext/2.2") 'writer.WriteAttributeString("xmlns:kml", "", "http://www.opengis.net/kml/2.2") 'writer.WriteAttributeString("xmlns:atom", "", "http://www.w3.org/2005/Atom") writer.WriteStartElement("Document") writer.WriteElementString("name", myName) 'ポイントやポリゴンのスタイルの記述 writer.WriteStartElement("Style") writer.WriteAttributeString("id", "", "PolyStyle") 'スタイルを使うときはidで呼び出す writer.WriteStartElement("IconStyle") writer.WriteElementString("scale", "1.0") 'アイコンの大きさ writer.WriteStartElement("Icon") writer.WriteElementString("href", "http://maps.google.com/mapfiles/kml/paddle/pink-circle.png") 'アイコンの画像 writer.WriteEndElement() 'Iconタグ終わり writer.WriteStartElement("hotSpot") 'アイコンの位置などの設定 writer.WriteAttributeString("x", "", "32") writer.WriteAttributeString("y", "", "1") writer.WriteAttributeString("xunits", "", "pixels") writer.WriteAttributeString("yunits", "", "pixels") writer.WriteEndElement() 'hotSpotタグ終わり writer.WriteEndElement() 'IconStyleタグ終わり writer.WriteStartElement("LineStyle") '線のスタイル '色は透過率2桁(16進数)+色コード(BGRの16進数) writer.WriteElementString("color", "ff" & htmlColor) '透過100% writer.WriteElementString("width", "3") '線の太さ writer.WriteEndElement() 'LineStyleタグ終わり writer.WriteStartElement("PolyStyle") '塗りつぶしのスタイル writer.WriteElementString("color", html透過 & htmlColor) '塗りつぶしの色 writer.WriteEndElement() 'PolyStyleタグ終わり writer.WriteEndElement() 'Styleタグ終わり 'スタイルマップのタグの記述 writer.WriteStartElement("StyleMap") writer.WriteAttributeString("id", "", "circleStyle") '地物はこのidでスタイルを設定する writer.WriteStartElement("Pair") writer.WriteElementString("key", "normal") writer.WriteElementString("styleUrl", "#PolyStyle") '上で記述したスタイルのタグを呼び出し writer.WriteEndElement() 'Pairタグ終わり writer.WriteStartElement("Pair") writer.WriteElementString("key", "highlight") writer.WriteElementString("styleUrl", "#PolyStyle") writer.WriteEndElement() 'Pairタグ終わり writer.WriteEndElement() 'StyleMapタグ終わり 'フォルダの作成 writer.WriteStartElement("Folder") writer.WriteElementString("name", myName) 'ファイル名をフォルダ名に使用 '円のポリゴン writer.WriteStartElement("Placemark") writer.WriteElementString("name", F_地図表示.txt_円の半径.Text & "kmの円") writer.WriteElementString("styleUrl", "#circleStyle") 'スタイルを呼び出し writer.WriteStartElement("Polygon") writer.WriteElementString("tessellate", "3") writer.WriteStartElement("outerBoundaryIs") writer.WriteStartElement("LinearRing") Dim my座標 As String = "" 'リストボックスから、座標のテキストを作成 For i = 0 To F_地図表示.List_円の座標.Items.Count - 1 my座標 = my座標 & F_地図表示.List_円の座標.Items(i) & ",0 " Next writer.WriteElementString("coordinates", my座標) '円ポリゴンを作成 writer.WriteEndElement() 'LinearRingタグ終わり writer.WriteEndElement() 'outerBoundaryIsタグ終わり writer.WriteEndElement() 'Polygonタグ終わり writer.WriteEndElement() 'Placemarkタグ終わり '中心点のアイコン writer.WriteStartElement("Placemark") writer.WriteElementString("name", "中心点") writer.WriteElementString("styleUrl", "#circleStyle") writer.WriteStartElement("Point") writer.WriteElementString("coordinates", F_地図表示.txt_マーカー経度.Text & "," & F_地図表示.txt_マーカー緯度.Text & ",0") '3つめの値は高さ writer.WriteEndElement() 'Pointタグ終わり writer.WriteEndElement() 'Placemarkタグ終わり writer.WriteEndElement() 'Folderタグ終わり writer.WriteEndElement() 'Documentタグ終わり writer.WriteEndElement() 'kmlタグ終わり 'XMLドキュメントの終了 writer.WriteEndDocument() 'xmlファイルの記述終了 'Write the XML to file and close the writer. writer.Flush() 'xmlwriterの終了 writer.Close() 'xmlwriterを閉じる→ファイルが作成される End Sub End Class
上のコードはxmlを1行づつ作成していく方法です。
vb.netで使えるxmlwriterクラスを使用します。
「WriteStartDocument」でxmlの記述を初めて、
「WriteStartElement("****")」でタグを開始します。
「WriteEndElement()」でタグを閉じます。
1行でタグを記載する場合には、「WriteElementString("タグ名", "内容")」と記載します。
タグのはじめにidなどの要素を記述する場合には、
「WriteAttributeString("要素名", "", "内容")」と記載しします。
「WriteStartElement("****")」と「WriteEndElement()」の数が合わないと、
エラーになるので注意してください。
以上で、円のkmlファイルを作成することができます。
kmlのタグの意味などは、Webサイトに沢山情報がありますので、
そちらで確認して下さい。
コードに間違いや不具合があった場合には、コメント欄で教えていただければと思います。
なお、今回のコードのライセンスについては、「CC-BY」としますので、
自由に使用して頂いて構いません。