GISQGISとOracleで逆ジオコーディング今回は、QGISのPythonコンソールとオラクルを使って逆ジオコーディングをしてみたいと思います。逆ジオコーディングとはWikipediaによるとジオコーディングは、以下のように定義されています。geocoding)は、各種情報に対して、関連する地理座標(典型的には緯度・経度)を付加すること、およびこれに関する技術やソフトウェアをいう。付加された地理座標のことをジオコードと称する。ジオコーディング一般的にジオコーディングは、住所の名称やコードから該当する場所の座標(主に緯度経度)を求めることを指します。一方で、逆ジオコーディングは緯度経度などの座標から住所などの場所情報を求めることを指します。逆ジオコーディングを提供しているサイトを以下にご紹介します。users簡易逆ジオコーディングサービスhttps://www.finds.jp/rgeocode/index.html.ja上記サイトでは、以下のように緯度経度を指定してリクエストすると、https://www.finds.jp/ws/rgeocode.php?XML&lat=35.678813&lon=139.7631761以下のようにXMLなどの形式で該当場所の住所が返却されます。/></rgeocode>まとめると、下図の赤線(地図から住所)が逆ジオコーディング、青線がジオコーディングとなります。ジオコーディングと逆ジオコーディングのイメージ作成するプログラムと使用データ今回は、QGISのPythonコンソールとオラクルを使って逆ジオコーディングを行うプログラムを作成します。イメージは以下となります。図を説明すると、以下のようになります。使用するデータなどは、以下の通りです。cx_oracleプログラムの作成では作成作業に入りましょう。作業手順は以下の通りとなります。1.cx_oracleの導入2.データの確認3.Pythonコンソールの起動4.プログラムの作成5.動作確認1.cx_oracleの導入QGISに同梱されているPython3.7へオラクル接続用のプラグイン(cx_oracle)を導入します。この作業は、ちょっとした注意が必要です。それは、QGIS配下に専用のPython環境が存在しているので、そちらにcx_oracleを導入しなければなりません。Shellを管理者として起動します。Shellが立ち上がったら以下のように作業します。cx-oracle-7.3.0最初のコマンドで、QGISのPythonディレクトリ(以降、%QGIS_PY%)へ移動します。)の下のapps\Python37となります。次に、PATH環境変数に%QGIS_PY%を追加しPyhhonのバージョンがQGIS同梱の3.7であることを確認します。あとは、念のためpipをアップグレードして、cx_oracleをインストールします。今回は、2015年版国勢調査の小地域(町丁・字等別)データを使用します。元データのダウンロード、オラクルへの取り込みと動作確認は、こちらをご確認ください。3.Pythonコンソールの起動まず、QGISを起動してOpenStreetMap(XYZ)を表示します。次に、メニューから[プラグイン]、[Pythonコンソール]を選択し表示されたPythonコンソールから、アイコン”エディタの表示”を押下すると以下の画面となります。(画面右下がPthoonエディタ)Pythonコンソールとエディタが表示された状態4.プログラムの作成Pythonコンソール上に、下記プログラムを打ち込みます。本プログラムのキャンバスからの座標取得部分は下記URLを参考に作成しています。)プログラムの概要を説明します。1~8行目は、必要なモジュールのインポートです。44、45行目がこのスクリプトが起動された時に呼び出されるメイン処理になります。44行目はmapcanvasの取得と自作クリックイベント処理(PrintClickedPoint)のインスタンス生成、45行目が作成したインスタンス(canvas_clicked)をQGISへ登録する処理になります。9~41行目はクリックイベント処理(PrintClickedPointクラス)で、10~12行目はコンストラクタ、14行目以降はクリック時のイベント処理となります。コンストラクタの12行目で、QgsMapToolEmitPointのコンストラクタを再度呼び出し、canvasを自クラスの変数に置き換え(フック)しています。22~37行目でオラクルへの問い合わせを行っています。(この部分はリソースの無駄遣いがありそうですので見直しの余地があります)最後の41行目でQGISの画面(メッセージバー)へ表示しています。最後に動作確認をしましょう。プログラムの起動は、エディタの上部”スクリプトの実行”ボタンを押下します。その状態で、警視庁付近で地図上でマウスクリックすると、以下のようになるはずです。多摩地区も確認してみましょう。日の出町付近の逆ジオ結果まとめここまで、以下を学習しました。QGISにてPythonコンソールの起動キャンバスから取得した座標を任意の座標系へ変換する処理cx_Oracleの導入とPythonコンソールからオラクルへのリクエスト方法GIS構築の実業務では、クリックした座標を起点に処理を組んでいくケースが多いので、今回の座標取得は勉強になりました。※留意点32ビットのQGISではオラクル接続時に下記2種類のエラーが発生しました。ユーザー名/パスワードが無効です。ログオンは拒否されました。解決方法は、以下のURLに示されています。http://www.intellilink.co.jp/article/column/ora-report20180925.html私の環境では、下記2つの手順により解決しましたので、参考にしてください。1.sqlnet.oraへの追記sqlnet.oraに、”SQLNET.ALLOWED_LOGON_VERSION_SERVER=11”を追加し、リスナーの再起動を行います。下記SQLにてPythonからログオンするユーザーのパスワードを変更(再設定)します。technology.MENU。