前回、GoogleMapからダウンロードしたKMLファイルを、Accessにインポートしました。
ところが、インポートされたデータを見ると、 なんと1レコードにすべての座標がぶっこまれてしまいました。
今日は、「配列」を使って1行を1レコードに分割してみます。
トラック情報テーブル作成
1レコードずつに分割したレコードを保存するテーブル「トラック情報」を作成します。
フィールド名 | 入力するデータ |
---|---|
SEQ | 通し番号を入力します |
経度 | 緯度を入力します |
緯度 | 経度を入力します |
標高 | 標高を入力します |
変換するVBAコード
続いて、標準モジュールに次のコードを貼り付けてください。
Sub convert_coordinates() 'LineStringテーブルのcoordinatesフィールドをトラック情報テーブルへ Dim db As DAO.Database Dim strSQL As String Dim rst As DAO.Recordset Dim hairetu1() As String '配列を格納する変数 Dim hairetu2() As String '配列を格納する変数 Dim youso As Variant '配列を構成する要素(バリアント型) Dim Lpcnt As Long 'ループカウンター 'レコードセットを作成 Set db = CurrentDb strSQL = "select * from LineString" Set rst = db.OpenRecordset(strSQL) If rst.RecordCount <> 0 Then '取得したデータを改行コードで分割して1つの要素にし、それらを並べた配列を変数に格納する hairetu1() = Split(rst!coordinates, vbCrLf) 'ループカウンターをリセット Lpcnt = 1 'For Each構文を使って、配列を構成する要素を列挙する For Each youso In hairetu1() 'カンマの含まれない要素は処理を行わない(エラーになる) If youso Like "*,*" Then '取得したデータをカンマで分割して1つの要素にし、それらを並べた配列を変数に格納する hairetu2() = Split(youso, ",") 'トラック情報テーブルに1行ずつ追加する strSQL = "insert into トラック情報(SEQ,経度,緯度,標高) " & _ "values(" & Lpcnt & "," & hairetu2(0) & "," & hairetu2(1) & "," & hairetu2(2) & ")" db.Execute strSQL 'ループカウンターを加算 Lpcnt = Lpcnt + 1 End If Next youso End If rst.Close End Sub
解説です
「coordinates」フィールドは、以下の通り値が保存されています。
(改行コード) 135.11318,34.64271,0(改行コード)135.11316,34.64303,0(改行コード)(中略)135.12598,34.64442,0(改行コード)135.12585,34.64441,0(改行コード) (改行コード) |
1行目と最終行は改行のみの行、他の行は、カンマ区切りで経度、緯度、標高となっています。
VBAコードの23行目、
hairetu1() = Split(rst!coordinates, vbCrLf)
で、フィールドの内容を取得し、Split関数で、改行コード( vbCrLf )で区切ります。
すると、変数 hairetu1() には、次のように値が格納されます。
135.11318,34.64271,0 | 135.11316,34.64303,0 | (中略) | 135.12598,34.64442,0 | 135.12585,34.64441,0 | ||
hairetu1(要素0) | hairetu1(要素1) | hairetu1(要素2) | hairetu1(要素78) | hairetu1(要素79) | hairetu1(要素80) |
それぞれの要素に格納されているデータを取得するには、変数 hairetu1() のカッコ内に要素の番号を指定します。この番号は0から始まることに注意してください。
要素1を指定するときは、hairetu1(1) と指定します。
さらに VBAコードの 35行目、
hairetu2() = Split(youso, ",")
hairetu1() の各要素を変数 youso に代入します。
youso に代入されたデータは、カンマで区切られていますから、Split関数を使い、カンマで区切ります。
135.11318 | 34.64271 | 0 |
要素1 | 要素2 | 要素3 |
まとめると、こんな感じです。
経度 | 緯度 | 標高 | 経度 | 緯度 | 標高 | 中略 | 経度 | 緯度 | 標高 | 経度 | 緯度 | 標高 |
135.11318 | 34.64271 | 0 | 135.11316 | 34.64303 | 0 | 135.12598 | 34.64442 | 0 | 135.12585 | 34.64441 | 0 | |
hairetu2(要素1) | hairetu2(要素2) | hairetu2(要素3) | hairetu2(要素1) | hairetu2(要素2) | hairetu2(要素3) | hairetu2(要素1) | hairetu2(要素2) | hairetu2(要素3) | hairetu2(要素1) | hairetu2(要素2) | hairetu2(要素3) | |
hairetu1(要素1) | hairetu1(要素1) | hairetu1(要素1) | hairetu1(要素1) |
あとは、SQL文を組み立てて、トラック情報テーブルに追加すればOKです。
'トラック情報テーブルに1行ずつ追加する strSQL = "insert into トラック情報(SEQ,経度,緯度,標高) " & _ "values(" & Lpcnt & "," & hairetu2(0) & "," & hairetu2(1) & "," & hairetu2(2) & ")" db.Execute strSQL
コメントをどうぞ!