الاسم
ST_HausdorffDistance — تُعيد مسافة هاوسدورف (Hausdorff) بين شكلين.
المختصر
float ST_HausdorffDistance(geometry g1, geometry g2);
float ST_HausdorffDistance(geometry g1, geometry g2, float densifyFrac);
الوصف
تُعيد مسافة هاوسدورف بين شكلين. مسافة هاوسدورف مقياس لمدى تشابه شكلين أو اختلافهما.
تحسب الدالة في الواقع "مسافة هاوسدورف المنفصلة"، وهي مسافة هاوسدورف المحسوبة عند نقاط منفصلة على الشكلين. ويمكن تحديد الوسيط densifyFrac للحصول على إجابة أدق عبر تكثيف المقاطع قبل حساب مسافة هاوسدورف المنفصلة. إذ يُقسَم كل مقطع إلى عدد من المقاطع الفرعية المتساوية الطول تكون نسبة طول كل منها إلى طول المقطع أقرب ما يمكن إلى النسبة المعطاة.
الوحدات هي وحدات النظام المرجعي المكاني للشكلين.
|
|
|
هذه الخوارزمية ليست مكافئة لمسافة هاوسدورف القياسية. لكنها تحسب تقريبًا صحيحًا لمجموعة كبيرة من الحالات المفيدة. ومن الحالات المهمة الخطوط المتوازية تقريبًا والمتساوية الطول تقريبًا. وهذا مقياس مفيد لمطابقة الخطوط. |
متاحة منذ: 1.5.0
أمثلة
مسافة هاوسدورف (بالأحمر) والمسافة (بالأصفر) بين خطين
SELECT ST_HausdorffDistance(geomA, geomB),
ST_Distance(geomA, geomB)
FROM (SELECT 'LINESTRING (20 70, 70 60, 110 70, 170 70)'::geometry AS geomA,
'LINESTRING (20 90, 130 90, 60 100, 190 100)'::geometry AS geomB) AS t;
st_hausdorffdistance | st_distance
----------------------+-------------
37.26206567625497 | 20
مثال: مسافة هاوسدورف مع التكثيف.
SELECT ST_HausdorffDistance(
'LINESTRING (130 0, 0 0, 0 150)'::geometry,
'LINESTRING (10 10, 10 150, 130 10)'::geometry,
0.5);
----------------------
70
مثال: لكل مبنى، أوجد قطعة الأرض التي تمثّله على أفضل وجه. أولًا نشترط أن تتقاطع قطعة الأرض مع الشكل الهندسي للمبنى. يضمن 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);