Как мога да внедря кеш на гео-точки

Използвам картографска услуга, която при даден геоокръг (дефиниран чрез координати и радиус) връща набор от места в тази област. Искам да кеширам резултатите, върнати от тази картна услуга.

Очаквам моя кеш да съхранява две таблици:

  • Таблица Места с места, върнати от услугата.
  • Таблица Кръгове от области, чиито места са били кеширани в таблицата Места.

След това, при даден произволен нов кръг C, искам ефективно да тествам кеша за това дали областта на C е изцяло покрита от кръговете в таблицата Кръгове< /em>. Ако 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, е в таблицата Плочки, имаме кеш удари. В противен случай имаме пропуск в кеша и примерна плочка, която не е кеширана, от която можем да изберем точка от това като център на кръг, който да поискаме от картографската услуга.

Този подход има недостатъци:

  • Плочките се различават по размер и форма на земното кълбо поради изкривяване на проекцията.
  • Ако кръгът е твърде малък, той може да не покрие напълно нито една плочка и така никога няма да бъде маркиран като кеширан.
person jameshfisher    schedule 20.10.2015