2010-12-07 4 views
5

지리적 포인트 (위도와 경도는 십진수 값) 인 데이터베이스 테이블을 약 1000 포인트 내 안드로이드 애플리케이션에 가지고 있습니다. 그리고 주어진 지리적 위치에 가장 가까운 20 점을 선택해야합니다.다음 N 가까운 지오 포인트 얻기

나는 2 개의 지리적 포인트 사이의 거리를 계산하는 방법에 대한 답변을 Stackoverflow에서 발견했으며 내 쿼리를 작성할 때까지 매우 행복했습니다. 나는 안드로이드의 내장 sqlite에서 trignometrical 함수를 사용할 수 없다는 것을 알아 냈습니다.

하지만 아이디어가 있습니다. 나는 거리를 계산할 필요가 없다. 가까운 지점은 다른 지점으로, 지리적 좌표의 작은 차이가 있어야합니다.

어떻게이 사실을 사용할 수 있습니까? lat_0과 lon_0이 주어진 점의 지리 좌표 인 곳에 (lat_0 - lat_n)^2 + (lon0 - lon_n)^2만큼 저장된 점을 주문하는 것만으로도 충분합니까?

뮤르

그래서, 내 질문에 대한 답을 얻을 수있는 가장 좋은 방법은 내가 위에서 설명하는 방법을 테스트했다 UPD를 주셔서 감사합니다.

꽤 잘 작동하지만 정확한 거리와 정확히 일치하지는 않습니다.

거리를 계산하기 만하면이 솔루션은 괜찮습니다.하지만 제 경우에는 거리별로 스테이션을 주문해야하므로이 솔루션을 사용할 수 없습니다.

John CashCommons와 Philip에게 감사드립니다. 고마워요

답변

2

포인트가 도시 내에서 분리되어 있다면 (대략적인) 그 근사가 잘 작동합니다. 하지만 근사치가 떨어지면 전 세계로 간다.

편집 : 아래 필립의 의견에 따라 구성 요소 중 하나를 조정해야합니다. 독일은 북위 50도 정도이므로 경도에 (cos 50 deg)를 곱하면 더 잘됩니다.

+0

독일과 같은 국가에 있다면 어떻게 될까요? – Tima

+2

위도 1 마일! = 1 마일 (경주에서 제외) – Philip

+0

아마 그렇게 될 것입니다. 이 문제는 비행기의지도 왜곡에서 비롯됩니다. 예를 들어 메르카토르 투영의 경우 극에 가깝게 설정하면 축소됩니다. 남극 대륙은 평면지도처럼 크지는 않습니다. ;) – John

1

예. 예. :-) 실제 거리는 sqrt ((lat_0 - lat_n)^2 + (lon0 - lon_n)^2)이지만 (lat_0 - lat_n)^2 + (lon0 - lon_n)^2로 정렬하는 것으로 충분합니다.

+0

위도와 경도 좌표는 미터법 값이 아닌 십진수 값으로 저장됩니다. – Tima

+0

자, 귀하의 지역은 어느 정도이며 어느 지역입니까? 너무 크지 않고 막대를 덮지 않으면 데이터베이스 내에 삼각 함수가 필요하지 않습니다.(또는 심지어 귀하의 DB에서 전체 데이터를 가져 와서 그것을 처리하고 그것을 다시 작성하십시오.) – Philip

+0

나는 또한 당신의 "또는 심지어"해결책에 대해 생각했습니다 : – Tima

0

음 ... 주문이 어떻게 작동 할 지 모르겠습니다. 이웃임을 나타 내기 위해 각 지점마다 다른 순서가 필요하지 않습니까?

가장 간단한 해결책은 모든 점을 반복하고 점 사이에 geometrical distance을 계산하는 것입니다. 1000 포인트의 경우이 속도가 상당히 빨라야합니다.

검색 속도면에서 가장 최적화 된 솔루션은 데이터베이스에 삽입 할 때 각 점의 이웃을 계산하는 것입니다. 예를 들어 ID 목록을 쉼표로 구분 된 문자열로 유지하고 데이터베이스에 삽입 할 수 있습니다. 그러면 누군가 이웃이 필요하면 직접 할 수 있습니다. 그러나 이것은 새로운 포인트를 삽입해야하는 경우 고통이 될 것입니다. 기본적으로 이웃을 다시 계산해야합니다.

+0

나는이 해결책에 대해서도 생각했다. 주어진 지리적 위치가 DB에 저장되지 않은 현재 위치 인만큼 최적화 된 솔루션은 제게 적합하지 않습니다. – Tima

관련 문제