Мы используем Google AppEngine для выполнения пространственных / атрибутивных запросов, и основная проблема (с первого дня) заключается в том, как индексировать большие наборы линий / полигонов произвольного размера. Точечные данные не слишком сложны (см. Geohash, geomodel и т. Д.), Но наборы случайно сгруппированных малых / больших полигонов всегда были проблемой (а в некоторых случаях все еще остаются)
Я пробовал несколько разных версий пространственной индексации на GAE, но большинство из них - только варианты двух ниже. Ни один из них не был так быстр, как базы данных SQL, и у всех были свои плюсы и минусы. компромисс кажется разумным для большинства интернет-картографических приложений. Кроме того, два приведенных ниже должны быть связаны с отбраковкой геометрии в памяти (через JTS и т. Д.), Чтобы удалить любые функции, которые не соответствуют конечным параметрам поиска. и, наконец, они полагаются на специфические функции GAE, но я уверен, что это может быть применено к другим архитектурам (или использовать TyphoonAE для запуска на кластере Linux, ec2 и т. д.)
Сетки - упакуйте все функции для определенной области в известный индекс сетки. Поместите небольшой пространственный индекс в сетку, чтобы вы могли быстро перемещаться по набору объектов, которые он содержит. Для большинства запросов вам понадобится всего лишь несколько быстрых сеток, поскольку вы знаете точное соглашение о присвоении имен сетке и его отношение к K / V-сущностям (получает, а не запрашивает)
Плюсы - довольно быстрый, простой в реализации, не занимает памяти.
Минусы - необходима предварительная обработка, пользователь должен определить размер сетки, большие геомы разделяются на несколько сеток, кластеризация может вызвать перегрузку сеток, могут возникнуть проблемы с сериализацией / десериализацией (даже при сжатии через буферы протокола)
QuadKeys - это текущая реализация. в основном это то же самое, что и сетки, за исключением того, что нет установленного уровня сетки По мере добавления объектов они индексируются сеткой четырехугольников, которая полностью содержит их границы (или, в некоторых случаях, делятся на две части, когда нельзя использовать один четырехъядерный ключ, подумайте о дате). После того, как qk найден, его затем разбивают на максимальное число меньших qk, которые обеспечивают более точные представления зерна объекта. указатель / bbox на эту функцию затем упаковывается в облегченный индекс сетки (группа функций), который можно запрашивать (оригинальный дизайн запрашивал функции напрямую, но это оказалось слишком медленным / интенсивно использующим процессор в случаях, когда набор результатов был большим)
Polyline Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png
Polygon Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png
Соглашение об именах quadkey, использованное выше, хорошо известно и, что более важно, имеет тенденцию сохранять локальность (более подробно описано здесь )
Вышеупомянутый многоугольник выглядит примерно так: 0320101013123 03201010131212 03201010131213 0320101013132 0320101013133 03201010131302 03201010131302 032010101313002 0320101010131301010101010101010101010101010101010101010101010101010101310101010101310101310101010131010101010131010101010100
если границы запроса достаточно малы, вы можете получить их напрямую через qk. это оптимально, поскольку это только один пакетный вызов rpc в хранилище данных GAE. если границы достаточно велики, чтобы включить слишком много возможных qks (> 1000), вы можете альтернативно выполнить запрос, используя фильтр (например: qk> = 0320101013 и qk <= 0320101013 + \ ufffd). Соглашение об именах quadkey плюс способ, которым GAE индексирует строки, позволяет вышеприведенному запросу извлекать только существующие сетки, которые опускаются ниже этого значения qk.
Существуют и другие предостережения и проблемы с перфорированием, но, как правило, это делает возможным выполнение запросов на Quadkeys, что делает его возможным
примеры - запрос по округам США: геойсон
Плюсы - довольно быстро, нет конфигурации размера сетки, нет места в памяти, нет переполненных сеток
Минусы - необходима предварительная обработка, возможна перегрузка в некоторых сценариях, нет полярных данных
Кривые заполнения пространства - взгляните на выступление Альфреда NextGen Queries в Google I / O в этом году. Включение общих кривых заполнения пространства / времени вместе с новыми операторами MultiQuery (выполняемыми параллельно) позволит выполнить некоторые действительно классные пространственные запросы. Будет ли он побить традиционную производительность SQL? Трудно сказать, но это должно действительно хорошо масштабироваться. И мы быстро приближаемся к будущему, когда постоянно подключенные мобильные устройства всех форм / размеров значительно увеличат трафик на ваш сайт / услугу.
наконец, я также согласен с тем, что вам следует внимательно изучить проблемную область, прежде чем выбирать NoSQL вместо SQL. В нашем случае мне действительно понравилась модель ценообразования GAE, так что выбора действительно не было, но если вам не нужно масштабировать, сэкономьте время и просто используйте стандартный sql db