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

GISとDjango GEOS APIの話

MIERUNE
November 14, 2022

GISとDjango GEOS APIの話

MIERUNE

November 14, 2022
Tweet

More Decks by MIERUNE

Other Decks in Programming

Transcript

  1. ©OpenStreetMap contributors
    2022.11.12 yusuke suzuki
    GISとDjango GEOS APIの話

    View Slide

  2. ©OpenStreetMap contributors
    01 自己紹介

    View Slide

  3. ©Project PLATEAU / MLIT Japan
    鈴木 祐亮
    自己紹介
    yusuke suzuki
    長野県出身・北海道在住22年目の
    IT技術者/Code for Sapporo
    Django, Python, PHP等を扱う
    バックエンドエンジニア兼何でも屋
    WebGISスペシャリスト

    View Slide

  4. ©OpenStreetMap contributors
    02 MIERUNEについて

    View Slide

  5. © 地理院地図 全国最新写真(シームレス)
    MIERUNEはこんな会社です
    MIERUNEは位置情報に関する
    豊富な技術や実績を持つ
    ソリューションカンパニーです
    み え る ね

    View Slide

  6. © 地理院地図 全国最新写真(シームレス)
    位置情報は身近なところで使われています
    インフラ
    防災
    交通
    ナビ
    ゲーム
    環境
    マーケティ
    ング
    位置情報
    データ
    (GIS)

    View Slide

  7. ©Project PLATEAU / MLIT Japan
    事業紹介
    ●商用ソフトより使いやすく 
    多機能
    ●プラグイン開発や講習会  
    技術コンサルを提供中
    QGIS
    世界的なOSS-GISソフトウェア

    View Slide

  8. ©Project PLATEAU / MLIT Japan
    事業紹介
    ●自由で美しいウェブ地図
    ●低廉なコストで導入可能
    ●カスタマイズや開発も可能
    MapTiler
    Google MapsやMapboxから
    乗り換えませんか

    View Slide

  9. ©Project PLATEAU / MLIT Japan
    事業紹介
    ●組織内に散在している  
    データを一括で共有
    ●最新データがすぐわかる
    ●ソフト無しでも閲覧可能
    MIERUNE BASE
    GISデータ共有サービス

    View Slide

  10. © 地理院地図 全国最新写真(シームレス)
    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

    View Slide

  11. © 地理院地図 全国最新写真(シームレス)
    SNSもいろいろやってます
    Twitter @MIERUNE_inc note mierune
    YouTube mierune Qiita mierune

    View Slide

  12. © 地理院地図 全国最新写真(シームレス)
    仲間を募集中
    We are hiring!
    MIERUNE 検索
    未来に挑戦する仲間を
    募集しています

    View Slide

  13. ©OpenStreetMap contributors
    03 本編

    View Slide

  14. ©OpenStreetMap contributors
    03-1 GISについて
    03-2 Django GEOS
    API について
    目次

    View Slide

  15. ©OpenStreetMap contributors
    03 -1 GISについて

    View Slide

  16. ©Project PLATEAU / MLIT Japan
    GISとは
    ● 地理情報システム (Geographic Information System)
    ● 「地理空間情報」を扱うシステム
    ○ では地理空間情報って?
    河川
    土地利用
    街灯
    建物
    道路
    線路
    そのほか、市町村界、気温、人口・・・
    などの情報をデジタルに扱う
    GISについて

    View Slide

  17. ©Project PLATEAU / MLIT Japan
    GISについて
    GISとは
    ● デジタル化した「地理空間情報」を扱うソフトウェア

    ● 「地理空間情報」の表示、編集、解析、公開機能を持っている
    地理空間情報

    デジタル化された位置情報 

    地図
    地理空間情報から作られた成果物
    GIS
    地理空間情報を処理するためのシステム

    View Slide

  18. ©Project PLATEAU / MLIT Japan
    GISについて
    世界初のデータと地図化
    ● Cholera-map(John Snow1854) … 医師

    ● 井戸とコレラ患者の位置関係
    🔥 死者
    ● 井戸

    View Slide

  19. ©Project PLATEAU / MLIT Japan
    GISについて
    ソレはドコにあるのか?

    +

    ナニが起きているのか?

    +

    どうすりゃいいのか?



    見える化(地図化)重要
    見える化が重要

    View Slide

  20. ©Project PLATEAU / MLIT Japan
    GISについて
    データの表示
    ● 形式の異なるデータの重ね合わせ

    ● 属性に基づく凡例の変更

    ● 情報の公開

    地形 河川
    地形+河川+道路
    人口統計値に
    基づく表示
    土壌分類に
    基づく表示

    View Slide

  21. ©Project PLATEAU / MLIT Japan
    GISについて
    データの作成・編集
    ● 地図のデジタル化

    ● 位置情報の付与

    古い地形図から土地利用を復元 画像の位置のずれを補正

    View Slide

  22. ©Project PLATEAU / MLIT Japan
    GISについて
    情報の整理
    ● 地図上に描画したデータに情報を持たせて、管理 


    View Slide

  23. ©Project PLATEAU / MLIT Japan
    GISについて
    データの分析
    ● 図形の変形、作成

    • 例:ディゾルブ:境界線の消去

    • 例:バッファ:新規図形の作成

    − 異なる情報間の演算に用いられることが多い
    ディゾルブ
    (詳細な分類から粗い分類への統合)
    バッファ
    (対象とする地物から一定の幅を持
    つ新しい図形を作成)

    View Slide

  24. ©Project PLATEAU / MLIT Japan
    代表的GIS
    ・代表的なGISソフト
    ArcGIS
    QGIS
    SIS
    Mapinfo
    ・ GISの仕組みの活用例(ビューアー)
      GoogleMaps(Google Earth)
      カシミール3D
      カーナビ
     
    GISについて

    View Slide

  25. ©Project PLATEAU / MLIT Japan
    業務でのGIS利用における課題
    ● ソフトウェアの価格
    ○ 有償ソフトウェアは高機能&手厚いサポートが受けられるが高価格(40万円/本〜)
    ● 操作の難易度
    ● 初見では馴染みのない語句が多く操作が難しい
    ※高価なソフトを初心者や若手社員がほいほい使える状況には社内の様々な壁が…
    ● そこで、FOSS4G(QGIS)の利用が国内外で進んでいる
    GISについて

    View Slide

  26. ©Project PLATEAU / MLIT Japan
    FOSS4Gとは
    ● Free and Open Source Software for Geospatialと呼ばれるソフトウェア群の略称
    ○ 「自由」(フリーでオープン)に利用できるGISソフトウェア
    ■ 自由に入手・改良・再配布が可能
    ■ ユーザーによる開発も可能
    ○ 日本国内の官公庁・研究機関・教育機関・民間企業でも活用
    ○ OSGeo財団の支援により同名称の国際・国内会議もある
    ○ フリー≠「無料」
    ■ 無料だからといってオープンソースとは限らない
    ■ 「カシミール3D」「Google Earth」はオープンソースではない
    FOSS4G
    GISについて

    View Slide

  27. ©Project PLATEAU / MLIT Japan
    GISについて
    OSGeo財団
    ● FOSS4Gの普及と利用促進を図る国際組織
    ● Geo for Allという運動も行っている
    ● 日本支部はOSGeo.JP
    ● メーリングリストによる広報や意見交換
    OSGeoJapan-announce
    OSGeoJapan-discuss
    ● 会員も募集中

    View Slide

  28. ©OpenStreetMap contributors
    03 -2 Django GEOS API
    について

    View Slide

  29. ©Project PLATEAU / MLIT Japan
    Django GEOS API について
    わたしとDjango
    ● MIERUNEに入社後、PythonとDjangoを使いだす
    ○ Django 2.2 あたりから使ってる
    ○ PHP(Symfony), Ruby on Rails の経験はあった
    ○ 会社としては、QGIS プラグインがPythonで開発するので、Python
    に対する抵抗はなかった。
    ● Django REST Framework と組み合わせてAPIを作成

    View Slide

  30. ©Project PLATEAU / MLIT Japan
    GeoDjangoって?
    ● Djangoで GIS を処理する拡張機能。
    ○ 拡張というか、Django で標準的に使える機能
    ● モデルを通じてDBにジオメトリ情報を保持する機能等使える。
    ○ Django 管理画面から、ジオメトリ列に対し、地図を使ってジオメトリ情報を
    設定することができるようになる。
    ● ということで、DjangoはGIS屋さんに使いやすい環境だった。

    View Slide

  31. ©Project PLATEAU / MLIT Japan
    Django GEOS API について
    Django GEOS API
    ● Djangoで GeoDjango を有効にしてると
    こっちも使える。
    ○ 別途、ライブラリを導入する必要はなし
    ● OSSの地理情報システム (GIS)向け C,C++
    ライブラリ GEOS の関数群を呼び出して処理
    を行う。
    ● https://docs.djangoproject.com/en/
    4.1/ref/contrib/gis/geos/

    View Slide

  32. ©Project PLATEAU / MLIT Japan
    GEOS API って何?1
    ● GEOS API
    ○ https://libgeos.org/
    ○ Java Topology Suite をC, C++に
    移植したもの
    ● PostGIS, GDAL, QGIS, Shapely等の内
    部処理で使われてる。

    View Slide

  33. ©Project PLATEAU / MLIT Japan
    GEOS API って何?2
    ● それぞれのツールについて一言説明
    ● PostGIS
    ○ PostgreSQLでGIS処理(データ保存、加工)を行うための拡張モジュール
    ● GDAL
    ○ ラスタ・ベクタの地理位置情報データを変換するためのプログラム・ライブラリ
    ● QGIS
    ○ GISデータの閲覧、編集、分析機能を有するクロスプラットフォームのオープンソースソフ
    トウェア。
    ● Shapely
    ○ ジオメトリの操作および分析のために使われるPythonライブラリ

    View Slide

  34. ©Project PLATEAU / MLIT Japan
    Django GEOS API について
    Django GEOS APIでできること
    ● Djangoのみで、以下の処理を行うことができる
    ○ ジオメトリの生成
    ■ 生成したジオメトリのフォーマット変換・出力
    ○ ジオメトリ同士のトポロジ判定
    ○ ジオメトリのトポロジ化(加工)

    View Slide

  35. ©Project PLATEAU / MLIT Japan
    ジオメトリの生成
    ● ジオメトリ
    ○ 座標を持った地物のこと
    ● Django GEOS APIで扱えるジオメトリ
    ○ Point : 点
    ○ LineString : 線
    ○ LinearRing : 始点と終点がつながったLineString。
    ○ Polygon : ポリゴン
    ○ MultiPoint : 複数の点をまとめたコレクション
    ○ MultiLineString : 複数の線をまとめたコレクション
    ○ MultiPolygon : 複数のポリゴンをまとめたコレクション
    ○ GeometryCollection
    i. Point, Line, LinearRing, Polygonを組み合わせたコレクショ

    View Slide

  36. ©Project PLATEAU / MLIT Japan
    ジオメトリの作り方
    from django.contrib.gis.geos import Point
    lat = 42.123
    lon = 123.45
    geom = Point(lat, lon)
    print(geom)
    => "POINT (42.123 123.45)"
    start1 = (0, 0)
    end1 = (10, 10)
    line = geos.LineString(start1, end1)
    print(line)
    => "LINESTRING (0 0, 10 10)"

    View Slide

  37. ©Project PLATEAU / MLIT Japan
    ジオメトリの活用
    ● 生成したジオメトリから別の形式へ変換
    ○ WKT (Well-Known Text) を出力
    ○ WKB (Well-Known Binary) を出力
    ○ JSONを出力
    ● ジオメトリ同士のトポロジ確認、トポロジー化に用いる

    View Slide

  38. ©Project PLATEAU / MLIT Japan
    ジオメトリの出力系メソッド1
    ● GEOSGeometry.wkt
    ○ ジオメトリをWKT (Well-Known Text)文字列で戻す
    ○ 例)POINT(5 23)
    ● GEOSGeometry.ewkt
    ○ ジオメトリを「拡張された」WKT文字列で戻す : 座標系を付与する
    ○ PostGIS向け
    ○ 例)SRID=4326;POINT(43.12 23.12)
    ● GEOSGeometry.hex
    ○ ジオメトリを16進数バイナリデータで表現したWKB (Well-Known
    Binary) 文字列で戻す
    ● GEOSGeometry.hexewkb : hex の「拡張された」版
    ○ PostGISのジオメトリ列に格納できる形式

    View Slide

  39. ©Project PLATEAU / MLIT Japan
    ジオメトリの出力系メソッド2
    ● GEOSGeometry.json / GEOSGeometry.geojson
    ○ ジオメトリをJSON形式で戻す
    ○ ただ、そのままではGeoJSONとしては使えない
    例 : { "type": "Point", "coordinates": [ 123.45, 45.67 ] }
    ○ GeometryCollectionのジオメトリから出力した場合
    { "type": "GeometryCollection", "geometries": [ { "type":
    "Point", "coordinates": [ 123.45, 45.67 ] } ] }

    View Slide

  40. ©Project PLATEAU / MLIT Japan
    ジオメトリの出力系メソッド その他
    ● GEOSGeometry.wkb
    ○ ジオメトリのWKB形式をPythonのメモリバッファ形式で戻す
    ● GEOSGeometry.ewkb
    ○ wkb の「拡張された」版
    ● GEOSGeometry.kml
    ○ ジオメトリをKML形式の文字列で戻す。
    ○ Google Earth, Google Map 等で使われるXMLベースのファイル形式
    ○ 例 :
    123.45,45.67,0
    ● GEOSGeometry.ogr
    ○ ジオメトリを OGRGeometry オブジェクトで戻す
    ○ Django GDAL APIで利用

    View Slide

  41. ©Project PLATEAU / MLIT Japan
    ジオメトリ同士のトポロジ確認
    ● トポロジとは?
    ○ 地物(フィーチャ)間の位相関係(接続、隣接、包含)の整
    合性を管理する機能やデータモデルのこと
    ● ジオメトリ(地物)同士について、これらを確認する
    ○ 隣り合っているか?
    ○ 接続しているか?
    ○ ジオメトリを含んでいるか?

    View Slide

  42. ©Project PLATEAU / MLIT Japan
    ジオメトリ同士のトポロジ確認
    ● 不整合のあるデータ
    ○ 地物から線がはみ出している
    ○ 地物同士に隙間がある
    ○ ポリゴンが自己交差してる

    View Slide

  43. ©Project PLATEAU / MLIT Japan
    ジオメトリ同士のトポロジ確認メソッド
    ● GEOSGeometry.contains(other) / other.within(this)
    ○ メソッドを実行したジオメトリが、other で指定したジオメトリ
    の内部に含まれているかどうか判定する
    ○ withinの方は、otherに自分自身が含まれてるかを確認。

    ● GEOSGeometry.covers(other)
    ○ メソッドを実行したジオメトリが、other で指定したジオメトリ
    の内部に含まれているかどうか判定する
    ○ contains と似てるが、より厳密にチェックする。
    ○ APIマニュアルでは、こちらのメソッド利用を推奨している。

    View Slide

  44. ©Project PLATEAU / MLIT Japan
    ジオメトリ同士のトポロジ確認メソッド2
    ● GEOSGeometry.crosses(other)
    ○ メソッドを実行したジオメトリが、otherで指定したジオメトリと交
    差しているか判定する。

    ● GEOSGeometry.equals(other)
    ○ メソッドを実行したジオメトリが、otherで指定したジオメトリと完
    全に重なっていて、トポロジー的に等価なことを確認する。
    ○ 例)これらの二つのジオメトリを比較する
    ■ LINESTRING(0 0, 10 10)
    ■ LINESTRING(0 0, 5 5, 10 10)
    (0,0)
    (10,10)
    (0,0)
    (5,5)

    View Slide

  45. ©Project PLATEAU / MLIT Japan
    ジオメトリ同士のトポロジ確認メソッド3
    ● GEOSGeometry.disjoint(other)
    ○ ジオメトリが、otherで指定したジオメトリと重なっていないことを判定する。
    ● GEOSGeometry.intersects(other)
    ○ GEOSGeometry.disjoint()が False の場合に、True を戻す。
    ○ contains, covers と処理が似てる。
    ■ 一番判定が簡素なため、速度的に有利。
    ● GEOSGeometry.touches(other)
    ○ 二つのジオメトリ同士の境界線が接続されていれば True を返す。
    ■ 例)県境、市町村境界がはみ出してないか

    View Slide

  46. ©Project PLATEAU / MLIT Japan
    トポロジ化
    ● トポロジ化とは
    ○ ジオメトリを加工して別の形状にすること
    ○ ディゾルブ
    ○ バッファ
    ディゾルブ
    (詳細な分類から粗い分類への統合)
    バッファ
    (対象とする地物から一定の幅を持
    つ新しい図形を作成)

    View Slide

  47. ©Project PLATEAU / MLIT Japan
    トポロジ化メソッド1
    ● GEOSGeometry.buffer(width, quadsegs=8)
    ○ ジオメトリについて、指定した引数分のバッファをとった新しいジオメトリを戻す
    ○ Pointに対してバッファを取ると、Pointの座標を中心にとる円(細かい多角形)の
    Polygonができる。
    ○ quadsegs は円周を滑らかにする(多角形の辺を増やす)パラメータ
    ● GEOSGeometry.buffer_with_style(width, quadsegs=8, end_cap_style=1,
    join_style=1, mitre_limit=5.0)¶
    ○ カスタマイズしたスタイルを設定する場合の buffer メソッド
    ○ Point座標を中心にとる四角形ポリゴンを作成するときに主に使う
    ● GEOSGeometry.difference(other)
    ○ ジオメトリ同士の差分を取る。重なっている部分を省く。
    ● GEOSGeometry.simplify(tolerance=0.0, preserve_topology=False)
    ○ ジオメトリの簡略化

    View Slide

  48. ©Project PLATEAU / MLIT Japan
    トポロジ化メソッド2
    ● GEOSGeometry.interpolate(distance)
    ● GEOSGeometry.interpolate_normalized(distance)
    ○ LineString, MultiLineStringの始点から、指定した距離に対応する点
    の座標を戻す。
    ○ interpolate では、現在の座標系における距離を指定
    ■ line = LINESTRING((0,0), (10,0))
    ■ line.interpolate(6) > POINT(0, 6)
    ○ interpolate_normalized の方は、0〜1の範囲で値を指定する。
    ■ line.interpolate(0.5) > POINT(0, 5)
    ● GEOSGeometry.project(point)/GEOSGeometry.project_normali
    zed(point)
    ○ ジオメトリの原点から指定したPointまでの距離を戻す。
    ○ project_normalized の方は、0〜1の範囲で値を戻す。
    (0,0) (10,0)
    (6,0)

    View Slide

  49. ©Project PLATEAU / MLIT Japan
    ● 簡単なジオメトリ操作・出力であれば、これだけで完結できる
    ○ より複雑な処理を行いたいなら、
    PostGISやShaply を使った方が機能が豊

    ○ GeoPandas とは組み合わせられない
    ■ Shaplyを使う方がよい
    Django GEOS APIの特徴

    View Slide

  50. ©Project PLATEAU / MLIT Japan
    Django GEOS APIの使い所
    ● ジオメトリに対する前処理
    ○ クライアント側から座標情報だけ受け取って、ジオメトリを生成。
    その後、生成したジオメトリをDBに格納する
    ○ 渡された座標情報群から生成したポリゴンを simplify で簡略化し、データ量
    を減らす。
    ● ごく簡単なジオメトリ同士のトポロジ判定
    ● データフォーマットの変換
    ○ DBに格納してるジオメトリデータをGeoJSONに変換して出力させる

    View Slide

  51. ©OpenStreetMap contributors
    04 デモ

    View Slide

  52. ©Project PLATEAU / MLIT Japan
    デモ
    指定した座標を中心とする魔法陣を描い
    てみる

    View Slide

  53. ©OpenStreetMap contributors
    05 まとめ

    View Slide

  54. © 地理院地図 全国最新写真(シームレス)
    ●GeoDjango では有名OSS GISツールでも用い
    られてる GEOS API の機能がつかえます。
    ●GEOS APIを使うと、簡単なジオメトリ操作は
    GeoDjango の環境だけで完了できます。
    ご清聴ありがとうございました。
    まとめ

    View Slide