前回、GoogleMapのKMLファイルをAccessにインポートする記事を書きましたが、今回はその逆。
GoogleMapがインポートすることができるKMLファイルを、Accessで作ります。
テーブルの準備
今回使用するテーブルは2つ。1つ目は、前回の記事で作成したテーブル「トラック情報」を使用します。
トラック情報テーブルの構造
| フィールド名 | 入力するデータ | データ型 |
|---|---|---|
| SEQ | 通し番号を入力します | 長整数型 |
| 経度 | 緯度を入力します | 倍精度浮動小数点数型 |
| 緯度 | 経度を入力します | 倍精度浮動小数点数型 |
| 標高 | 標高を入力します | 倍精度浮動小数点数型 |
トラック情報テーブルの値
神戸市須磨区にある、JR須磨駅から須磨海浜水族園までのルートです。コピペして「トラック情報テーブル」に貼り付けてください。
| SEQ | 経度 | 緯度 | 標高 |
|---|---|---|---|
| 1 | 135.11318 | 34.64271 | 0 |
| 2 | 135.11316 | 34.64303 | 0 |
| 3 | 135.11315 | 34.64314 | 0 |
| 4 | 135.11314 | 34.64332 | 0 |
| 5 | 135.11332 | 34.64335 | 0 |
| 6 | 135.1135 | 34.64338 | 0 |
| 7 | 135.11378 | 34.64343 | 0 |
| 8 | 135.11415 | 34.6435 | 0 |
| 9 | 135.11442 | 34.64355 | 0 |
| 10 | 135.11459 | 34.64358 | 0 |
| 11 | 135.11478 | 34.64359 | 0 |
| 12 | 135.11517 | 34.64363 | 0 |
| 13 | 135.11525 | 34.64363 | 0 |
| 14 | 135.11537 | 34.64364 | 0 |
| 15 | 135.11602 | 34.64368 | 0 |
| 16 | 135.11636 | 34.6437 | 0 |
| 17 | 135.11664 | 34.64372 | 0 |
| 18 | 135.11705 | 34.64375 | 0 |
| 19 | 135.11756 | 34.64378 | 0 |
| 20 | 135.11762 | 34.64378 | 0 |
| 21 | 135.11828 | 34.64383 | 0 |
| 22 | 135.11863 | 34.64385 | 0 |
| 23 | 135.11874 | 34.64389 | 0 |
| 24 | 135.11876 | 34.6439 | 0 |
| 25 | 135.11886 | 34.6439 | 0 |
| 26 | 135.11885 | 34.64396 | 0 |
| 27 | 135.11885 | 34.64397 | 0 |
| 28 | 135.1191 | 34.64399 | 0 |
| 29 | 135.11971 | 34.64404 | 0 |
| 30 | 135.11991 | 34.64405 | 0 |
| 31 | 135.1203 | 34.64408 | 0 |
| 32 | 135.12044 | 34.64408 | 0 |
| 33 | 135.12047 | 34.64408 | 0 |
| 34 | 135.12049 | 34.64408 | 0 |
| 35 | 135.1205 | 34.64409 | 0 |
| 36 | 135.12074 | 34.64419 | 0 |
| 37 | 135.12085 | 34.64423 | 0 |
| 38 | 135.12096 | 34.64428 | 0 |
| 39 | 135.12112 | 34.64434 | 0 |
| 40 | 135.12146 | 34.64448 | 0 |
| 41 | 135.1215 | 34.6445 | 0 |
| 42 | 135.12155 | 34.64453 | 0 |
| 43 | 135.1216 | 34.64456 | 0 |
| 44 | 135.12165 | 34.64459 | 0 |
| 45 | 135.12176 | 34.64466 | 0 |
| 46 | 135.12183 | 34.6447 | 0 |
| 47 | 135.12195 | 34.64475 | 0 |
| 48 | 135.12206 | 34.64481 | 0 |
| 49 | 135.12225 | 34.64491 | 0 |
| 50 | 135.12233 | 34.64494 | 0 |
| 51 | 135.12239 | 34.64498 | 0 |
| 52 | 135.12251 | 34.64505 | 0 |
| 53 | 135.12267 | 34.64515 | 0 |
| 54 | 135.12367 | 34.64575 | 0 |
| 55 | 135.1238 | 34.64583 | 0 |
| 56 | 135.12397 | 34.64593 | 0 |
| 57 | 135.12439 | 34.64619 | 0 |
| 58 | 135.12457 | 34.64629 | 0 |
| 59 | 135.12463 | 34.64623 | 0 |
| 60 | 135.12471 | 34.64615 | 0 |
| 61 | 135.12478 | 34.64608 | 0 |
| 62 | 135.12482 | 34.64604 | 0 |
| 63 | 135.12485 | 34.64601 | 0 |
| 64 | 135.12492 | 34.64594 | 0 |
| 65 | 135.12499 | 34.64587 | 0 |
| 66 | 135.12512 | 34.64573 | 0 |
| 67 | 135.12521 | 34.64563 | 0 |
| 68 | 135.12526 | 34.64559 | 0 |
| 69 | 135.1255 | 34.64534 | 0 |
| 70 | 135.1258 | 34.64503 | 0 |
| 71 | 135.12589 | 34.64494 | 0 |
| 72 | 135.12623 | 34.64458 | 0 |
| 73 | 135.12619 | 34.64452 | 0 |
| 74 | 135.12615 | 34.64448 | 0 |
| 75 | 135.12613 | 34.64446 | 0 |
| 76 | 135.1261 | 34.64442 | 0 |
| 77 | 135.12607 | 34.64442 | 0 |
| 78 | 135.12598 | 34.64442 | 0 |
| 79 | 135.12585 | 34.64441 | 0 |
kml出力用テーブルの構造
もう一つは、KMLファイルを出力するためのテーブル「kml出力用」です。
| フィールド名 | 入力するデータ | データ型 |
|---|---|---|
| SEQ | 通し番号を入力します | 長整数型 |
| DATA | KMLファイルに出力するデータを入力します | 長い文字列 |
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です。試してみてください!
そうそう、ごっつい細い黒線でルートが表示されますので、見落とさないように注意してください。



コメントをどうぞ!