2013-09-22 5 views
0

현재 데이터 세트가 있는데, JSON 파일에 저장되어 있습니다. 여기에는 약 40,000 개의 서로 다른 위치 정보가 들어 있습니다. 다음과 같이 보입니다."인접한"결과 검색

[ 
    {"title": "Place 1", "loc": {"x": "00.000", "y": "00.00000"}}, 
    {"title": "Place 2", "loc": {"x": "00.000", "y": "00.00000"}}, 

] 

장소의 loc은 좌표계입니다.

이 데이터에 대한 쿼리를 실행할 수 있기를 원합니다. 주어진 사용자 입력에 대해 loc을 입력하면 n에 가장 가까운 지역 정보를 얻을 수 있습니다.

또는 다른 말로 나는이 작동하도록 일부 기능 f을 쓰고 싶습니다

def f(loc, n): ... 
f({"x": "5", "y": "5"}, 3) #=> [{"title": "Place 1", "distance": 7.073}, {"title": "Place 2": "distance": 7.073}, {"title": "Place 3", "distance": 7.073}] 

모든 {x: 0, y: 0}의 장소 1, 2, 3이있는 경우.

이런 문제를 해결하는 표준 방법이 무엇인지 전혀 알지 못합니다. 제공된 loc은 임의적이기 때문에 사전 계산 된 거리에 대한 인덱스가있는 SQL DB를 사용하면 작동하지 않습니다. 전체 데이터베이스를 실행하고 모든 것에 대한 거리를 계산하는 것은 너무 비효율적이며 너무 느립니다. (< 30ms 응답 시간이 필요합니다.)

의미가있는 유일한 해결책은 가까운 위치의 "버켓"을 만드는 것입니다 (서로 r 내). 그런 다음 컴퓨터에 사용자가 지정한 loc 옵션을 먼저 좁힐 수있는 양동이가 있습니다. 하지만 나는 데이터베이스를 전혀 사용하지 않는 것과 비슷한 솔루션을 만들어야한다고 생각합니다. 보다 효율적인/산업 표준 접근 방식이 있어야합니다. 하나 있습니까?

+0

Postgres (PostGIS 확장 기능 포함)는 이러한 유형의 쿼리를 매우 잘 지원합니다. –

답변

0

이것은 nearest neighbor (더 공식적으로 k-nearest neighbor으로 알려짐)의 일반화 된 형식입니다. 맞습니다. solution that makes sense은 버킷을 사용합니다. 버킷을 데이터베이스에 저장하면 SQL을 활용하고 적절한 버킷에없는 모든 지점을 필터링 할 수 있습니다. Depending on your database이 실제로 이미 구현되었을 수 있습니다. 제안한 업계 표준 접근 방식입니다.

그렇지 않으면 직접 작성하는 것이 매우 효율적이며 데이터베이스에서 너무 많이 벗어나지 않고도 수행 할 수 있습니다.

0

포인트 데이터 유형 및 공간 색인 (예 : MySQL)을 사용할 수 있습니다. 쿼드 키 또는 쿼드 트리를 사용할 수도 있습니다. 그것은 비행기를 세분하고 차원을 줄입니다. PHP 클래스 Hilbert-curve @ phpclasses.org를 다운로드 할 수 있습니다. 쿼드 키를 사용하여 버킷으로 위치를 구성하고 근접 검색을 구축하는 데 도움이 될 수 있습니다. 쿼드 키를 사용하면 특수 데이터베이스로 인해 중복 검색을 줄일 수 있습니다.

0

오라클은 공간 데이터 기능을 제공합니다. 그것은 가장 가까운 이웃 함수 인 SDO_NN을 가지고 있습니다. 오라클 만이 모든 데이터를 db로 저장하고 나머지는 oracle db가 관리합니다.