У мене є таблиця PostgreSQL 9.1 із сотнями тисяч POGIS POINT. Для кожного з них я хотів би знайти найближчу точку в іншій таблиці POINT. Бали у другій таблиці являють собою сітку у всьому світі, тому я знаю, що завжди буде матч у межах 1 градуса. Це запит, який я зараз використовую, який використовує індекси GIST, тому він досить швидкий (всього близько 30 секунд).
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)
Єдина проблема - це дателін. Точки сітки мають лише широту 180, а не -180. При використанні версії геометрії ST_Distance це не повертає точки з іншого боку дателіни. Напр. якщо p.pos є POINT(-179.88056 -16.68833)
найближчою точкою сітки POINT(180 -16.25)
, але вищезазначений запит не повертає її. Який найкращий спосіб це виправити?
Я не хочу мати двох координат для однієї точки сітки (-180 та +180). Я спробував додати свою функцію, яка перевіряє цей конкретний випадок, але потім запит не повертається через 5 хвилин, можливо, тому що він більше не може використовувати індекс. Я також спробував використовувати географічну версію ST_DWithin, і запит також не повернувся через 5 хвилин.