Как использование кривой Гильберта в Google S2 решает (если нет, минимизирует) проблему более близких ячеек, имеющих разные значения префикса, как в Geohash?
В случае GeoHash две близкие точки могут иметь совершенно разные хеш-значения, что делает невозможным сравнение префиксов. Это связано с тем, что где-то в линии предков есть раскол (в географической группировке).
Как S2 пытается решить эту проблему с целью запроса? Я прочитал кучу сообщений на S2, но ничего не понял.
1 ответ
Я бы не сказал, что S2 решает эту проблему. Две близкие точки могут иметь совершенно разные идентификаторы ячеек в S2. Можно утверждать, что кривая Гильберта S2 делает его несколько менее распространенным, чем Z-кривая, используемая GeoHash, но основная проблема остается.
Когда вы используете S2, вы обычно не используете сравнение префиксов, вы используете интервальный поиск. В качестве альтернативы вы вычисляете несколько возможных префиксов в пределах определенного радиуса точки и выполняете их поиск. Конечно, вы можете использовать оба этих подхода и с GeoHash.
S2 решает другую проблему с GeoHash, что делает непрактичным использование GeoHash для поиска поблизости, за исключением локальных случаев: очень разные размеры и геометрия ячеек. Ячейки GeoHash около полюсов намного меньше (в реальной области), чем ячейки того же уровня около экватора. Неполярные ячейки GeoHash также растянуты. Клетки S2 более равномерны по всему миру.