Name

ST_HausdorffDistance — 二つのジオメトリ間のハウスドルフ距離を返します。基本的にジオメトリが似ているかどうかを計測するものです。単位はジオメトリの空間参照系の単位です。

Synopsis

float ST_HausdorffDistance(geometry g1, geometry g2);

float ST_HausdorffDistance(geometry g1, geometry g2, float densifyFrac);

説明

「離散ハウスドルフ距離」とみなすことができる距離基準を計算します。これは、一つのジオメトリの離散点に制限されたハウスドルフ距離です。Hausdorff distanceに関するWikiPedia英語版の記事Martin Davis note on how Hausdorff Distance calculation was used to prove correctness of the CascadePolygonUnion approach.などを参照して下さい。

densifyFracが指定された際には、離散ハウスドルフ距離を計算する前に、線分の密度を高めます。densifyFracパラメータは線分ごとの密度を高める小数です。それぞれの線分が、等分に分割されます。線分の長さに対する分割線分の長さの比は与えられた小数に近くなります。

[Note]

現在の実装では、離散位置は、頂点のみに対応しています。任意の密度でポイントを使用することができるよう拡張されています。

[Note]

このアルゴリズムは標準的なハウスドルフ距離と等価では*ありません*。しかし、使用可能な場面の大部分で正しくなる近似計算がなされています。重要なものに、それぞれが概ね平行で概ね等しい長さのラインストリングがあります。これはラインのマッチングに使える基準です。

Availability: 1.5.0 - GEOS 3.2.0以上が必要です。

建物ごとに、建物を表現する最善の区画を見つけます。まず、ジオメトリとインタセクトする区画を求めます。DISTINCT ONで、建物が一覧に一度だけ出現するのを保障します。ORDER BY ... ST_HausdorffDistanceで、最も建物に近い区画が前に出ます。

SELECT DISTINCT ON(buildings.gid) buildings.gid, parcels.parcel_id
   FROM buildings INNER JOIN parcels ON ST_Intersects(buildings.geom,parcels.geom)
     ORDER BY buildings.gid, ST_HausdorffDistance(buildings.geom, parcels.geom);
postgis=# SELECT ST_HausdorffDistance(
                                'LINESTRING (0 0, 2 0)'::geometry,
                                'MULTIPOINT (0 1, 1 0, 2 1)'::geometry);
 st_hausdorffdistance
 ----------------------
                                         1
(1 row)
                        
postgis=# SELECT st_hausdorffdistance('LINESTRING (130 0, 0 0, 0 150)'::geometry, 'LINESTRING (10 10, 10 150, 130 10)'::geometry, 0.5);
 st_hausdorffdistance
 ----------------------
                                        70
(1 row)