Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

©OpenStreetMap contributors 01 自己紹介

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

©OpenStreetMap contributors 02 MIERUNEについて

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

©OpenStreetMap contributors 03 本編

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

©OpenStreetMap contributors 03 -1 GISについて

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

©Project PLATEAU / MLIT Japan GISについて GISとは ● デジタル化した「地理空間情報」を扱うソフトウェア 
 ● 「地理空間情報」の表示、編集、解析、公開機能を持っている 地理空間情報
 デジタル化された位置情報 
 地図 地理空間情報から作られた成果物 GIS 地理空間情報を処理するためのシステム

Slide 18

Slide 18 text

©Project PLATEAU / MLIT Japan GISについて 世界初のデータと地図化 ● Cholera-map(John Snow1854) … 医師
 ● 井戸とコレラ患者の位置関係 🔥 死者 ● 井戸

Slide 19

Slide 19 text

©Project PLATEAU / MLIT Japan GISについて ソレはドコにあるのか?
 +
 ナニが起きているのか?
 +
 どうすりゃいいのか?
 
 
 見える化(地図化)重要 見える化が重要

Slide 20

Slide 20 text

©Project PLATEAU / MLIT Japan GISについて データの表示 ● 形式の異なるデータの重ね合わせ
 ● 属性に基づく凡例の変更
 ● 情報の公開
 地形 河川 地形+河川+道路 人口統計値に 基づく表示 土壌分類に 基づく表示

Slide 21

Slide 21 text

©Project PLATEAU / MLIT Japan GISについて データの作成・編集 ● 地図のデジタル化
 ● 位置情報の付与
 古い地形図から土地利用を復元 画像の位置のずれを補正

Slide 22

Slide 22 text

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


Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

©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を作成

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

©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/

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

©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)"

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

©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のジオメトリ列に格納できる形式

Slide 39

Slide 39 text

©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 ] } ] }

Slide 40

Slide 40 text

©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で利用

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

©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)

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

©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) ○ ジオメトリの簡略化

Slide 48

Slide 48 text

©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)

Slide 49

Slide 49 text

©Project PLATEAU / MLIT Japan ● 簡単なジオメトリ操作・出力であれば、これだけで完結できる ○ より複雑な処理を行いたいなら、 PostGISやShaply を使った方が機能が豊 富 ○ GeoPandas とは組み合わせられない ■ Shaplyを使う方がよい Django GEOS APIの特徴

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

©OpenStreetMap contributors 04 デモ

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

©OpenStreetMap contributors 05 まとめ

Slide 54

Slide 54 text

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