Обратное геокодирование без веб-доступа
Я работаю над приложением, в котором одно из требований заключается в том, чтобы я мог выполнять операции обратного геокодирования в реальном времени на основе данных GPS. В частности, я должен быть в состоянии определить штат / провинцию, в которой отображаются пары широты и долготы, и определить, когда мы перешли из одного штата / провинции в другой.
У меня пока есть пара идей, но я удивляюсь, есть ли у кого-нибудь какие-либо идеи по одному из следующих:
- Каков наилучший подход для эффективного решения этой проблемы?
- Где найти хорошее место и какой формат подходит для границ штатов / провинций Северной Америки?
Для начала вот две основные идеи, которые у меня есть:
- Разбейте Северную Америку на сетку, чтобы каждый прямоугольник в сетке отображал провинцию определенного штата. Сделайте поиск по этой таблице (которая растет быстрее, чем точнее вы хотели бы быть) на основе широты, а затем долготы (или наоборот).
- Определите полигоны для каждого из состояний и сделайте какой-то расчет, чтобы определить, в каком полигоне лежит пара широта / долгота. Я не уверен, как именно это сделать. Карты изображений HTML приходят на ум как один из способов определения границ для штата / провинции.
Я работаю в Python для заинтересованных или тех, у кого может быть хорошая библиотека, которую они хотели бы предложить.
Чтобы быть понятным... У меня нет доступа в Интернет для меня, поэтому использование существующего сервиса обратного геокодирования не вариант во время выполнения
7 ответов
Я предлагаю использовать вариант вашей первой идеи: использовать пространственный индекс. Пространственный индекс - это структура данных, построенная из прямоугольников, отображающих широту / долготу в полезную нагрузку. В этом случае вы, вероятно, сопоставите прямоугольники с парами штат-провинция. R-дерево может быть хорошим вариантом. Вот пакет Python для R-дерева. Вы можете обнаружить роуминг, сравнивая результаты последовательных поисков.
Я создал автономный модуль обратного геокодирования для стран: https://bitbucket.org/richardpenman/reverse_geocode
>>> import reverse_geocode
>>> coordinates = (-37.81, 144.96), (31.76, 35.21)
>>> reverse_geocode.search(coordinates)
[{'city': 'Melbourne', 'code': 'AU', 'country': 'Australia'},
{'city': 'Jerusalem', 'code': 'IL', 'country': 'Israel'}]
Я посмотрю, смогу ли я добавить данные для штатов.
Я бы держался подальше от реализации собственного решения с нуля. Это довольно большое мероприятие, и уже есть инструменты для этого. Если вы ищете подход с открытым исходным кодом (читай: бесплатно), взгляните на этот пост в блоге: Использование PostGIS для обратного геокодирования.
Если вы можете получить границы состояний в виде многоугольников (например, через OpenStreetMap), определение текущего состояния - это просто проверка точки в многоугольнике.
Если вам нужны адресные данные, автономным решением будет использование Microsoft Mappoint.
Вы можете получить данные по всем Соединенным Штатам из открытой карты улиц. Затем вы можете извлечь необходимые данные, например, города или штаты, в любой формат, наиболее подходящий для вашего приложения. Обратите внимание, что, хотя качество данных хорошее, оно не гарантирует полной точности, поэтому, если вам нужна полная точность, вам, возможно, придется поискать что-то другое.
У меня есть база данных со всеми этими данными и некоторыми инструментами доступа. Я сделал мой из данных тигра переписи. Я предполагаю, что это будет в основном экспорт моей базы данных в sqlite и небольшой перевод кода.
Разработанный мной бесплатный сервис обратного геокодирования (www.feroeg.com) основан на пространственной библиотеке sqlite, реализующей пространственные возможности SQL (r-дерево). Данные импортируются из OpenStreetMap (страна, города, улицы, номера улиц) и OpenAddresses (номера улиц) с использованием собственных инструментов. Весь мир потребляет около 250 ГБ. Существует документ, описывающий архитектуру сервиса:https://feroeg.com/Feroeg_files/Feroeg Presentation.pdf.
На данный момент проект (импортер и сервер) закрыт.
Библиотека обратного геокодирования (C++) и инструменты преобразования доступны по запросу.