Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GeoDjango ORMと地理空間データの世界

abe ryohei
October 16, 2022

GeoDjango ORMと地理空間データの世界

PyCon JP 2022 発表資料 https://2022.pycon.jp/timetable?id=J9XNYA

abe ryohei

October 16, 2022
Tweet

Other Decks in Programming

Transcript

  1. ©Project PLATEAU / MLIT Japan 阿部 涼平 自己紹介 ABE Ryohei

    @selfsryo Backend engineer バックエンド担当 2021年2月からMIERUNE 北海道出身 https://selfs-ryo.com/
  2. © 地理院地図 全国最新写真(シームレス) Python MIERUNEのソリューション QGIS DEM 点群 3D MapTiler

    PLATEAU オープンソース 位置情報 可視化 標高断面図 住所検索 ルート検索 気象データ GTFS LiDAR FOSS4G OSGeo OpenStreetMap MapLible deck.gl Cesium Mapbox OpenLayers Turf.js Geoserver OpenMapTiles GeoDjango Amazon Location Service AWS Leaflet
  3. ©OpenStreetMap contributors 概要 • この題材を選んだ理由やきっかけ ◦ GISへのニーズの高まりを受けて、PyConで以下を紹介 ▪ GISデータをDjangoで扱うことができること ▪

    DjangoのORMを用いてGISデータの演算ができること • このセッションで話すこと ◦ GeoDjangoについて ◦ GeoDjangoが持つORMについて
  4. ©Project PLATEAU / MLIT Japan • 言わずと知れた Python製 Webフレームワーク •

    色々な機能が備わっている GISとDjangoについて Djangoとは
  5. ©Project PLATEAU / MLIT Japan GISとDjangoについて Djangoとは • 言わずと知れた Python製

    Webフレームワーク • 色々な機能が備わっている GISデータを扱える・・?
  6. ©Project PLATEAU / MLIT Japan GISとDjangoについて GeoDjangoとは • Djangoが持つ GIS

    Webフレームワーク用ライブラリ • サードパーティではなく公式 https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/
  7. ©Project PLATEAU / MLIT Japan GISとDjangoについて • 公式(日本語ページ)の紹介文によると・・・ GeoDjango は世界規模の地理情報

    Web フレームワークを目指していま す。 GeoDjango の目的は、地理情報システム (GIS) のWeb アプリケー ションの開発をより簡単にし、空間データ (spatially enabled data) を活用 することにあります。 GeoDjangoとは 出典 https://docs.djangoproject.com/ja/4.1/#geographic-framework
  8. ©Project PLATEAU / MLIT Japan GISとDjangoについて • ベクタデータ ◦ ポイント(点)

    ◦ ライン(線) ◦ ポリゴン(面) • ラスタデータ(画像データ) GISで扱うデータ ポリゴン ポイント ライン ラスタ
  9. ©Project PLATEAU / MLIT Japan GISとDjangoについて • ベクタデータ ◦ ポイント(点)

    ◦ ライン(線) ◦ ポリゴン(面) • ラスタデータ(画像データ) GISで扱うデータ ポリゴン ポイント ライン ラスタ
  10. ©Project PLATEAU / MLIT Japan GISとDjangoについて GeoDjangoのフィールド • モデルに以下のようなフィールドが追加される(ジオメトリフィールド) ◦

    PointField ◦ LineStringField ◦ PolygonField etc. ※ジオメトリフィールドは、型(ポイント?ポリゴン?etc.)と位置情報と座標系を持つ
  11. ©Project PLATEAU / MLIT Japan PostGISとは • PostgreSQLの拡張モジュール ◦ GISデータを扱うためのモジュール

    ◦ オープンソース ◦ ジオメトリ型が追加 ◦ 空間演算用の関数が追加(空間関数) PostGISと空間関数 http://www.refractions.net/products/postgis/ http://www.postgis.net/
  12. ©Project PLATEAU / MLIT Japan 空間関数の例 • ST_Contains(geomA, geomB) ◦

    BがAに含まれる場合True PostGISと空間関数 A B True B A False https://aginfo.cgk.affrc.go.jp/docs/pgisman/3.3.0/postgis-ja.html#ST_Contains
  13. ©Project PLATEAU / MLIT Japan 空間関数の例 PostGISと空間関数 A B True

    B A False • ST_Intersects(geomA, geomB) ◦ AとBに共通部分が存在する場合True https://aginfo.cgk.affrc.go.jp/docs/pgisman/3.3.0/postgis-ja.html#ST_Intersects
  14. ©Project PLATEAU / MLIT Japan • ST_Union(geomA, geomB) ◦ AとBを結合

    空間関数の例 PostGISと空間関数 A B https://aginfo.cgk.affrc.go.jp/docs/pgisman/3.3.0/postgis-ja.html#ST_Union
  15. ©Project PLATEAU / MLIT Japan • 空間演算用ORM ◦ lookup ▪

    contains, intersects, etc. ◦ DB関数 ▪ Centroid, Intersection, etc. PostGISと空間関数 GeoDjangoで空間関数 https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/geoquerysets/ https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/functions/
  16. ©Project PLATEAU / MLIT Japan • オブジェクト関係マッピング(Object-Relational Mapping) ◦ オブジェクト(プログラミング言語)とRDBをマッピング

    ◦ SQLを直接叩くことなく、オブジェクトのメソッドでDB操作 ◦ SQLインジェクション対策 ORMとは SQL Django ORM PostGISと空間関数
  17. ©Project PLATEAU / MLIT Japan • GeoDjangoは空間演算用のORMを持っている ◦ SQLを意識せずに空間関数を実行できる ◦

    地理空間用のDBで実行可能 GeoDjangoとORM • 実データを用いてORMを実行し、GeoDjangoの持つORMを紹介 PostGISと空間関数
  18. ©Project PLATEAU / MLIT Japan • Dockerを利用 ◦ Django ◦

    PostgreSQL + PostGIS ◦ その他必要なGISライブラリ GeoDjangoのセットアップ 環境構築 フロントエンド (Django Template) • リポジトリ https://github.com/selfsryo/GeoDjangoORMDemo API
  19. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ データの可視化 • 地図ライブラリを使用 ◦

    leaflet ▪ JSライブラリ ▪ ブラウザで地図表示 ▪ オープンソース • leafletでDjangoTemplateから表示 https://leafletjs.com/
  20. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ 出典:「位置参照情報ダウンロードサービス」(国土交通省)(https://nlftp.mlit.go.jp/ksj/) • 国土数値情報 「国土数値情報」は、国土形成計画、国土利用計画の策定等の国土政策の推進に

    資するために、地形、土地利用、公共施設などの国土に関する基礎的な情報をGIS データとして整備したものです。そのうち公開に差し支えないものについて、「地理空 間情報活用推進基本法」等を踏まえて無償で提供しています。 使用データ(国土数値情報)
  21. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ 使用データ(国土数値情報) 出典:「位置参照情報ダウンロードサービス 行政区域データ」(国土交通省)(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v3_1.html)     「位置参照情報ダウンロードサービス

    空港データ」(国土交通省)(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-C28-v3_0.html) • 行政区域データ ◦ 北海道 ◦ ポリゴンデータ • 空港データ ◦ 全国分 ◦ ポリゴンデータ
  22. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ データの取り込み • Djangoのデータ取り込み ◦

    データの属性を確認 ◦ models.pyを定義 ▪ 可能ならばinspectdb等 ◦ データ(fixture)を用意 ◦ 取り込みコマンド実行 ▪ loaddata • GeoDjangoのデータ取り込み ◦ データ(GISデータ)を用意 ◦ データの属性を確認 ◦ models.pyを定義 ◦ 取り込み実行 ※順番は前後
  23. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ データの取り込み • Djangoのデータ取り込み ◦

    データ構造を確認 ◦ models.pyを定義 ▪ 可能ならばinspectdb等 ◦ データ(fixture)を用意 ◦ 取り込みコマンド実行 ▪ loaddata • GeoDjangoのデータ取り込み ◦ データ(GISデータ)を用意 ◦ データの属性を確認 ◦ models.pyを定義 ◦ 取り込み実行 ※順番は前後
  24. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ データの取り込み • Djangoのデータ取り込み ◦

    データ構造を確認 ◦ models.pyを定義 ▪ 可能ならばinspectdb等 ◦ データ(fixture)を用意 ◦ 取り込みコマンド実行 ▪ loaddata • GeoDjangoのデータ取り込み ◦ データ(GISデータ)を用意 ◦ データの属性を確認 ◦ models.pyを定義 ◦ 取り込み実行 ※順番は前後
  25. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ データの属性を確認 • 国土数値情報のページを確認 ◦

    属性情報が記載 ◦ 名称、説明、型 出典:「位置参照情報ダウンロードサービス 行政区域データ」(国土交通省)(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v3_1.html)
  26. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ データの属性を確認 • ogrinspect ◦

    管理コマンド ◦ 以下を出力 ▪ データの構造 ▪ 実データとのマッピング https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/commands/#django-admin-ogrinspect
  27. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ データの取り込み • Djangoのデータ取り込み ◦

    データ構造を確認 ◦ models.pyを定義 ▪ 可能ならばinspectdb等 ◦ データ(fixture)を用意 ◦ 取り込みコマンド実行 ▪ loaddata • GeoDjangoのデータ取り込み ◦ データ(GISデータ)を用意 ◦ データの属性を確認 ◦ models.pyを定義 ◦ 取り込み実行 ※順番は前後
  28. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ データの取り込み • LayerMapping ◦

    ベクタデータをマップ ◦ 座標系の変換も可能(省略) ◦ saveメソッドで取り込み https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/layermapping/
  29. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ 行政区域モデル • モデル名 ◦

    AdminiBoundary • 今回は政令都市名または 市町村名を持つデータのみ取得
  30. ©Project PLATEAU / MLIT Japan GeoDjangoのセットアップ 空港データモデル https://leafletjs.com/ • モデル名

    ◦ Airport • 今回は必要なフィールドは 名称(c28_005)と ジオメトリ だけ
  31. ©Project PLATEAU / MLIT Japan • GeoJSON形式でのシリアライザがデフォルトで用意されている ◦ django.core.serializers.serialize ◦

    第一引数に”geojson”と入力 ※GeoJSONとは ◦ JSON形式 ◦ type, geometory, propertiesを持つ ◦ APIに利用 GeoDjangoのセットアップ シリアライザ https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/serializers/ https://geojson.org/
  32. ©Project PLATEAU / MLIT Japan • 空間演算用ORM ◦ lookup ▪

    contains, intersects, etc. ◦ DB関数 ▪ Centroid, Intersection, etc. PostGISと空間関数 GeoDjangoで空間関数(再掲) https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/geoquerysets/ https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/functions/
  33. ©Project PLATEAU / MLIT Japan • 空間演算用ORM ◦ lookup ▪

    contains, intersects, etc. ◦ DB関数 ▪ Centroid, Intersection, etc. PostGISと空間関数 GeoDjangoで空間関数(再掲) https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/geoquerysets/ https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/functions/
  34. ©Project PLATEAU / MLIT Japan • DjangoのQuerySetを様々な条件で取得できる • 一般的に以下のように書く ◦

    <QuerySet>.objects.filter(フィールド名__lookup=値) • 例:contains(名称に”田”の文字を含む空港データを取得) lookupとは https://docs.djangoproject.com/ja/4.1/ref/models/querysets/#field-lookups ORM実行 / 表示
  35. ©Project PLATEAU / MLIT Japan • 内部のみに存在する場合TRUE • 女満別空港を内部に含む行政界ポリゴンのみ取得 contains

    https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/geoquerysets/#contains ORM実行 / 表示 ※新千歳空港は複数のポリゴンにまたがるためFALSEとなる
  36. ©Project PLATEAU / MLIT Japan • containsと引数が逆になる • 北海道のみに含まれる空港ポリゴンのみ取得 within

    https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/geoquerysets/#within ORM実行 / 表示
  37. ©Project PLATEAU / MLIT Japan • 指定した距離より大きい、または小さい場所に存在する場合のみTRUE • distance_gte、distance_lteでそれぞれ以上、以下になる(=も含む) •

    中標津空港から100kmより大きい距離にある行政界ポリゴンのみ取得 https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/geoquerysets/#distance-gt https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/geoquerysets/#distance-lt ORM実行 / 表示 distance_gt / distance_lt
  38. ©Project PLATEAU / MLIT Japan • 空間演算用ORM ◦ lookup ▪

    contains, intersects, etc. ◦ DB関数 ▪ Centroid, Intersection, etc. PostGISと空間関数 GeoDjangoで空間関数(再掲) https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/geoquerysets/ https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/functions/
  39. ©Project PLATEAU / MLIT Japan • ジオメトリフィールドのGeoJSON表現を取得 • 完全なGeoJSONではなく、ジオメトリ部分のみ •

    函館空港のAsGeoJSON ORM実行 / 表示 AsGeoJSON https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/functions/#asgeojson
  40. ©Project PLATEAU / MLIT Japan • 函館空港のジオメトリからGeoJSONを作成 ORM実行 / 表示

    AsGeoJSON https://docs.djangoproject.com/ja/4.1/ref/contrib/gis/functions/#asgeojson
  41. ©Project PLATEAU / MLIT Japan • Django REST framework ◦

    DjangoでREST API実行 ◦ サードパーティ製 ◦ ブラウザ操作可能 REST API紹介 DjangoでのREST API https://www.django-rest-framework.org/
  42. ©Project PLATEAU / MLIT Japan • django-rest-framework-gis ◦ DRFのGIS拡張ライブラリ ◦

    GIS処理の機能が追加 GeoDjangoでのREST API https://github.com/openwisp/django-rest-framework-gis REST API紹介
  43. ©Project PLATEAU / MLIT Japan • 対象のpointからの距離でフィルタ ◦ URLに以下を追加してみる (新千歳空港のpoint)

    ?dist=1&point=141.683497,42.784556 • 新千歳空港と札幌飛行場が返ってくる • bboxが含まれている レスポンス REST API紹介