Google MapのKMLファイルをAccessで作る

スポンサーリンク
この記事は約18分で読めます。

前回、GoogleMapのKMLファイルをAccessにインポートする記事を書きましたが、今回はその逆。

GoogleMapがインポートすることができるKMLファイルを、Accessで作ります。

スポンサーリンク

テーブルの準備

使用される際は、そちらの環境で十分テストのうえ使用してください。

今回使用するテーブルは2つ。1つ目は、前回の記事で作成したテーブル「トラック情報」を使用します。

トラック情報テーブルの構造

フィールド名入力するデータデータ型
SEQ通し番号を入力します長整数型
経度緯度を入力します倍精度浮動小数点数型
緯度経度を入力します倍精度浮動小数点数型
標高標高を入力します倍精度浮動小数点数型

トラック情報テーブルの値

神戸市須磨区にある、JR須磨駅から須磨海浜水族園までのルートです。コピペして「トラック情報テーブル」に貼り付けてください。

SEQ経度緯度標高
1135.1131834.642710
2135.1131634.643030
3135.1131534.643140
4135.1131434.643320
5135.1133234.643350
6135.113534.643380
7135.1137834.643430
8135.1141534.64350
9135.1144234.643550
10135.1145934.643580
11135.1147834.643590
12135.1151734.643630
13135.1152534.643630
14135.1153734.643640
15135.1160234.643680
16135.1163634.64370
17135.1166434.643720
18135.1170534.643750
19135.1175634.643780
20135.1176234.643780
21135.1182834.643830
22135.1186334.643850
23135.1187434.643890
24135.1187634.64390
25135.1188634.64390
26135.1188534.643960
27135.1188534.643970
28135.119134.643990
29135.1197134.644040
30135.1199134.644050
31135.120334.644080
32135.1204434.644080
33135.1204734.644080
34135.1204934.644080
35135.120534.644090
36135.1207434.644190
37135.1208534.644230
38135.1209634.644280
39135.1211234.644340
40135.1214634.644480
41135.121534.64450
42135.1215534.644530
43135.121634.644560
44135.1216534.644590
45135.1217634.644660
46135.1218334.64470
47135.1219534.644750
48135.1220634.644810
49135.1222534.644910
50135.1223334.644940
51135.1223934.644980
52135.1225134.645050
53135.1226734.645150
54135.1236734.645750
55135.123834.645830
56135.1239734.645930
57135.1243934.646190
58135.1245734.646290
59135.1246334.646230
60135.1247134.646150
61135.1247834.646080
62135.1248234.646040
63135.1248534.646010
64135.1249234.645940
65135.1249934.645870
66135.1251234.645730
67135.1252134.645630
68135.1252634.645590
69135.125534.645340
70135.125834.645030
71135.1258934.644940
72135.1262334.644580
73135.1261934.644520
74135.1261534.644480
75135.1261334.644460
76135.126134.644420
77135.1260734.644420
78135.1259834.644420
79135.1258534.644410

kml出力用テーブルの構造

もう一つは、KMLファイルを出力するためのテーブル「kml出力用」です。

フィールド名入力するデータデータ型
SEQ通し番号を入力します長整数型
DATAKMLファイルに出力するデータを入力します長い文字列
スポンサーリンク

KMLファイルの構造

VBAのコーディングに入る前に、KMLファイルの構造を確認しておきます。

今回作成するKMLファイルは、GoogleMapに読み込ませるために必要最低限の項目に限っています。

ただし、ここの情報は、なにかしらの資料を読んだわけではありません。

GoogleMapから出力したKMLファイルの要らなさそうなところを削除してKMLファイルを試作して、それを実際にGoogleMapに読み込ませ、読み込むことができるかどうかで判断したものです。

KMLファイルの構造(最低限必要なもの)

<?xmlversion="1.0"encoding="UTF-8"?>
<kmlxmlns="http://www.opengis.net/kml/2.2">
    <Document>
        <name>ファイルのタイトルを入力;</name>
        <Placemark>
            <name>ルートの名前を入力</name>
            <description>ルートの説明を入力<description>
            <styleUrl></styleUrl>
            <LineString>
                <tessellate>1</tessellate>
                <coordinates>
                ↑
                この間に経度、緯度、標高を入力する
                ↓
                </coordinates>
            </LineString>
        </Placemark>
    </Document>
