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

GISとDjango GEOS APIの話 / DjangoCongress JP 2022

MIERUNE
November 14, 2022

GISとDjango GEOS APIの話 / DjangoCongress JP 2022

MIERUNE

November 14, 2022
Tweet

More Decks by MIERUNE

Other Decks in Programming

Transcript

  1. ©Project PLATEAU / MLIT Japan 鈴木 祐亮 自己紹介 yusuke suzuki

    長野県出身・北海道在住22年目の IT技術者/Code for Sapporo Django, Python, PHP等を扱う バックエンドエンジニア兼何でも屋 WebGISスペシャリスト
  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. ©Project PLATEAU / MLIT Japan GISとは • 地理情報システム (Geographic Information

    System) • 「地理空間情報」を扱うシステム ◦ では地理空間情報って? 河川 土地利用 街灯 建物 道路 線路 そのほか、市町村界、気温、人口・・・ などの情報をデジタルに扱う GISについて
  4. ©Project PLATEAU / MLIT Japan GISについて GISとは • デジタル化した「地理空間情報」を扱うソフトウェア 


    • 「地理空間情報」の表示、編集、解析、公開機能を持っている 地理空間情報
 デジタル化された位置情報 
 地図 地理空間情報から作られた成果物 GIS 地理空間情報を処理するためのシステム
  5. ©Project PLATEAU / MLIT Japan GISについて 世界初のデータと地図化 • Cholera-map(John Snow1854)

    … 医師
 • 井戸とコレラ患者の位置関係 🔥 死者 • 井戸
  6. ©Project PLATEAU / MLIT Japan GISについて ソレはドコにあるのか?
 +
 ナニが起きているのか?
 +


    どうすりゃいいのか?
 
 
 見える化(地図化)重要 見える化が重要
  7. ©Project PLATEAU / MLIT Japan GISについて データの表示 • 形式の異なるデータの重ね合わせ
 •

    属性に基づく凡例の変更
 • 情報の公開
 地形 河川 地形+河川+道路 人口統計値に 基づく表示 土壌分類に 基づく表示
  8. ©Project PLATEAU / MLIT Japan GISについて データの作成・編集 • 地図のデジタル化
 •

    位置情報の付与
 古い地形図から土地利用を復元 画像の位置のずれを補正
  9. ©Project PLATEAU / MLIT Japan GISについて データの分析 • 図形の変形、作成
 •

    例:ディゾルブ:境界線の消去
 • 例:バッファ:新規図形の作成
 − 異なる情報間の演算に用いられることが多い ディゾルブ (詳細な分類から粗い分類への統合) バッファ (対象とする地物から一定の幅を持 つ新しい図形を作成)
  10. ©Project PLATEAU / MLIT Japan 代表的GIS ・代表的なGISソフト ArcGIS QGIS SIS

    Mapinfo ・ GISの仕組みの活用例(ビューアー)   GoogleMaps(Google Earth)   カシミール3D   カーナビ   GISについて
  11. ©Project PLATEAU / MLIT Japan 業務でのGIS利用における課題 • ソフトウェアの価格 ◦ 有償ソフトウェアは高機能&手厚いサポートが受けられるが高価格(40万円/本〜)

    • 操作の難易度 • 初見では馴染みのない語句が多く操作が難しい ※高価なソフトを初心者や若手社員がほいほい使える状況には社内の様々な壁が… • そこで、FOSS4G(QGIS)の利用が国内外で進んでいる GISについて
  12. ©Project PLATEAU / MLIT Japan FOSS4Gとは • Free and Open

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

    Geo for Allという運動も行っている • 日本支部はOSGeo.JP • メーリングリストによる広報や意見交換 OSGeoJapan-announce OSGeoJapan-discuss • 会員も募集中
  14. ©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を作成
  15. ©Project PLATEAU / MLIT Japan GeoDjangoって? • Djangoで GIS を処理する拡張機能。

    ◦ 拡張というか、Django で標準的に使える機能 • モデルを通じてDBにジオメトリ情報を保持する機能等使える。 ◦ Django 管理画面から、ジオメトリ列に対し、地図を使ってジオメトリ情報を 設定することができるようになる。 • ということで、DjangoはGIS屋さんに使いやすい環境だった。
  16. ©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/
  17. ©Project PLATEAU / MLIT Japan GEOS API って何?1 • GEOS

    API ◦ https://libgeos.org/ ◦ Java Topology Suite をC, C++に 移植したもの • PostGIS, GDAL, QGIS, Shapely等の内 部処理で使われてる。
  18. ©Project PLATEAU / MLIT Japan GEOS API って何?2 • それぞれのツールについて一言説明

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

    GEOS APIでできること • Djangoのみで、以下の処理を行うことができる ◦ ジオメトリの生成 ▪ 生成したジオメトリのフォーマット変換・出力 ◦ ジオメトリ同士のトポロジ判定 ◦ ジオメトリのトポロジ化(加工)
  20. ©Project PLATEAU / MLIT Japan ジオメトリの生成 • ジオメトリ ◦ 座標を持った地物のこと

    • Django GEOS APIで扱えるジオメトリ ◦ Point : 点 ◦ LineString : 線 ◦ LinearRing : 始点と終点がつながったLineString。 ◦ Polygon : ポリゴン ◦ MultiPoint : 複数の点をまとめたコレクション ◦ MultiLineString : 複数の線をまとめたコレクション ◦ MultiPolygon : 複数のポリゴンをまとめたコレクション ◦ GeometryCollection i. Point, Line, LinearRing, Polygonを組み合わせたコレクショ ン
  21. ©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)"
  22. ©Project PLATEAU / MLIT Japan ジオメトリの活用 • 生成したジオメトリから別の形式へ変換 ◦ WKT

    (Well-Known Text) を出力 ◦ WKB (Well-Known Binary) を出力 ◦ JSONを出力 • ジオメトリ同士のトポロジ確認、トポロジー化に用いる
  23. ©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のジオメトリ列に格納できる形式
  24. ©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 ] } ] }
  25. ©Project PLATEAU / MLIT Japan ジオメトリの出力系メソッド その他 • GEOSGeometry.wkb ◦

    ジオメトリのWKB形式をPythonのメモリバッファ形式で戻す • GEOSGeometry.ewkb ◦ wkb の「拡張された」版 • GEOSGeometry.kml ◦ ジオメトリをKML形式の文字列で戻す。 ◦ Google Earth, Google Map 等で使われるXMLベースのファイル形式 ◦ 例 : <Point><coordinates>123.45,45.67,0</coordinates></Point> • GEOSGeometry.ogr ◦ ジオメトリを OGRGeometry オブジェクトで戻す ◦ Django GDAL APIで利用
  26. ©Project PLATEAU / MLIT Japan ジオメトリ同士のトポロジ確認 • トポロジとは? ◦ 地物(フィーチャ)間の位相関係(接続、隣接、包含)の整

    合性を管理する機能やデータモデルのこと • ジオメトリ(地物)同士について、これらを確認する ◦ 隣り合っているか? ◦ 接続しているか? ◦ ジオメトリを含んでいるか?
  27. ©Project PLATEAU / MLIT Japan ジオメトリ同士のトポロジ確認メソッド • GEOSGeometry.contains(other) / other.within(this)

    ◦ メソッドを実行したジオメトリが、other で指定したジオメトリ の内部に含まれているかどうか判定する ◦ withinの方は、otherに自分自身が含まれてるかを確認。 ◦ • GEOSGeometry.covers(other) ◦ メソッドを実行したジオメトリが、other で指定したジオメトリ の内部に含まれているかどうか判定する ◦ contains と似てるが、より厳密にチェックする。 ◦ APIマニュアルでは、こちらのメソッド利用を推奨している。
  28. ©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)
  29. ©Project PLATEAU / MLIT Japan ジオメトリ同士のトポロジ確認メソッド3 • GEOSGeometry.disjoint(other) ◦ ジオメトリが、otherで指定したジオメトリと重なっていないことを判定する。

    • GEOSGeometry.intersects(other) ◦ GEOSGeometry.disjoint()が False の場合に、True を戻す。 ◦ contains, covers と処理が似てる。 ▪ 一番判定が簡素なため、速度的に有利。 • GEOSGeometry.touches(other) ◦ 二つのジオメトリ同士の境界線が接続されていれば True を返す。 ▪ 例)県境、市町村境界がはみ出してないか
  30. ©Project PLATEAU / MLIT Japan トポロジ化 • トポロジ化とは ◦ ジオメトリを加工して別の形状にすること

    ◦ ディゾルブ ◦ バッファ ディゾルブ (詳細な分類から粗い分類への統合) バッファ (対象とする地物から一定の幅を持 つ新しい図形を作成)
  31. ©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) ◦ ジオメトリの簡略化
  32. ©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)
  33. ©Project PLATEAU / MLIT Japan • 簡単なジオメトリ操作・出力であれば、これだけで完結できる ◦ より複雑な処理を行いたいなら、 PostGISやShaply

    を使った方が機能が豊 富 ◦ GeoPandas とは組み合わせられない ▪ Shaplyを使う方がよい Django GEOS APIの特徴
  34. ©Project PLATEAU / MLIT Japan Django GEOS APIの使い所 • ジオメトリに対する前処理

    ◦ クライアント側から座標情報だけ受け取って、ジオメトリを生成。 その後、生成したジオメトリをDBに格納する ◦ 渡された座標情報群から生成したポリゴンを simplify で簡略化し、データ量 を減らす。 • ごく簡単なジオメトリ同士のトポロジ判定 • データフォーマットの変換 ◦ DBに格納してるジオメトリデータをGeoJSONに変換して出力させる
  35. © 地理院地図 全国最新写真(シームレス) •GeoDjango では有名OSS GISツールでも用い られてる GEOS API の機能がつかえます。

    •GEOS APIを使うと、簡単なジオメトリ操作は GeoDjango の環境だけで完了できます。 ご清聴ありがとうございました。 まとめ