Модуль Python для хранения и запросов географических координат
Есть ли модуль Python, где я могу создавать объекты с координатой географического местоположения (широта и долгота) и запрашивать все объекты для тех, которые находятся на расстоянии 5 км (т.е. радиус) заданной координаты?
Я пытаюсь хранить широту и долготу как ключи в словарях (поскольку они индексируются по ключу) и использовать некоторые алгоритмы поиска расстояния для их запроса. Но это похоже на ужасный взлом.
По существу что-то вроде PostGIS для PostgreSQL, но все в моей памяти приложений на Python.
Ответы
Ответ 1
Да, попробуйте geopy.
import geopy
import geopy.distance
pt1 = geopy.Point(48.853, 2.349)
pt2 = geopy.Point(52.516, 13.378)
dist = geopy.distance.distance(pt1, pt2).km
# 878.25
после этого вы можете запросить свои списки точек:
[pt for pt in points if geopy.distance.distance(orig, pt).km < 5.]
Ответ 2
Я знаю, что это не совсем то, что вы имели в виду, но вы можете использовать GeoDjango с базой данных SQLite в памяти. Это полный набор инструментов ГИС, представленных в виде веб-приложения, что делает его швейцарским армейским ножом для быстро развивающихся приложений ГИС, особенно для небольших специальных запросов.
Ответ 3
Обычный подход в ГИС состоит в том, чтобы создать буфер вокруг интересующей точки и запросить пересечение. Как предлагает @RyanDalton, если вы планируете делать много материалов геолокации, используйте Shapely, GIS API для Python. Хорошо знать о Shapely, даже если вам все еще нужен пространственный индекс (см. Ниже). Вот как создать буферы в Shapely:
distance = 3
center = Point(1, 1)
pts = [Point(1.1, 1.2),Point(1.2,1.2)]
center_buf = a.buffer(distance)
#filters the points list according to whether they are contained in the list
contained = filter(center_buf.contains,pts)
Вы можете сами индексировать свои очки (например, долгота), если их не так много. В противном случае вы также можете использовать пакет Rtree, проверьте ссылку Использование Rtree в качестве дешевой пространственной базы данных!
Ответ 4
Ваша идея словаря звучит не так уж плохо, хотя вам понадобятся контрольные точки, которые также попадают под "соседние" словарные клавиши.
Если вы не можете найти нужный инструмент и, как алгоритмы кодирования, вы можете реализовать дерево двоичных разделов, которое afaik является менее хакерским способом достижения аналогичной вещи.
Ответ 5
Вы можете использовать SQLite, который имеет расширение Rtree для выполнения такого рода хранения и запросов. Этот подход полезен, если ваши данные больше, чем память, которую вы хотите использовать, или вы хотите сохранить и управлять данными между прогонами программы. Фактический код хранения и запроса находится в C, что означает, что он должен быть скомпилирован, но преимущество - это дополнительная производительность по сравнению с чистыми решениями Python, такими как география. Либо pysqlite, либо APSW будут работать для доступа SQLite. (Раскрытие: Я автор APSW.)
Ответ 6
Вы посмотрели Shapely? Он имеет несколько методов для запроса объектов на расстоянии. Взгляните на Двоичные пространственные предикаты. Это может быть просто то, что вы ищете.