前回、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です。試してみてください!
そうそう、ごっつい細い黒線でルートが表示されますので、見落とさないように注意してください。
コメントをどうぞ!