</kml>
スポンサーリンク

VBAのコード

Sub exportKML()

If MsgBox("実行します。よろしいか?", vbQuestion + vbYesNo + vbDefaultButton2) = vbNo Then Exit Sub

Dim db As DAO.Database
Dim strSQL As String
Dim rst As DAO.Recordset
Dim Lpcnt As Long 'ループカウンター

Dim strTgTfldNM As String '出力先フォルダ名
Dim strTgTfleNM As String '出力先ファイル名

Dim obj_AdoSt As Object 'ADOファイルストリームを使用してテキストを出力する

Set db = CurrentDb

'KML変換用データをいったん出力するテーブル「kml出力用」の全レコードを削除
db.Execute "delete * from kml出力用"


'ヘッダー部分出力
db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "?>')"
Lpcnt = Lpcnt + 1

db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'<kml xmlns=" & Chr(34) & "http://www.opengis.net/kml/2.2" & Chr(34) & ">')"
Lpcnt = Lpcnt + 1

db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'  <Document>')"
Lpcnt = Lpcnt + 1

'ファイルの名前を出力
db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'    <name>waq3kml</name>')"
Lpcnt = Lpcnt + 1


'ルートの情報部分を出力
db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'    <Placemark>')"
Lpcnt = Lpcnt + 1

'ルートの名前を出力
db.Execute "INSERT INTO kml出力用 ( SEQ, DATA ) SELECT " & Lpcnt & " AS 式1, '      <name><![CDATA[ここにルート名を入力してください]]></name>' AS 式2 "
Lpcnt = Lpcnt + 1

'ルートの説明を入力
db.Execute "INSERT INTO kml出力用 ( SEQ, DATA ) SELECT " & Lpcnt & " AS 式1, '      <description><![CDATA[ここにルートの説明を入力してください]]></description>' AS 式2 "
Lpcnt = Lpcnt + 1

db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'      <styleUrl></styleUrl>')"
Lpcnt = Lpcnt + 1

'ルートの位置情報を出力
db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'      <LineString>')"
Lpcnt = Lpcnt + 1

db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'        <tessellate>1</tessellate>')"
Lpcnt = Lpcnt + 1

strSQL = "select * from トラック情報 order by SEQ"
Set rst = db.OpenRecordset(strSQL)

db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'        <coordinates>')"
Lpcnt = Lpcnt + 1

If rst.RecordCount <> 0 Then

    Do
        db.Execute "insert into kml出力用 ( SEQ, DATA ) values(" & Lpcnt & ",'          " & rst!経度 & "," & rst!緯度 & "," & rst!標高 & "')"
        rst.MoveNext
        Lpcnt = Lpcnt + 1
    Loop Until rst.EOF = True
End If
rst.Close

db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'        </coordinates>')"
Lpcnt = Lpcnt + 1

db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'      </LineString>')"
Lpcnt = Lpcnt + 1

db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'    </Placemark>')"
Lpcnt = Lpcnt + 1


'フッター出力
db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'  </Document>')"
db.Execute "insert into kml出力用(SEQ,DATA) values(" & Lpcnt & ",'</kml>')"


'KMLファイル出力
strTgTfldNM = CurrentProject.Path  '出力先はこのAccessファイルのあるフォルダ
strTgTfleNM = "waq3.kml"

