2009-01-14 11 views
4

지정된 경우 지정된 점의 경로 내에있는 약 5,00에서 좌표 집합을 찾는 가장 좋은 방법은 무엇이 될까요? 폭. 예 : 여러 웨이 포인트를 따르는 항공기.위도/경도 좌표 집합을 통해 복도 범위 검색을 수행하는 가장 좋은 방법

경로와 같은 순서로 정렬 할 수있는 좋은 방법이 있습니까?

제안 목록을 작성 중이므로 계산 속도가 정확도보다 더 중요합니다. 위도 저장

  1. 가장 좋은 방법을 : 내가 검토 한 바로는

    , 예를 들어, 나는 그것이 간단하지의 가정, 그리고 질문은 조금 넓은 이지만, 어떤 제안/포인터는 환영받을 것이다/긴, 또는 좌표 세트의 추가 클러스터링 정보를 갖는 구형 좌표

  2. 를 사용
  3. , 일부 종류의 변환 가능하면 범위 체크
  4. 포인트를 주문하는 가장 좋은 방법은 무엇입니까를 단순화하기 위해 사용할 수

경로를 따라 몇 개의 동등한 점에 대해 원형/사각형 검사를 수행하는 것보다 나은 접근법입니다.

답변

1

포인트와 경로 사이의 거리를 계산하는 방법을 알고 있다고 생각합니다. 위도/경도는 단순한 (x, y) 데이터이지만 정수가 아닌 소수 데이터가 있습니다.

5,000 데이터 포인트는 실제로 각 포인트의 경로까지의 거리를 계산하는 데 그리 좋지 않지만 규모를 원할 경우 쿼드 트리와 같은 일종의 관계형 데이터 구조가 포인트를 저장하는 가장 좋은 방법입니다 . 이렇게하면 경로 근처에없는 지점을 즉시 삭제할 수 있습니다. 당신이 저장하려고하는 어떤

0
Best way to store lat/long, or use spherical coordinates 

? 경로 또는 검색하려는 포인트? 그것의 경로라면, 그것은 근본적으로 어떤 종류의 목록입니다. 방법에 따라/경로를 조작하면 데이터 구조가 결정됩니다. 에서

갖는 추가 클러스터링 정보 좌표 설정이 저장하고자하는 정보가 무엇인지

? 예를 들어 링크 된 목록을 데이터 구조로 선택한 경우 필요한 모든 정보가 포함 된 클래스 객체의 링크 된 목록을 가질 수 있습니다.

는 당신은/긴 UTM 또는 다른 좌표계로 위도를 변환 할 수있는 범위 체크를

을 단순화하는 어떤 종류의 사용을 변환 할 수 있습니다. 두 점 사이의 범위는 여전히 동일합니다.

이 경로를 저장하는 경우 포인트

를 주문하는 가장 좋은 방법은 무엇입니까, 다음 순서 문제 - 포인트로 N-1 -> N -> N + 1, 및 등등 ...

2

당신이 할 수있는 많은 최적화가 있습니다

  • 분할에게 포인트를 고정 된 크기의 타일로 당신은 모든 지점을 확인하지 않아도이 (먼저중인 타일 결정 안으로, 그래서 너 다른 타일의 모든 점을 건너 뛸 수 있음).

  • 각 점까지의 거리를 계산할 때 일반적으로 피타고라스를 사용하여 거리를 구합니다. 그러나 가장 가까운 점만 알고 싶다면 비싼 연산 인 제곱근을 생략 할 수 있습니다 (아래 예제 코드 참조).

  • 위도/경도로 작업하는 대신 평면 투영법을 사용하거나 지구가 평평하다고 가정하여 대략적인 거리를 계산하십시오. 작은 거리 (수 킬로미터까지)의 경우 WGS84 좌표로 작업하는 것보다 일반적으로 정확하고 빠르고 쉽습니다. 좌표를 모두 변환해야 할 수도 있지만 사전 계산은 런타임에 많은 CPU주기를 절약 할 것입니다.

-

// delphi code that would iterate through a set of points to find the index 
// of the point that is the closest to the provided x/y 
function TMatcher.GetIndexOfClosest(X,Y:Double):Integer; 
var 
    i : Integer; 
    Closest:Double; 
    Distance:Double; 
begin 
    Closest:= MaxInt; 
    Result := -1; 
    for i:=0 to high(Points) do 
    begin 
    // taking the square root is not needed here! 
    Distance :=Sqr(X-Points[I].X)+Sqr(Y-Points[I].Y); 

    if Distance < Closest then 
    begin 
     Closest := Distance; 
     Result := i; 
    end; 
    end; 
end; 
1

이러한 유형의 문제에 직면했을 때, 나는 PostGIS을 사용하십시오. 데이터를 데이터베이스로 가져온 다음 공간 SQL 함수를 사용하여 트랙에 버퍼를 만들고 버퍼 내부에있는 점을 선택하십시오. 너 자신을 코딩하는 것보다 훨씬 빨리.

PostGIS (및 PostgreSQL)는 Windows/OSX/Linux에 설치하기 쉽습니다. 그들은 좋은 문서를 가지고 있으며 Google에서 간단한 세션을 통해 대부분의 질문에 대한 답을 찾습니다.