【配列・Split関数】GoogleMapのKMLファイルを1レコードずつに分割する

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

前回、GoogleMapからダウンロードしたKMLファイルを、Accessにインポートしました。

「coordinates」フィールドにGPSの座標がインポートされました
「coordinates」フィールドにGPSの座標がインポートされました

ところが、インポートされたデータを見ると、 なんと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,0135.11316,34.64303,0(中略)135.12598,34.64442,0135.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.1131834.642710
要素1要素2要素3

まとめると、こんな感じです。

経度緯度標高経度緯度標高中略経度緯度標高経度緯度標高
135.1131834.642710135.1131634.643030135.1259834.644420135.1258534.644410
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
KMLファイルをインポートしたところ
KMLファイルをインポートしたところ

コメントをどうぞ!