Как можно реализовать кеш гео-точек

Я использую картографический сервис, который, учитывая геокруг (определяемый координатой и радиусом), возвращает набор мест в этой области. Я хочу кэшировать результаты, возвращаемые этим картографическим сервисом.

Я ожидаю, что мой кеш будет хранить две таблицы:

  • Таблица Places мест, возвращенных службой.
  • Таблица Круги с областями, места которых были кэшированы в таблице Места.

Затем, учитывая произвольный новый круг C, я хочу эффективно проверить кеш на предмет того, полностью ли область C покрыта кругами в таблице Circles< /эм>. Если C полностью покрыт, у меня есть попадание в кэш, и мне не нужно обращаться к картографическому сервису. Если C не охватывается полностью, я должен обратиться к картографическому сервису и кэшировать результат.

Вопрос 1: как сохранить набор геокругов, чтобы можно было эффективно проверить, полностью ли покрывает объединение их площадей произвольный новый круг?

Даже с решением Q1 у меня может возникнуть проблема с производительностью, когда промах кеша очень незначителен, и я делаю запрос к картографическому сервису, который едва увеличивает мою кешированную область. Чтобы решить эту проблему, я хочу иметь возможность найти примерную точку в C, которая не покрыта кругами, чтобы использовать ее в качестве центра для запроса картографического сервиса. Я буду повторять этот процесс до тех пор, пока C не будет полностью покрыт.

Вопрос 2: как мне сохранить набор геокругов, чтобы в случае, если их площадь не полностью покрывает заданный круг C, я мог эффективно генерировать пример в C, который не рассматривается?

Я ожидаю, что буду использовать что-то вроде PostgreSQL с PostGIS для реализации моего кэша, но я приветствую другие предложения.


person jameshfisher    schedule 20.10.2015    source источник
comment
Вы действительно хотите кэш? Недостаточно ли индекса (postgresql.org/docs/9.4 /static/xindex.html#XINDEX-ORDERING-OPS)?   -  person Egor Rogov    schedule 20.10.2015
comment
@ЕгорРогов, возможно, я не совсем понял: моя база данных PostGIS должна быть кешем результатов из внешнего картографического сервиса. Мне не нужен кеш запросов к моей базе данных.   -  person jameshfisher    schedule 20.10.2015


Ответы (1)


Вот мой хакерский подход, который по сути является «растеризацией».

Разделите область земного шара на большое, но конечное количество маленьких геотайлов, которые определяются путем рисования сетки на плоскости широта/долгота.

Вместо таблицы Круги мы храним таблицу Плитки, места которых были кэшированы в таблице Места.

Имея геокруг, мы можем эффективно сгенерировать набор геотайлов, которые частично покрываются кругом, и набор, которые полностью покрываются кругом.

При вставке точек в кеш мы помечаем каждый полностью покрытый тайл как кешированный.

При проверке кеша на круг C, если каждая плитка, полностью или частично покрытая C, находится в таблице Tiles, у нас есть кеш хит. В противном случае у нас есть кеш-промах, и пример тайла, который не кэшируется, из которого мы можем выбрать точку из этого в качестве центра круга для запроса у картографического сервиса.

У этого подхода есть недостатки:

  • Плитки различаются по размеру и форме на земном шаре из-за искажения проекции.
  • Если круг слишком мал, он может не полностью закрывать плитки и никогда не будет помечен как кэшированный.
person jameshfisher    schedule 20.10.2015