2018年09月19日

緯度経度付きJpegから緯度経度付きのCSVを作る

QGISのPhoto2Shapeがうまく動かないという時があるようで、いざ使おうとしたときに使えなかったら困りますね。
そこで、Excelで緯度経度付きのJpegファイルを読み込んで、緯度経度付きのCSVファイルを作るExcelファイルを作成しました。
このファイルで、Jpegを保存しているフォルダを指定すると、写真のExif情報を読み込んで一覧を作成します。
その一覧表をCSVに保存します。
作成された緯度経度付きのCSVは、QGISのデリミティッドテキストレイヤで読み込めば、ポイントレイヤが作成されます。
Jpegファイルのフォルダ名、ファイル名も記録されているので、eVisプラグインで写真を表示することも可能です。
もしPhoto2shapeプラグインがうまく動かないというときは活用していただければと思います。


以下、VBAのコードも記録しておきます。
このコードを作成するのに、参考にしたサイトはここです。先人の知恵に感謝します。

Option Explicit

Sub wiaImage()
    'ファイル一覧取得
    Dim D_fileName As String
    Dim D_count As Long
    Dim D_folderName As String
    Dim x As Object 'WIA.ImageFile
    Dim p As Variant
    Dim i As Integer
    Dim D_id As Long

    D_count = 0

    Worksheets("JPEG一覧").Cells.ClearContents  'セルの内容消去

    'フォルダ指定
    MsgBox "位置情報付きのJpegファイルが保存されているフォルダを指定してください。", vbInformation
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            D_folderName = .SelectedItems(1)
        End If
    End With
    'ファイル一覧を取得
    D_fileName = Dir(D_folderName & "\*.jpg")

    '列名を入力
    Worksheets("JPEG一覧").Cells(1, 1) = "FolderName"
    Worksheets("JPEG一覧").Cells(1, 2) = "FileName"

    Do While D_fileName <> ""
        i = 0
        D_count = D_count + 1
        Worksheets("JPEG一覧").Cells(D_count + 1, 1) = D_folderName & "\"  'フォルダ名を記入
        Worksheets("JPEG一覧").Cells(D_count + 1, 2) = D_fileName    'ファイル名を記入

        'exif情報をコピー
        Set x = CreateObject("Wia.ImageFile")
        x.LoadFile D_folderName & "\" & D_fileName

        On Error Resume Next

        'Exif情報を記入
        For Each p In x.Properties
            i = i + 1
            D_id = p.propertyid
            Worksheets("JPEG一覧").Cells(1, i + 2).Value = p.Name  '列名を記入
            If p.propertyid = 2 Or p.propertyid = 4 Then
                Worksheets("JPEG一覧").Cells(D_count + 1, i + 2).Value = getGPS(p)  'GPS情報の場合、度分秒を結合して10進数に変更
            Else
                Worksheets("JPEG一覧").Cells(D_count + 1, i + 2).Value = p.Value
            End If
        Next
        On Error GoTo 0

        Set x = Nothing

        D_fileName = Dir() 'ファイル名をクリア

    Loop

    Worksheets("JPEG一覧").Select

    Call CSV出力

     Worksheets("メイン").Select

End Sub
’==================

Function getGPS(p As Variant) As Double
  getGPS = p.Value(1) + p.Value(2) / 60 + p.Value(3) / 3600
End Function
’==================

Sub CSV出力()

Dim D_ws As Worksheet
Set D_ws = ThisWorkbook.Worksheets(2)

MsgBox "CSVファイルの保存先を指定してください。", vbInformation

Dim D_csvFilepath As String
'ファイル指定ダイアログ
D_csvFilepath = Application.GetSaveAsFilename(Title:="CSVファイルの保存先", Filefilter:="CSVファイル,*.csv")

'CSVファイルを作成
Open D_csvFilepath For Output As #1

Dim gyou As Long
Dim retu As Long
Dim D_Data

'CSVへ書きだし
gyou = 1
Do While D_ws.Cells(gyou, 1).Value <> ""
    retu = 1
    Do While D_ws.Cells(1, retu + 1).Value <> ""
        D_Data = D_ws.Cells(gyou, retu).Value
        Print #1, D_Data & ","; 'データを記入
        retu = retu + 1
    Loop
    Print #1, D_ws.Cells(gyou, retu).Value & vbCrLf; '改行コードを記入
    gyou = gyou + 1
Loop

Close #1

MsgBox "CSVファイルを保存しました。確認してください。"

End Sub

posted by kouichi at 23:43| Comment(0) | QGIS | このブログの読者になる | 更新情報をチェックする

【市町村向け】北海道オープンデータジオデータベースを作りました

都道府県や市町村がオープンデータを作るときに、施設の一覧などには緯度経度をつけると、地図上に位置が表示されるようになり、オープンデータを便利に利用できるようになります。
オープンデータを利用したアプリを作るときにも、位置情報があると、地図と連携しやすくなります。

しかし、オープンデータを作る担当者にしてみたら、地図から緯度経度を取得して、一覧表に記録するのは結構な手間です。
10個くらいならいいですが、それが100個もあると嫌になります。
そのため、面倒くさくて、オープンデータが進まないということもあるかもしれません。

そこで、北海道限定ですが、施設名称から緯度経度を検索できるCSVファイル「北海道施設位置情報データベース」を作成しました。

おもに国土数値情報を利用して施設の位置を作りましたが、すでに公開されている北海道内の市町村のオープンデータも使っています。

緯度経度データの結合は「CSVJOIN」というフリーソフトや、ExcelのVlookup関数、QGISのフィールド結合などで行なえます。

道内市町村のオープンデータ担当者に使っていただき、オープンデータを簡単に公開できるようにしていただければと思います。
道内のオープンデータが更に進めば良いと思います。



posted by kouichi at 00:00| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする