Как кодировать широту / долготу для поиска по полю? - PullRequest
0 голосов
/ 28 октября 2009

Я разрабатываю приложение на Google App Engine, и мне нужно найти все точки, которые есть в коробке.

Базовый поиск SQL будет выглядеть так:

minlatitude <широта И maxlatitude> широта И minlongitude <долгота И maxlongitude> долгота

Но этот запрос неэффективен и запрещен (нельзя использовать неравенство в 2 разных полях) в Google App Engine.

Итак, я закодировал широту / долготу в иерархическом порядке http://en.wikipedia.org/wiki/Geohash.

Но использование Geohash имеет некоторые проблемы: Да, он найдет все ваши очки, находящиеся в коробке, но он также найдет точки вне коробки.

Давайте рассмотрим пример:
Ящик с нижним левым углом (1, 1) -> geohash1 = s00twy01mtw0
и верхний правый угол (10, 10) -> geohash2 = s1z0gs3y0zh7
примет точку P как (2, 11) -> geohashP = s0rg6k1fye42
потому что geohash1 даже если P не в коробке.

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

Ответы [ 3 ]

3 голосов
/ 28 октября 2009

Не изобретай велосипед! Пространственные запросы - сложная проблема, но она уже решена несколькими сторонними библиотеками. Лучшей из них, вероятно, является библиотека геомоделей .

2 голосов
/ 06 марта 2010

Geomodel делает работу.

Я портировал библиотеку Python в Java.

Для тех, кто заинтересован, отметьте: http://code.google.com/p/javageomodel/

0 голосов
/ 28 октября 2009

Теоретически вы можете использовать Функция сопряжения Кантора , чтобы сопоставить четыре координаты вашего прямоугольника с одним значением, но я не уверен, что (легко) возможно ли выполнить тест включения для таких значений.

...