16

지리적 위치 좌표 (위도와 경도)로 객체를 생성 할 수있는 Python 모듈이 있으며, 모든 객체에 대해 5km 거리 (즉 반지름) 이내 인 객체를 질의합니다. 주어진 좌표?지리 좌표 저장 및 질의를위한 파이썬 모듈

위도와 경도를 사전에 키로 저장하려고했는데 (키로 색인화 됨) 거리 찾기 알고리즘을 사용하여 쿼리합니다. 그러나 이것은 끔찍한 해킹처럼 느껴집니다.

기본적으로 PostGIS 용 PostGIS와 비슷하지만 모두 내 파이썬 앱의 메모리 내에 있습니다.

답변

16

예, 시도하십시오 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.] 
+0

답을 고맙습니다. 내가 완전히 지오 코딩을위한 것이라고 생각했기 때문에 나는 goepy를 건너 뛰었습니다. 쿼리 예제에서'points'의 모든 객체를 반복하지 않습니까? PostGIS 색인 생성만큼 효율적이지는 않습니다 - 아마도 데이터베이스 접근 방식이 더 효율적 일 것입니다. –

+0

@Jonathan - 당신 말이 맞아요, 그것은 포인트의 전체 목록을 반복합니다. 지오픽 내에서 색인 생성 가능성에 대해서는 알지 못합니다. 어쩌면 뭔가를 찾을 수 있습니다. – eumiro

5

나는 이것이 당신이 무엇을 의미하는지 정확히 아니라는 것을 알고,하지만 당신은 메모리 SQLite 데이터베이스와 GeoDjango을 사용할 수 있습니다. 웹 응용 프로그램으로 공개 된 GIS 도구 모음으로 GIS 응용 프로그램을 신속하게 개발할 수있는 스위스 군용 칼입니다. 특히 임시 쿼리에 적합합니다.

1

사전 아이디어는 그다지 좋지 않지만 '인접한'사전 키에도 해당하는 포인트를 확인해야합니다.

올바른 도구를 찾을 수 없거나 코딩 알고리즘과 같은 경우 afaik가 유사한 문제를 해결하는 데 덜 까다로운 방법 인 바이너리 공간 파티션 트리를 구현할 수 있습니다.

0

Shapely을 보았습니까? 멀리 떨어져있는 객체를 쿼리하는 몇 가지 메소드가 있습니다. Binary Spatial Predicates을 살펴보십시오. 그것은 당신이 찾고있는 것일 수도 있습니다.

2

GIS의 일반적인 접근법은 관심 지점을 중심으로 버퍼를 만들고 교차점을 쿼리하는 것입니다. @RyanDalton은 Geolocation을 많이 할 계획이라면 GIS API for Python을 사용합니다. 여전히 공간적 색인 (아래 참조)이 필요한 경우에도 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 패키지를 사용할 수도 있습니다. Using Rtree as a cheapo spatial database 링크를 확인하십시오!

1

정확하게 저장 및 쿼리를 수행하기 위해 Rtree 확장자를 가진 SQLite를 사용할 수 있습니다. 이 방법은 데이터가 사용하려는 메모리보다 크거나 프로그램 실행간에 데이터를 저장하고 조작하려는 경우에 유용합니다. 실제 저장 및 쿼리 코드는 C로 컴파일되어야하지만, 이점은 지리와 같은 순수 Python 솔루션에 비해 추가 성능입니다. pysqlite 또는 APSW는 SQLite 액세스를 위해 작동합니다. (공개 : 저는 APSW 저자입니다.)