2014年10月05日

[vb.net]地図に円を描くソフトウエアのコード 【その2】

【その1】はこちら  ソフトウエア「Map円Edit」はこちら
 
今回は、円の図形と中心のマーカーを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」としますので、
自由に使用して頂いて構いません。
by.png
posted by kouichi at 23:41| Comment(0) | vb.net | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: