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 | このブログの読者になる | 更新情報をチェックする

2017年12月17日

QGIS3からはGeopackageが使いやすいぞ!脱シェープファイル!

この記事は、FOSS4G Adventカレンダー2017に参加した記事です。

 2017年の12月中にQGIS3.0がリリースされるという噂があり、毎日のようにQGISのオフィシャルホームページをチェックしていますが、2017年12月17日現在ではまだリリースされていません。12月中にリリースされれば、年末年始はサワサワ触りまくってやるのにと思っていましたが・・・。

 そこで、予行演習も兼ねて、OSGeo4wで利用できる開発版の2.99(内容はほぼ3.0と同じと思われる)を最近触ってみています。

(これ以降はQGIS2.99をQGIS3.0として書いていきます。)


QGIS3ではGeopackageがデフォルトになる?


 ファイルの入出力や、プロセッシングツールなどを見ていると、いままでは、シェープファイルがデフォルトになっていましたが、QGIS3.0ではGeopackageがデフォルトになっています。

 ここからわかるように、QGISもやっと脱シェープファイルを考えているのだと思われます(多分ですよ、多分)。

 昨年のFOSS4G AdventカレンダーでもGeopackageの記事がありましたが、QGIS2ではまだまだ使える状況ではありませんでした。

 QGIS3からは、GeopackageをQGISのデフォルトのファイル形式としましょうということなのでしょう。



Geopackageってなに?


 Geopackageとは、「オープンで標準に準拠したプラットフォームに依存しない、移植性の高い自己記述型のコンパクトなフォーマット」ということで、SQliteデータベースに様々なGISデータを格納できるファイルです。私自身はSpatialiteとどこが違うのかはよくわかっていませんが、Geopackageは、ベクタデータはもちろん、ラスタや、Mbtilesなどさまざまなデータを格納でき、ひとつのファイルにすることができます。

 ArcGISでもArcGIS10.2.2からGeopackageをサポートしているとのことです。QGISで作成したものがArcGISで利用できるかは不明ですが、多分大丈夫なような気がします。



Geopackageにデータを追加する


 QGIS3では、ブラウザパネルのGeopackageファイルにレイヤパネルからレイヤをドラッグ&ドロップするだけで、Geopackageにデータを追加できます。(Geopackageファイルのパスに2バイト文字が含まれるとエラーになります)

 ラスタレイヤもドラッグ&ドロップで追加することができます。

01.png


 レイヤを名前をつけて保存することでもGeopackageにデータを保存できます。

(名前をつけて保存したレイヤは、ブラウザパネルの「Geopackage」で表示されない場合があるようです)

02.png


 Geopackageファイルには、様々なGISデータを格納できるので、地図を作るためのファイルの数を非常にコンパクトにすることができます。

 今まではシェープファイルやラスタファイルを複数使って地図を作った場合、数十個のファイルを必要としていましたが、Geopackageでは一つでいいのです。

 ファイルサイズ自体はそれほど変わらないと思いますが、ファイル数が少なくなるのはいいことです。

03.png



Geopackageにはレイヤスタイルも保存できる


 Geopackageには、レイヤスタイルを保存することができます。Geopackageから追加したレイヤのレイヤプロパティを表示して「シンボロジー」の「スタイル」ボタン→「スタイルを保存」に「データベースに保存(Geopackage)」があります。

04.png


 ここでスタイルをGeopackageファイルの保存すると、そのレイヤのデフォルトのスタイルとして登録することもできます。

QGIS2.99では、スタイルを保存するとQGISが落ちますが、保存はされているようです)



まとめ


 QGIS2までは、シェープファイルがデフォルトのようだったので利用していましたが、フィールド名の文字数の縛りや、文字コードの問題、ファイルの数が多いなどいろいろな問題がありました。これが今後はGeopackageで解決していけば、非常に良いことだと思います。

 シェープファイルには、安室奈美恵と一緒に引退していただき、新たな世代にその座を譲っていただきましょう。

 QGIS2.99では日本語だとうまく行かなかったり、Geopackageにラスタを追加すると、削除できなかったりするようなので、もうすこし熟成が必要かもしれませんが、今後さらに進化していくことが楽しみです。



ラベル:QGIS
posted by kouichi at 15:08| Comment(4) | QGIS | このブログの読者になる | 更新情報をチェックする

2017年08月27日

QGISでルートの最短距離を算出する  Routes and Zonesプラグイン

はじめに


 自治体のインターネット切り離しによって、GoogleMapYahoo地図などが使いづらくなっています。

 以前までは工事の設計などで運搬距離を算出するために、インターネットの地図サービスで経路検索を行っていましたが、いまは使えないことはないのですが、インターネットの接続に時間がかかったり、接続時間に制限があったりして、使いづらくなっています。

 オフラインで経路検索できないか、いろいろ探すと、QGISRoutes and Zonesプラグインが便利でしたので紹介します。

 QGISにはコアプラグインで「道路グラフプラグイン」という経路検索できるプラグインがありますが、「Routes and Zones」プラグインのほうが高速に、複数の経路検索ができるので便利でした。


2017_08_26_09.png




準備するもの


 Routes and Zonesプラグインを利用するには、次のものを準備する必要があります。


・道路などのラインデータ

 座標参照系はWGS84EPSG:4326)にします。OpenStreetMapなどの道路ラインデータを使って作成します。OpenStreetMapのデータは「bbbike.org」などでダウンロードできます。OpenStreetMapのデータには、歩道や自転車道などの車の通れない道路(bridlewaycyclewayfootwayなど)も記録されていますので、事前に削除しておきましょう。また、高速道路(motorwayを使わないでルート検索をする場合には、高速道路も削除しておくといいでしょう。


・出発点と目的地のポイントデータ

 座標参照系をWGS84EPSG:4326)にします。シェープファイルなどで新規に作ります。「IDフィールド(数値)」と「Nameフィールド(テキスト)」が必要です。
 ただし、出発地と目的地はデリミティッドテキストレイヤだと計算されませんので、シェープファイルに変換してください。


Routes and Zonesプラグイン

Routes and Zonesプラグインは「実験的なプラグイン」です。

 メニュー「プラグイン」→「プラグインの管理とインストール」の「設定」を選択し、「実験的プラグインも表示する」にチェックを付けてから、検索すると一覧に表示されるので、インストールします。




プラグインフォルダから必要なファイルをコピー


 経路検索をするためのプロジェクトファイルを作成します。そのために、データを一つのフォルダに保存します。

Routes and Zonesを利用するには、計算した結果を保存するためのレイヤが必要ですが、そのレイヤファイルは、プラグインをインストールしたフォルダにサンプルとして保存されています。

 通常は、「C:\Users\【ユーザー名】\.qgis2\python\plugins\raz\sample-data」に保存されています。サンプルデータのフォルダ内のraz data.sqliteをコピーして、経路検索のためのフォルダに保存します。

2017_08_26_02.png


 また、「道路ラインデータ」「出発点ポイントデータ」「目的地ポイントデータ」も同じフォルダに保存します。




レイヤを追加する


 経路検索プロジェクトにレイヤを追加します。道路ラインデータと出発点、目的地データは「ベクタレイヤの追加」でプロジェクトに追加します。

raz data.sqliteにはルート(Route)と検索用のデータベース(verylong)が格納されています。この2つのレイヤを次の手順でプロジェクトに追加します。


  • Spatialiteレイヤの追加」を選択し、「新規」ボタンをクリックします。
  • raz data.sqlite」を選択し、「接続」ボタンをクリックします。
    2017_08_26_04.png
  • 「ジオメトリを持たないテーブルもリストする」にチェックを付けます。
  • リストの中から「route」と「verylong」を選択して、「追加」ボタンをクリックします。(複数選択する場合は、CTRLキーを押しながら選択)
    2017_08_26_05.png

レイヤの追加に成功すると、下図のようになります。

2017_08_26_06.png




プロジェクトの座標系を投影座標系にする


 ※2017年12月10日追記
 レイヤの座標系をすべて同じにしておく必要がありますが、レイヤの座標系は地理座標系でも投影座標系でも構いません。
 しかし、プロジェクトの座標系は投影座標系でなければ、正しく距離が計算されないようです。
 プロジェクトの座標系が地理座標系の場合、オンザフライCRS変換を有効にして、プロジェクトの座標系(CRS)を平面直角座標系などの投影座標系に変更してください。



出発点と目的地を作図する


 出発点レイヤと、目的地レイヤに距離を計算したいポイントを作図します。地物を追加するときに、「ID」と「Name」フィールドにデータを入力しておきます。




Routeレイヤにもともとある地物を削除する


Routeレイヤには、サンプル用に記録されている地物があるので、事前に削除しておくといいです。




Routes and Zonesプラグインを実行する


 メニュー「プラグイン」→「Routes and zones calculate tool」→「Route calculate tool」を選択します。

2017_08_26_07.png


 「Layer source(from points)」には出発点ポイントを選択します。「ID field」にはIDフィールド、「Name field」にはNameフィールドを選択します。

 「Layer target(from points)」には目的地ポイントを選択します。「ID field」にはIDフィールド、「Name field」にはNameフィールドを選択します。

 出発地と目的地は、事前に選択した地物のみを対象にすることもできます。その際は「Only selected points」にチェックを付けます。

 「Map layer road network」には道路ラインレイヤを選択します。

 「Maximum route length(kilometers)」には、ルートを計算する最大距離を入力します。例えば100kmと入力すると、100kmまでの範囲にある目的地を検索します。

 「Map layer for calculated routes」には、routeレイヤを選択します。

 「Table routes,longer maximun」にverylongレイヤを選択します。

2017_08_26_08.png


 「Run」ボタンをクリックすると、出発点から目的地までの最短ルートを検索し、Routeレイヤに作図します。

2017_08_26_09.png


routeレイヤの属性データを確認すると、出発点と目的地の名前と距離(pathフィールド)が記録されています。


2017_08_26_10.png




まとめ


QGISのコアプラグインである道路グラフプラグインは、道路ラインの地物が多いとエラーになることも多いですが、Routes and Zonesプラグインは、道路レイヤの地物数が多くても、高速で検索を行うことができます。

 インターネット地図であるGoogleMapYahoo地図でもルート検索ができますが、いちいち地点を選択しなければならない手間もありますし、地図の利用規約により、印刷して仕事で利用できない場合もあります。

 そのような場合には、OpenStreetMapなどのデータを使った地図を使うと自由に利用することもできます。

 便利なプラグインですので、利用してみてください。



注:32bitのOSだと、道路レイヤの地物数が多いとクラッシュダンプする場合があるようです。

 その場合は、道路の地物数を減らして、再度実行してみてください。



2018年2月18日追記

職場で説明用に作ったスライドを公開しています。参考までに。



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