Как вы идентифицируете точки GeoHash, которые НЕ находятся над сушей?

У меня есть список координат широты/долготы, которые я преобразовал в GeoHash. Моя цель - идентифицировать точки, которые, как сообщается, находятся над водой (океаны, моря и т. Д. За пределами границ любых стран). У меня также есть набор данных всех форм границ всех стран мира по широте/долготе, преобразованный в GeoHash.

Поэтому для данной точки GeoHash я пытаюсь классифицировать ее как над (международной) водой или нет. Я думал о выборе точек вручную посреди океана и использовании короткого префикса GeoHash для создания большого ящика в океане, но это довольно ограничено.

Возможно, вообще есть способ понять, что значит быть точкой GeoHash за пределами каких-либо стран?


person Zack    schedule 04.11.2019    source источник


Ответы (1)


Это не очень хорошее использование геохэша. Geohash хорош для определения конкретных точек, но не подходит для описания сложных форм, таких как границы страны или океан.

Я думал о выборе точек вручную посреди океана и использовании короткого префикса GeoHash для создания большого ящика в океане, но это довольно ограничено.

Да, это даст очень неточный результат. Что вам нужно, так это проверить каждую точку, принадлежит ли она полигону какой-либо страны. Как вы это сделаете, зависит от платформы, которую вы используете, например. в SQL вы запускаете запрос ST_Intersects(point, country).

Я бы просто конвертировал геохеш обратно в пару широта/долгота и проверял их.

Если вы хотите использовать геохэш или у вас слишком много (миллиардов) точек, вы можете использовать трюк с коротким префиксом GeoHash, но вам нужно будет использовать много префиксов для представления каждого океана. Что-то вроде следующего, используя дерево префиксов:

  • начните с длины GeoHash из пары букв,
  • для каждой возможной строки GeoHash вычислить, полностью ли ее поле содержится в океане или суше (используя ST_Intersects или аналогичный точный метод).
  • если весь ящик принадлежит одному классу - добавить его в дерево префиксов.
  • если нет — добавляем еще буквы (опять же, все возможные комбинации) и продолжаем рекурсивно до некоторого предела, на котором нужно остановиться.

После того, как вы построили такое дерево, вы можете использовать GeoHash для быстрого поиска ответа в этом дереве.

person Michael Entin    schedule 04.11.2019
comment
Спасибо за ваш вклад, но уточню/отвечу на несколько пунктов: Прямо сейчас у меня есть данные о Redshift (поэтому с использованием SQL). Насколько мне известно, в Redshift нет встроенных геопространственных инструментов для вычисления точек внутри многоугольников. И это в Redshift, потому что там около 32 миллиардов точек. Вот почему я использовал GeoHash. Я не понимаю, как применить для каждой возможной строки GeoHash, вычислить, полностью ли ее поле содержится в океане или суше (используя ST_Intersects или аналогичный точный метод). Поскольку это похоже на суть проблемы с самого начала (?). Благодарю. - person Zack; 04.11.2019
comment
Для начала сгенерируйте все возможные трехбуквенные значения геохэша, их около 30 000. В некоторых БД с пространственной поддержкой, таких как Postgres с PostGIS или Google BigQuery, проверьте, принадлежат ли точки, соответствующие этим значениям, океану. Экспортируйте результат в Redshift и присоединяйтесь к 3-буквенному префиксу. Это даст вам около 78 км погрешности. Вы можете улучшить его, используя более длинные префиксы, где поле geohash разрешается как сочетание земли и океана. - person Michael Entin; 05.11.2019