GEOSとは?

標準

2015年1月13日


今回はGEOSについてご紹介します。

GEOSとは?

GEOS(Geometry Engine - Open Source)は、地理空間情報処理のためのオープンソースライブラリで、OSGeo財団が支援するオープンソースプロジェクトの1つです。

GEOSはJTS Technology Suiteのすべての機能をC++に移植したもので、OGC(Open Geospatial Consortium)というGISの標準化に取り組んでいる団体が定義している OpenGIS Simple Features for SQLに含まれる空間関数と、JTSの高度なトポロジー関数が実装されています。

こちらに詳細が記載されていますので、ご参照ください。(英文)

ここでは、GEOSを使用するメリットと、GEOSを使用した場合の空間検索の考え方についてご紹介します。

GEOSのメリット

GEOSは、PostGIS、QGIS、GDAL/OGR、MapServer、FMEなど各種オープンソースのプロジェクトで利用されており、また弊社のGIS製品「SIS」でもバージョン7.1から利用しています。

GEOSを使用した場合の最大のメリットは、処理速度の高速化です。 例えば、以下のサイトでは、ジオメトリ処理にGEOSを使用した場合と使用しない場合でのパフォーマンスが比較されています。https://github.com/phayes/geoPHP/wiki/GEOS/

また、弊社のGISソフト「SIS」ではGEOSを使用することで、従来バージョンと比べて、空間検索やブール演算などのジオメトリ関連の処理速度が向上しました。このように、GEOSを使用することで、ジオメトリ処理の高速化が期待できます。

GEOSを使った空間検索

GEOSには、主に以下の機能があります。

上記の「ジオメトリ」と「空間関係」を組み合わせると、空間検索の定義が作成されます。では、どのように空間検索の定義が作成されるのか、具体例を使って見てみましょう。

検索例:
図1で「赤色の太線で囲まれた領域に対して、対象のジオメトリを含む」という条件で、家形の図形を検索します。 「赤の網掛けの図形」が検索条件に合致したものです。

家形と検索領域のポリゴン
図1:家形と検索領域のポリゴン

GEOSではこの検索を、OGCのDE-9IM(参考:http://en.wikipedia.org/wiki/DE-9IM)を使用して、以下のように実施します。

検索条件:
今回使用した条件は以下のとおりです。

Relate式:
この条件では、「を含む」という図形どうしの関係を「Relate」という式を使って定義しています。 Relate式は、「交差する」や「一致する」など、「空間関係」の条件に応じて、OGCのDE-9IMで定義されています。 例えば、「交差する」は「not Relate("FF*FF****") 」、「一致する」は「Relate("TFFF*FFF*") 」で表わされます。

空間検索を行う場合、まず検索元の領域や検索対象の図形を「内部」「境界」「外部」の3つに分けて、「表1」の①~⑨の空間関係がどのようになっているかを調べます。

表1:DE-9IM

これを、「Relate("①②③④⑤⑥⑦⑧⑨")」となるようにRelate式の引数に当てはめます。①~⑨の値は、以下のいずれかの空間関係になります。

今回使用した条件は以下のとおりです。
今回の検索条件の「を含む:Relate("T*****FF*") 」は、①が「T」、⑦と⑧が「F」で、それ以外は「*」です。
つまり、検索元の領域と検索対象の図形が、以下の空間関係を持っていることになります。

図1で検索された赤の網掛けの図形(検索対象)と赤色の太線で囲まれた領域(検索元)の空間関係を、表1に当てはめたものが「表2」です。


表2:図1の「赤の網掛け図形」と検索元図形の空間関係のDE-9IM

Relate式では「Relate("212FF1FF2")」となり、「を含む:Relate("T*****FF*") 」の条件と合致します。

一方、検索されていない図形は、「Relate("212101212")」(図2)あるいは「Relate("FF2FF1212")」(図3)であるため、 「を含む:Relate("T*****FF*") 」の条件に合致しません。

GEOSを使用した空間検索は、このようにして行われます。

おわりに

GEOSを使用した空間検索をメインにご紹介しましたが、いかがでしたでしょうか?これ以外の検索条件もRelate式で定義されています。空間検索の結果を確認したい場合は、実際にRelate式に当てはめて検証するとよいでしょう。

GEOSを使用した空間検索の定義はシンプルなので、パズルのように組み合わせて確認するのも楽しいと思います。