2014-11-26 2 views
0

도시에 다른 사용자의 위치 정보를 1000000 개 저장하는 데이터베이스가 있다고 가정합니다. 목록이나 배열을 사용하여 모든 지오 코딩을 유지하고 거리를 하나씩 비교하는 경우 서버에서 SearchNearbyUsers(myLocation, 50) 명령을 실행하는 것은 힘들 것입니다.서버에서 "근처 사용자 검색"기능 구현

서버는 Web API 2를 사용하여 C#으로 코딩되었습니다. Geolocations와 같은 계산을 수행하도록 설계된 라이브러리가 있습니까?

사용할 수있는 라이브러리가없는 경우이 계산을 쉽게하기 위해 어떤 데이터 구조를 사용해야합니까? 나는 전에 R-tree을 보았지만 솔직히 말해 나는 논리를 분명히 이해하지 못하고 상당히 복잡해 보인다.

public class GeoLocation 
{ 
    public float latitude { get; set; } 
    public float longitude { get; set; } 
} 

는 위도와 경도 모두는 클라이언트가 전송됩니다 :

이 같은 위치 정보 클래스는 모습입니다. 값은 navigator.geolocation.getCurrentPosition()을 통해 얻습니다.

+0

MongoDB 또는 MySQL과 같은 데이터베이스 시스템을 사용하는 경우 작업을 수행 할 수 있습니다. 먼저 설정해야합니다. MySQL의 경우이 장을주의 깊게 읽으십시오 : http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html. 그렇지 않으면 (그리고 당신은 좋은 이유가 있기를 바란다.) R-trees는가는 길이다. 당신은 그것들을 공부해야 할 것이다! – Rerito

답변

3

일반적으로 이러한 공간 작업은 공간 인덱스를 사용하여 수행됩니다. R-Tress는 이것의 단지 하나의 복잡한 예일 뿐이지 만 더 단순한 R-Tress를 얻을 수도 있습니다. 전체 영역을 작은 조각 (예 : 직사각형)으로 나누고 해당 좌표 내에서 색인을 공유하는 영역 내에서 검색하면됩니다. 그래서 저는 여러분의 서버에서 공간 인덱스를 사용하도록 제안한 다음 GDAL과 같은 공간 라이브러리를 사용하도록 제안합니다.

만약 여러분이 좌표 (4,5)를 가지고 있다면, 여러분은 먼저 여러분의 포인트 주위에 witdh x의 버퍼를 가로 지르는 모든 직사각형을 보게 될 것입니다. 이제 직사각형 내에있는 모든 지오메트리를 검색하면됩니다.

EDIT : SQL Server에서는 해당 주변 기능을 검색하기 위해 공간 확장을 사용할 수도 있습니다 (here 참조). 기본적으로 STBuffer을 사용하여 입력 지오 메트릭 주위에 버퍼를 만들고 그 버퍼에서 교차를 수행하십시오. 설명 된 공간 인덱스를 사용하면 이러한 작업이 매우 빠릅니다.

+0

두 사용자가 실제로 서로 가깝지만 서로 다른 공간 블록에있는 경우 어떻게됩니까? –

+1

@AldourCheng, R-trees는 이런 종류의 문제를 피하도록 설계되었습니다. 쿼리 메커니즘은 주어진 공간 영역에서 (트리에 저장된) 모든 객체를 찾을 수 있도록합니다. 그들은 대개 DB 시스템에서 공간 인덱스의 핵심입니다. – Rerito

+1

그 이유는 내가 버퍼를 교차하는 사각형을 살펴 봤습니다. 따라서 단일 점에 대해 최대 4 개의 직사각형을 얻을 수 있습니다 (여전히 전체 영역을 검색하는 것이 훨씬 적음). – HimBromBeere

1

Mongo와 같은 데이터 저장소를 사용하는 경우 지형 공간 쿼리는 매우 쉽고 훌륭합니다. 여기에 있습니다 Docs

당신은 이런 식으로 뭔가를 시도해 볼 수 있습니다. 내가 최근에 프로젝트에서 위치 관련 데이터를 다운로드하는 데 클라이언트에서 사용하는 것입니다. 그것은 꿈입니다. 거리로 조회 할 때 북위 롱과 현실 세계에서의 위치를 ​​찾는

편집은, 가까운 쿼리를 사용하여 당신을 도울 것입니다 구형 인덱스

This Question를 사용해야 올바른 결과를 얻을 수 있습니다 몽고 C# 드라이버.

편집 2 MS SQL을 사용하여 당신에 대해 배우고 나면, 필립이 다른 대답으로 제공 한 유용한 링크가 있습니다.

Query Spatial Data For Nearest Neighbour
Spatial Data

+0

MS SQL 서버에 적용됩니까? –

+0

슬프게도, MongoDB는 그 자체로 데이터베이스입니다. MS SQL에 견고하게 묶여 있습니까? MS SQL을 사용하여 지형 공간 쿼리로 작업하는 장애가되고 있습니다. 몽고는 유일한 옵션조차 가지고 있지 않습니다. 지리 정보 쿼리에 대한 지원이 MS SQL보다 훨씬 많은 데이터베이스가 많이 있습니다. –

+0

정보를 제공해 주셔서 감사합니다. 그것은 MS SQL은 이제 공간 데이터를 처리하기위한 더 많은 기능을 추가하는 것 같습니다. PhillipH가 게시 한 링크를 언급하고 있습니다. –

2

초보자이고 나무를 피고 싶다면 ...

  1. 지원되는 지역의 격자 맵을 생성

    • 단순한 2D 셀 그리드
    • cell grid
    • 각 셀의 좌표를 가지고 i,j 또는 NI가 i 당 세포의 수는 인덱스 ix=i+j*ni
    • 그래서 각 점에 대해 간단하게 셀 소유권을 계산할 수 있습니다.
    • 각 셀마다 같은
    • 어떤 지점의 목록을 만들 :
    • Vector<int> map[nj][ni];
    • 셀 내부의 점 색인 목록을 채우기 ...
  2. 비교를

    • 사용자 셀 위치
    • 을 계산하고 해당 셀의 포인트와 8 개의 인접한 포인트 의 ...
    • 더 조밀 한 셀 그리드 더 속도, 당신은
    • 휴대가 비교 범위는 다음
    • 는 전체 범위를 커버하는 것이 비교보다 이웃보다 작은 경우
    • 안전하게
    • enter image description here
+0

모든 지리적 위치 데이터가 데이터베이스에 처음 저장되었지만 코드에 정의 된 사전에 저장되지 않으면 어떻게됩니까? –

+0

@AldourCheng 당신은 단순히 모든 점을 통과하는 for 루프를 작성하고이를 구현하기 전에 포인트 인덱스로 맵을 채울 수 있습니다. – Spektre

+0

@AldourCheng 유일한 중요한 단점은 모든 점을 삭제해야한다는 것입니다 포인트 인덱스는 삭제 된 인덱스를 1만큼 감소 시켜서 더 커집니다. 모든 셀에서. 하지만 그것은 포인트 목록에 _deleted 플래그를 추가하여 피할 수 있습니다 ... – Spektre