Ho una tabella PostgreSQL 9.1 con centinaia di migliaia di PUNTI PostGIS. Per ognuno di questi mi piacerebbe trovare il punto più vicino in un'altra tabella di PUNTI. I punti nella seconda tabella rappresentano una griglia su tutto il mondo, quindi so che ci sarà sempre una corrispondenza entro 1 grado. Questa è la query che sto usando finora, che fa uso degli indici GIST, quindi è ragionevolmente veloce (circa 30 secondi in totale).
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)
L'unico problema è la linea dati. I punti della griglia hanno solo la latitudine 180, non -180. Quando si utilizza la versione geometrica di ST_Distance, questo non restituisce punti sull'altro lato della linea dati. Per esempio. se p.pos è POINT(-179.88056 -16.68833)
il punto di griglia più vicino potrebbe essere POINT(180 -16.25)
, ma la query sopra non lo restituisce. Qual è il modo migliore per risolvere questo problema?
Non voglio davvero avere due coordinate per un singolo punto della griglia (-180 e +180). Ho provato ad aggiungere la mia funzione che controlla questo caso specifico, ma poi la query non ritorna in 5 minuti, probabilmente perché non può più usare l'indice. Ho anche provato a utilizzare la versione geografica di ST_DWithin e anche quella query non è tornata dopo 5 minuti.