Yüz binlerce PostGIS NOKTASI içeren bir PostgreSQL 9.1 tablom var. Bunların her biri için başka bir POINT tablosundaki en yakın noktayı bulmak istiyorum. İkinci tablodaki noktalar tüm dünyadaki bir tabloyu temsil ediyor, bu yüzden her zaman 1 derece içinde bir eşleşme olacağını biliyorum. Bu şimdiye kadar kullandığım sorgu GIST dizinleri kullanır, bu yüzden oldukça hızlı (toplam yaklaşık 30 saniye).
SELECT DISTINCT ON (p.id)
p.id, ST_AsText(p.pos)
, ST_AsText(first_value(g.location) OVER (PARTITION BY p.id ORDER BY ST_Distance(p.pos, g.location::geography)))
FROM point p
JOIN grid g ON ST_DWithin(p.pos::geometry, g.location, 1)
Tek sorun datelindir. Izgara noktaları -180 değil, yalnızca enlem 180'e sahiptir. ST_Distance'ın geometri sürümünü kullanırken, bu datelinin diğer tarafındaki noktaları döndürmez. Örneğin. p.pos POINT(-179.88056 -16.68833)
en yakın ızgara noktasıysa POINT(180 -16.25)
, ancak yukarıdaki sorgu döndürmez. Bunu düzeltmenin en iyi yolu nedir?
Tek bir ızgara noktası (-180 ve +180) için iki koordinat istemiyorum. Bu özel durum için kontrol kendi işlevi ekleyerek denedim, ancak daha sonra dizin artık kullanamazsınız çünkü sorgu 5 dakika içinde dönmez. Ayrıca ST_DWithin coğrafya sürümünü kullanarak denedim ve bu sorgu da 5 dakika sonra dönmedi.