Namn

ST_FrechetDistance — Returnerar Fréchet-avståndet mellan två geometrier.

Synopsis

float ST_FrechetDistance(geometry g1, geometry g2, float densifyFrac = -1);

Beskrivning

Implementerar algoritm för att beräkna Fréchet-avståndet begränsat till diskreta punkter för båda geometrierna, baserat på Computing Discrete Fréchet Distance. Fréchet-avståndet är ett mått på likhet mellan kurvor som tar hänsyn till placeringen och ordningsföljden av punkterna längs kurvorna. Därför är det ofta bättre än Hausdorff-avståndet.

När det valfria alternativet densifyFrac anges utför denna funktion en segmentförtätning innan det diskreta Fréchet-avståndet beräknas. Parametern densifyFrac anger den fraktion som varje segment ska förtätas med. Varje segment kommer att delas upp i ett antal lika långa undersegment, vars fraktion av den totala längden är närmast den angivna fraktionen.

Enheterna är i enheterna i geometriernas spatiala referenssystem.

[Notera]

Den nuvarande implementationen stöder endast toppar som diskreta platser. Detta kan utökas så att en godtycklig täthet av punkter kan användas.

[Notera]

Ju mindre densifyFrac vi anger, desto mer exakt Fréchet-avstånd får vi. Men beräkningstiden och minnesanvändningen ökar med kvadraten på antalet delsegment.

Utförs av GEOS-modulen.

Tillgänglighet: 2.4.0 - kräver GEOS >= 3.7.0

Exempel

Both lines are traversed from left to right. The first line is straight, while the second bows upward through its middle vertex. The point ordering matters, so keeping both inputs in the same direction makes the comparison clearer.

Code
WITH lines AS (
  SELECT 'LINESTRING (0 0,100 0)'::geometry AS baseline,
         'LINESTRING (0 0,50 50,100 0)'::geometry AS bowed
)
SELECT baseline AS baseline,
       bowed AS bowed,
       ST_FrechetDistance(baseline, bowed) AS discrete_distance,
       ST_FrechetDistance(baseline, bowed, 0.5) AS densified_distance
FROM lines;
Rasterutdata
-[ RECORD 1 ]-----+----------------------------
baseline           | LINESTRING(0 0,100 0)
bowed              | LINESTRING(0 0,50 50,100 0)
discrete_distance  | 70.7106781186548
densified_distance | 50
Figure
Geometry figure for visual-st-frechetdistance-01