PostGIS / PostGresQL'deki maksimum çakışma temelinde katılma?


11

İki tabloda iki set çokgen var. Setler üst üste biniyor. A kümesindeki her çokgen için, B kümesindeki çokgenin kimliğini en çok örtüştüğü şekilde almak istiyorum. PostGIS uzantılı PostgreSQL kullanıyorum.

Sadece doğru / yanlış koşullara göre katılabileceğinizi bilmek için SQL hakkında yeterli bilgim var. Yani bu işe yaramaz:

SELECT
  a.id as a_id,
  b.id as b_id,
FROM
  a
JOIN
  b
ON
  max(ST_Area(ST_Intersection(a.geom, b.geom)))

çünkü max () ON yan tümcesinde olamaz.

ST_Intersects()doğru / yanlış bir testtir, bu yüzden buna katılabilirim, ancak A kümesindeki çokgenler genellikle B kümesindeki birden çok çokgenle çakışır ve hangisinin en çok çakıştığını bilmem gerekir . ST_Intersects, örtüşmenin boyutuna bakılmaksızın karşılaştığı ilk çakışan kimliği muhtemelen geri döndürür.

Bu, yapılabilmesi gerektiği gibi görünüyor, ama benim dışımda. Düşüncesi olan var mı?

Yanıtlar:


13

Şöyle bir şey kullanabilirsiniz:

SELECT DISTINCT ON (a.id)
  a.id as a_id,
  b.id as b_id,
  ST_Area(ST_Intersection(a.geom, b.geom)) as intersect_area
FROM a, b
ORDER BY a.id, ST_Area(ST_Intersection(a.geom, b.geom)) DESC

O:

1) Her (a, b) çift kayıt için ST_Area (ST_Intersection (a.geom, b.geom)) hesaplar.

2) Bunları a.id ve a.id eşit olduğunda intersect_area ile sıralar.

3) eşit a.id her grupta köknar rekoru alır (ilk kayıt 2. adımda sipariş nedeniyle en yüksek intersect_area sahiptir).


Bu, sorunu çok düzgün bir şekilde çözer. Teşekkür ederim teşekkür ederim! DISTINCT ONbenim için yeni - bu bağlamda çok kullanışlı.
Hugh Stimson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.