'ターゲットフォルダ内のkmlファイルの有無をチェック
If Dir(strTgTfldNM & "\" & strTgTfleNM) <> "" Then

    MsgBox "同名のファイルがあります", vbCritical
    
    '出力先のフォルダを開く
    Application.FollowHyperlink strTgTfldNM
    Exit Sub
End If


'KMLファイル出力
'上書きモードでファイルをオープン
Set obj_AdoSt = CreateObject("ADODB.Stream")

' 文字コードを指定(KMLファイルはUTF-8を使用するルール)
obj_AdoSt.Charset = "UTF-8"

' 改行コードを指定
obj_AdoSt.LineSeparator = -1

' オープン
obj_AdoSt.Open

strSQL = "select * from kml出力用 order by SEQ"

Set rst = db.OpenRecordset(strSQL)

If rst.RecordCount <> 0 Then
    Do
        obj_AdoSt.WriteText rst!Data, 1
        rst.MoveNext
    Loop Until rst.EOF = True
End If
rst.Close

'KMLファイルの保存
obj_AdoSt.SaveToFile strTgTfldNM & "\" & strTgTfleNM, 2
obj_AdoSt.Close

MsgBox "処理終了", vbInformation
End Sub

コード内のコメントにもありますが、KMLファイルはUTF-8という文字コードで保存するルールですので、注意しましょう。

スポンサーリンク

出来上がったKMLファイル

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <name>waq3kml</name>
    <Placemark>
      <name><![CDATA[ここにルート名を入力してください]]></name>
      <description><![CDATA[ここにルートの説明を入力してください]]></description>
      <styleUrl></styleUrl>
      <LineString>
        <tessellate>1</tessellate>
        <coordinates>
          135.11318,34.64271,0
          135.11316,34.64303,0
          135.11315,34.64314,0
          135.11314,34.64332,0
          135.11332,34.64335,0
          135.1135,34.64338,0
          135.11378,34.64343,0
          135.11415,34.6435,0
          135.11442,34.64355,0
          135.11459,34.64358,0
          135.11478,34.64359,0
          135.11517,34.64363,0
          135.11525,34.64363,0
          135.11537,34.64364,0
          135.11602,34.64368,0
          135.11636,34.6437,0
          135.11664,34.64372,0
          135.11705,34.64375,0
          135.11756,34.64378,0
          135.11762,34.64378,0
          135.11828,34.64383,0
          135.11863,34.64385,0
          135.11874,34.64389,0
          135.11876,34.6439,0
          135.11886,34.6439,0
          135.11885,34.64396,0
          135.11885,34.64397,0
          135.1191,34.64399,0
          135.11971,34.64404,0
          135.11991,34.64405,0
          135.1203,34.64408,0
          135.12044,34.64408,0
          135.12047,34.64408,0
          135.12049,34.64408,0
          135.1205,34.64409,0
          135.12074,34.64419,0
          135.12085,34.64423,0
          135.12096,34.64428,0
          135.12112,34.64434,0
          135.12146,34.64448,0
          135.1215,34.6445,0
          135.12155,34.64453,0
          135.1216,34.64456,0
          135.12165,34.64459,0
          135.12176,34.64466,0
          135.12183,34.6447,0
          135.12195,34.64475,0
          135.12206,34.64481,0
          135.12225,34.64491,0
          135.12233,34.64494,0
          135.12239,34.64498,0
          135.12251,34.64505,0
          135.12267,34.64515,0
          135.12367,34.64575,0
          135.1238,34.64583,0
          135.12397,34.64593,0
          135.12439,34.64619,0
          135.12457,34.64629,0
          135.12463,34.64623,0
          135.12471,34.64615,0
          135.12478,34.64608,0
          135.12482,34.64604,0
          135.12485,34.64601,0
          135.12492,34.64594,0
          135.12499,34.64587,0
          135.12512,34.64573,0
          135.12521,34.64563,0
          135.12526,34.64559,0
          135.1255,34.64534,0
          135.1258,34.64503,0
          135.12589,34.64494,0
          135.12623,34.64458,0
          135.12619,34.64452,0
          135.12615,34.64448,0
          135.12613,34.64446,0
          135.1261,34.64442,0
          135.12607,34.64442,0
          135.12598,34.64442,0
          135.12585,34.64441,0
        </coordinates>
      </LineString>
    </Placemark>
  </Document>
</kml>

このコードを実行すると、Accessを保存しているフォルダ内に、waq3.kmlというファイルができます。

あとは、このファイルをGoogleMapに読み込ませればOKです。試してみてください!

そうそう、ごっつい細い黒線でルートが表示されますので、見落とさないように注意してください。

コメントをどうぞ!

タイトルとURLをコピーしました