JSTSを利用して、OpenLayersの矩形内にある図形を抽出する

はじめに

OpenLayersで矩形内にある図形を抽出する場合、矩形で図形の交差を判定するため、正確にポリゴン同士の交差を判定できません。

JSTS導入前のイメージ

以下のイメージでは、ポリゴン同士の交差を判定できず、範囲外でも選択されています。

残念ながら、OpenLayers 単体では TopologySuite のような正確な図形同士の空間演算はサポートされていません(GeometryEngineがないため)。そのため、高精度を求める場合は Turf.js や JSTS を併用する必要があります。

Turf.js と JSTS の比較

以下は、Turf.js と JSTS の機能や用途に関する詳細な比較です。どちらもJavaScriptで空間解析を行うライブラリですが、目的やアーキテクチャが異なります。

No 項目 Turf.js JSTS
1 起源 Mapbox製(GeoJSON特化) JTS(Java Topology Suite)のJS移植
データ形式 GeoJSON に最適化 OpenLayers / JSTS独自形式(OL互換)
APIスタイル  関数型(turf.booleanIntersects(...) クラスベース(geomA.intersects(geomB)
軽量さ ◎ 軽い △ やや重い
サポート図形 ポリゴン/ライン/ポイント中心 複雑なMulti/GeometryCollection対応
トポロジー構築 ❌ 不可 ✅ 可能(GeometryPrecisionReducer, BufferOp, UnionOp など)
7 バッファ・ユニオン等の幾何処理 △ 限定的 ◎ 豊富かつ正確

c#でNetTopologySuiteを利用していることと、Turf.jsと比べても、正確な空間演算・トポロジー処理を扱いたい開発者向けであることから、OpenLayersでJSTSを導入し、ポリゴン同士の交差を判定してみました。

JSTS使用例

jstsはビルド済みのファイルを利用します。自分でbuildするのは面倒なので、CDNで直接jsts.min.jsを取得します。CDNで直接jsts.min.jsを取得できるURLとしては、以下が一般的です。

jsts.html

CDNで直接jsts.min.jsを取得したファイルをローカルに保存し、読み込みます。

jsts.js

初期処理でOpenLayersのGeometoryクラスが利用できるようにします。そのあとOpenLayersのGeometoryデータを読込んで、JSTSのGeometoryに変換して空間演算を行います。

JSTS導入後のイメージ1

OpenLayers単体の時と、同じ図形の場合は、交差を判定されません。

JSTS導入後のイメージ2

図形同士が交差するは、交差を判定されています。

まとめ

OpenLayersで、正確な図形同士の空間演算はサポートされていないのは意外でした。
ただ、自力で構築するのは大変なので、JSTSが提供されていたのでよかったです。
JSTSがあれば、より高度な空間演算が提供されているので、他の機能も試してみます!

シェアする

  • このエントリーをはてなブックマークに追加

フォローする