Геохеш
Geohash — это общедоступная система геокодирования, изобретенная в 2008 году Густаво Нимейером. [1] который кодирует географическое местоположение в короткую строку букв и цифр. Подобные идеи были выдвинуты Дж. М. Мортоном в 1966 году. [2] Это иерархическая пространственная структура данных, которая подразделяет пространство на сегменты в форме сетки , что является одним из многих применений так называемой кривой Z-порядка и, как правило, кривых, заполняющих пространство .
Геохэши обладают такими свойствами, как произвольная точность и возможность постепенного удаления символов из конца кода, чтобы уменьшить его размер (и постепенно потерять точность). Геохеширование гарантирует, что чем длиннее общий префикс между двумя геохешами, тем пространственно они ближе друг к другу. Обратное не гарантируется, поскольку две точки могут быть очень близки, но иметь короткий общий префикс или вообще не иметь его.
История
[ редактировать ]Основная часть алгоритма Geohash и первая инициатива по созданию аналогичного решения были задокументированы в отчете Г. М. Мортона в 1966 году «Компьютерно-ориентированная база геодезических данных и новый метод упорядочения файлов». [2] Работа Мортона использовалась для эффективных реализаций кривой Z-порядка , как в этой современной (2014 г.) версии Geohash-integer (основанной на прямом чередовании 64-битных целых чисел ), но его геокодирования предложение не было удобочитаемым для человека и не пользовалось популярностью.
Судя по всему, в конце 2000-х годов Г. Нимейер еще не знал о работе Мортона и изобрел ее заново, добавив использование представления base32 . В феврале 2008 года, одновременно с анонсом системы, [1] он запустил сайт http://geohash.org
, который позволяет пользователям преобразовывать географические координаты в короткие URL-адреса , которые однозначно идентифицируют местоположение на Земле , чтобы сделать ссылку на них в электронной почте , на форумах и веб-сайтах более удобной.
Было разработано множество вариантов, включая OpenStreetMap . короткую ссылку [3] (с использованием base64 вместо base32) в 2009 году 64-битный Geohash [4] в 2014 году экзотический Гильберт-Геохаш [5] в 2016 году и другие.
Типичные и основные варианты использования
[ редактировать ]Чтобы получить Geohash, пользователь предоставляет адрес для геокодирования или координаты широты и долготы в одном поле ввода (принимаются наиболее часто используемые форматы для пар широты и долготы) и выполняет запрос.
Помимо отображения широты и долготы, соответствующих данному Geohash, пользователям, которые переходят к Geohash на сайте geohash.org, также предоставляется встроенная карта, и они могут загрузить файл GPX или передать путевую точку непосредственно на определенные GPS- приемники. Также предоставляются ссылки на внешние сайты, которые могут предоставить дополнительную информацию по указанным вопросам.расположение.
Например, пара координат 57.64911,10.40744
(около оконечности полуострова Ютландия , Дания ) производит немного более короткий хэш u4pruydqqvj
.
Основные области применения геохэшей:
- В качестве уникального идентификатора.
- Для представления точечных данных, например, в базах данных.
Также было предложено использовать геохеши для геотегирования .
При использовании в базе данных структура геохешированных данных имеет два преимущества. Во-первых, данные, проиндексированные геохешем, будут содержать все точки для данной прямоугольной области в смежных срезах (количество срезов зависит от требуемой точности и наличия «линий разлома» геохеша). Это особенно полезно в системах баз данных, где запросы к одному индексу намного проще или быстрее, чем запросы к нескольким индексам. Во-вторых, эту структуру индекса можно использовать для быстрого поиска близости: ближайшие точки часто находятся среди ближайших геохешей.
Техническое описание
[ редактировать ]Формальное описание вычислительных и математических представлений.
Текстовое представление
[ редактировать ]Для точных переводов широты и долготы Geohash представляет собой пространственный индекс с основанием 4 , поскольку он преобразует непрерывные координаты пространства широты и долготы в иерархическую дискретную сетку, используя повторяющиеся четыре раздела пространства. Чтобы быть компактным кодом, он использует базу 32 и представляет свои значения в следующем алфавите, который является «стандартным текстовым представлением».
Десятичный | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
База 32 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | б | с | д | и | ж | г | |||
Десятичный | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
База 32 | час | дж | к | м | н | п | д | р | с | т | в | v | В | х | и | С |
«Алфавит Геохэша» (32ghs) использует все цифры 0–9 и все строчные буквы, кроме «a», «i», «l» и «o».
Например, используя приведенную выше таблицу и константу , Геохэш ezs42
может быть преобразовано в десятичное представление с помощью обычной позиционной записи :
- [
ezs42
] 32 гс =
- =
- =
- = =
Геометрическое представление
[ редактировать ]Геометрия Geohash имеет смешанное пространственное представление:
- Геохэши с 2, 4, 6, ... e цифрами ( четными цифрами) представлены кривой Z-порядка в «регулярной сетке», где декодированная пара (широта, долгота) имеет равномерную неопределенность, действительную как Geo URI .
- Геохеши с 1, 3, 5, ... d цифрами (нечетными цифрами) представлены «кривой И-порядка». Широта и долгота декодированной пары имеют разную неопределенность (долгота усекается).
Построить «кривую И-порядка» можно из кривой Z-порядка, объединив соседние ячейки и проиндексировав полученную прямоугольную сетку функцией . На иллюстрации показано, как получить сетку из 32 прямоугольных ячеек из сетки из 64 квадратных ячеек.
Самым важным свойством Geohash для человека является то, что он сохраняет пространственную иерархию в префиксах кода .
Например, на иллюстрации «Сетка из 1 цифры Geohash» из 32 прямоугольников выше пространственная область кода e
(прямоугольник серовато-синего круга в позиции 4,3) сохраняется с префиксом e
в «двухзначной сетке» из 1024 прямоугольников (масштаб показывает em
и серовато-зеленые или синие круги на сетке).
Алгоритм и пример
[ редактировать ]Использование хеша ezs42
в качестве примера, вот как оно расшифровывается в десятичные широту и долготу. Первым шагом является декодирование его из текстовой « базы 32ghs », как показано выше, для получения двоичного представления:
- .
В результате этой операции биты 01101
11111
11000
00100
00010
. Начиная отсчет слева с цифры 0 на первой позиции, цифры на четных позициях образуют код долготы ( 0111110000000
), а цифры на нечетных позициях образуют код широты ( 101111001001
).
Каждый двоичный код затем используется в серии делений, рассматривая по одному биту, снова слева направо. Для значения широты интервал от -90 до +90 делится на 2, образуя два интервала: от -90 до 0 и от 0 до +90. Поскольку первый бит равен 1, выбирается более высокий интервал, который становится текущим интервалом. Процедура повторяется для всех битов кода. Наконец, значение широты является центром полученного интервала. Долготы обрабатываются аналогичным образом, учитывая, что начальный интервал составляет от -180 до +180.
Например, в коде широты 101111001001
, первый бит равен 1, поэтому мы знаем, что наша широта находится где-то между 0 и 90. Без дополнительных битов мы бы предположили, что широта равна 45, что дает нам ошибку ±45. Поскольку доступно больше битов, мы можем продолжить со следующего бита, и каждый последующий бит уменьшает эту ошибку вдвое. В этой таблице показано влияние каждого бита. На каждом этапе соответствующая половина диапазона выделяется зеленым цветом; младший бит выбирает нижний диапазон, высокий бит выбирает верхний диапазон.
В столбце «Среднее значение» указана широта, просто среднее значение диапазона. Каждый последующий бит делает это значение более точным.
Код широты 101111001001 | ||||||
---|---|---|---|---|---|---|
позиция бита | битовое значение | мин | середина | Макс | среднее значение | максимальная ошибка |
0 | 1 | -90.000 | 0.000 | 90.000 | 45.000 | 45.000 |
1 | 0 | 0.000 | 45.000 | 90.000 | 22.500 | 22.500 |
2 | 1 | 0.000 | 22.500 | 45.000 | 33.750 | 11.250 |
3 | 1 | 22.500 | 33.750 | 45.000 | 39.375 | 5.625 |
4 | 1 | 33.750 | 39.375 | 45.000 | 42.188 | 2.813 |
5 | 1 | 39.375 | 42.188 | 45.000 | 43.594 | 1.406 |
6 | 0 | 42.188 | 43.594 | 45.000 | 42.891 | 0.703 |
7 | 0 | 42.188 | 42.891 | 43.594 | 42.539 | 0.352 |
8 | 1 | 42.188 | 42.539 | 42.891 | 42.715 | 0.176 |
9 | 0 | 42.539 | 42.715 | 42.891 | 42.627 | 0.088 |
10 | 0 | 42.539 | 42.627 | 42.715 | 42.583 | 0.044 |
11 | 1 | 42.539 | 42.583 | 42.627 | 42.605 | 0.022 |
Код долготы 0111110000000 | ||||||
---|---|---|---|---|---|---|
позиция бита | битовое значение | мин | середина | Макс | среднее значение | максимальная ошибка |
0 | 0 | -180.000 | 0.000 | 180.000 | -90.000 | 90.000 |
1 | 1 | -180.000 | -90.000 | 0.000 | -45.000 | 45.000 |
2 | 1 | -90.000 | -45.000 | 0.000 | -22.500 | 22.500 |
3 | 1 | -45.000 | -22.500 | 0.000 | -11.250 | 11.250 |
4 | 1 | -22.500 | -11.250 | 0.000 | -5.625 | 5.625 |
5 | 1 | -11.250 | -5.625 | 0.000 | -2.813 | 2.813 |
6 | 0 | -5.625 | -2.813 | 0.000 | -4.219 | 1.406 |
7 | 0 | -5.625 | -4.219 | -2.813 | -4.922 | 0.703 |
8 | 0 | -5.625 | -4.922 | -4.219 | -5.273 | 0.352 |
9 | 0 | -5.625 | -5.273 | -4.922 | -5.449 | 0.176 |
10 | 0 | -5.625 | -5.449 | -5.273 | -5.537 | 0.088 |
11 | 0 | -5.625 | -5.537 | -5.449 | -5.581 | 0.044 |
12 | 0 | -5.625 | -5.581 | -5.537 | -5.603 | 0.022 |
(Числа в таблице выше для ясности округлены до 3 знаков после запятой)
Окончательное округление следует производить осторожно, чтобы
Таким образом, хотя округление 42,605 до 42,61 или 42,6 является правильным, округление до 43 — нет.
Цифры и точность в км
[ редактировать ]длина геохеша | широтные биты | СПГ биты | лат ошибка | ошибка сжиженного газа | ошибка км |
---|---|---|---|---|---|
1 | 2 | 3 | ±23 | ±23 | ±2500 км (1600 миль) |
2 | 5 | 5 | ±2.8 | ±5.6 | ±630 км (390 миль) |
3 | 7 | 8 | ±0.70 | ±0.70 | ±78 км (48 миль) |
4 | 10 | 10 | ±0.087 | ±0.18 | ±20 км (12 миль) |
5 | 12 | 13 | ±0.022 | ±0.022 | ±2,4 км (1,5 мили; 2400 м) |
6 | 15 | 15 | ±0.0027 | ±0.0055 | ±0,61 км (0,38 миль; 610 м) |
7 | 17 | 18 | ±0.00068 | ±0.00068 | ±0,076 км (0,047 миль; 76 м) |
8 | 20 | 20 | ±0.000085 | ±0.00017 | ±0,019 км (0,012 миль; 19 м) |
Ограничения при использовании для определения близости
[ редактировать ]Краевые случаи
[ редактировать ]Геохеши можно использовать для поиска точек, находящихся рядом друг с другом, на основе общего префикса. Однако местоположения в крайнем случае , расположенные близко друг к другу, но на противоположных сторонах меридиана 180 градусов, приведут к появлению кодов Geohash без общего префикса (разные долготы для близких физических местоположений). Точки, расположенные вблизи Северного и Южного полюсов, будут иметь очень разные геохеши (разные долготы для близких физических местоположений).
Два близких места по обе стороны экватора (или Гринвичского меридиана) не будут иметь длинного общего префикса, поскольку принадлежат разным «половинам» мира. Проще говоря, двоичная широта (или долгота) одного местоположения будет 011111..., а другого - 100000...., поэтому у них не будет общего префикса, и большинство битов будут перевернуты. Это также можно рассматривать как следствие использования кривой Z-порядка (которую в данном случае правильнее было бы назвать посещением N-порядка) для упорядочивания точек, поскольку две близлежащие точки могут быть посещены в очень разное время. Однако две точки с длинным общим префиксом окажутся рядом.
Чтобы выполнить поиск близости, можно вычислить юго-западный угол (низкий геохэш с низкой широтой и долготой) и северо-восточный угол (высокий геохеш с высокой широтой и долготой) ограничивающего прямоугольника и найти геохеши между этими двумя. Этот поиск найдет все точки кривой z-порядка между двумя углами, которых может быть слишком много. Этот метод также не работает на 180 меридианах и полюсах. Solr использует список фильтров префиксов, вычисляя префиксы ближайших квадратов, близких к геохешу [1] .
Нелинейность
[ редактировать ]Поскольку геохэш (в этой реализации) основан на координатах долготы и широты, расстояние между двумя геохешами отражает расстояние в координатах широты/долготы между двумя точками, которое не преобразуется в фактическое расстояние, см. формулу Хаверсинуса .
Пример нелинейности для системы широта-долгота:
- На экваторе (0 градусов) длина градуса долготы составляет 111,320 км, а градуса широты — 110,574 км, ошибка 0,67%.
- На 30 градусах (средние широты) ошибка составляет 110,852/96,486 = 14,89%.
- При 60 градусах (Высокая Арктика) ошибка составляет 111,412/55,800 = 99,67%, достигая бесконечности на полюсах.
Обратите внимание, что эти ограничения связаны не с геохешированием и не с координатами широты и долготы, а с трудностью сопоставления координат на сфере (нелинейного и с переносом значений, аналогично арифметике по модулю) в двумерные координаты и сложность равномерного исследования двумерного пространства. Первый связан с географической системой координат и картографической проекцией , а другой — с кривой Гильберта и кривой z-порядка . Как только будет найдена система координат, которая представляет точки линейно по расстоянию и охватывает края и может быть исследована равномерно, применение геохеширования к этим координатам не будет страдать от вышеперечисленных ограничений.
Хотя можно применить геохеширование к области с декартовой системой координат , в этом случае оно будет применяться только к той области, к которой применяется эта система координат.
Несмотря на эти проблемы, существуют возможные обходные пути, и алгоритм успешно используется в Elasticsearch. [6] МонгоДБ, [7] HBase, Редис, [8] и накопление [9] для реализации поиска по близости.
Похожие системы индексации
[ редактировать ]Альтернативой хранению геохешей в виде строк в базе данных являются коды местоположения , которые также называются пространственными ключами и похожи на QuadTiles. [10] [11]
В некоторых географических информационных системах и данных больших данных пространственных базах индексация на основе кривой Гильберта может использоваться в качестве альтернативы кривой Z-порядка , как в библиотеке S2 Geometry . [12]
В 2019 году интерфейс разработала компания QA Locate. [13] в том, что они назвали GeohashPhrase [14] использовать фразы для кодирования геохэшей для облегчения общения на разговорном английском языке. Были планы сделать GeohashPhrase открытым исходным кодом. [15]
- C-квадраты (2002)
- GeoKey (2018, собственная разработка)
- Почта Ганы GPS (2017)
- Локаторная система Мейденхеда (1980)
- Код Макани (2011)
- Код карты (2008)
- Справочная система военной сети
- Код природной территории
- Открытый код местоположения (2014 г., он же «плюс-коды», Google Maps )
- QRA-локатор (1959 г.)
- Универсальная поперечная система координат Меркатора
- What3words (2013, собственность)
- WhatFreeWords
- Международная система почтовых индексов с использованием кубических метров (CubicPostcode.com)
- GEOREF (аналогичный двухзначный иерархический код)
- Xадрес
- 3Geonames (2018, с открытым исходным кодом)
Лицензирование
[ редактировать ]Алгоритм Geohash был выложен в общественное достояние его изобретателем в публичном объявлении 26 февраля 2008 года. [16]
Хотя сопоставимые алгоритмы были успешно запатентованы [17] ибыли заявлены авторские права, [18] [19] GeoHash основан на совершенно другом алгоритме и подходе.
Формальный стандарт
[ редактировать ]Geohash стандартизирован как CTA-5009. [20] Этот стандарт соответствует статье Википедии версии 2023 года, но содержит дополнительную информацию в формальной (нормативной) ссылке. В отсутствие официальной спецификации с момента создания Geohash организация CTA WAVE опубликовала CTA-5009, чтобы способствовать более широкому внедрению и совместимости среди разработчиков в отрасли.
См. также
[ редактировать ]- Список систем геодезического геокодирования
- Geohash-36 (не является вариантом Geohash)
- Сетка (пространственный индекс)
- Локаторная система Мейденхеда
- Справочная система военной сети
- Число Мортона (теория чисел)
- Код природной территории
- Схема нумерации
- Открыть код местоположения (плюс код)
- кривые, заполняющие пространство
- какие3 слова
- Кривая Z-порядка
Ссылки
[ редактировать ]- ^ Jump up to: а б Доказательства в Wayback Machine :
- ^ Jump up to: а б Г.М. Мортон (1966) «Компьютерно-ориентированная база геодезических данных и новый метод упорядочения файлов». Архивировано 25 января 2019 г. в Wayback Machine . Отчет в IBM Canada.
- ^ OpenStreetMap , Короткая ссылка , задокументированная на wiki.openstreetmap.org была выпущена в 2009 году имеет тот же исходный код и спустя 10 лет . Он основан на чересстрочном алгоритме Мортона .
- ^ «64-битные двоичные файлы Geohash» имеют классические решения, такие как yinqiwen/geohash-int , и оптимизированные решения, такие как mmcloughlin/geohash-assembly .
- ^ Вукович, Тибор (2016). Гильберт-Геохэш — хеширование данных географических точек с использованием кривой заполнения пространства Гильберта . 70 (Диссертация). HDL : 11250/2404058 .
- ^ Тип данных geo_shape в Elasticsearch
- ^ Геопространственное индексирование в MongoDB
- ^ Руководство по командам Redis
- ^ Пространственно-временное индексирование в нереляционных распределенных базах данных
- ^ Пространственные ключи
- ^ QuadTiles
- ^ «Библиотека геометрии S2» для оптимизированной пространственной индексации, https://s2geometry.io. Архивировано 11 декабря 2023 г. на Wayback Machine.
- ^ «QA Locate | Сила точного определения местоположения» . Контроль качества Найдите . Проверено 10 июня 2020 г.
- ^ «ГеохэшФраза» . Контроль качества Найдите . 17 сентября 2019 г. Проверено 10 июня 2020 г.
- ^ thelittlenag (11 ноября 2019 г.). «В QA Locate мы работаем над решением, которое называем GeohashPhrase | Hacker News» . news.ycombinator.com . Проверено 10 июня 2020 г.
- ^ Сообщение с объявлением geohash.org на форуме groundpeak.com. См. также «Путь 2018 года» по адресу https://web.archive.org/web/20180309054335/https://forums.geocaching.com/GC/index.php?/topic/186412-geohashorg/web.archive.org/web. /20180309054335
- ^ Компактное текстовое кодирование координат широты и долготы - Патент 20050023524.
- ^ Нарушает ли Microsoft систему кодирования естественной территории? Архивировано 28 декабря 2010 г. в Wayback Machine.
- ^ «Система кодирования природных территорий – юридическое право и лицензирование» . Архивировано из оригинала 23 мая 2019 г. Проверено 26 февраля 2008 г.
- ^ «Быстрое и читаемое географическое хеширование (CTA-5009)» . Ассоциация потребительских технологий® . Проверено 4 марта 2024 г.