2014-09-24 3 views
1

저는 PostgreSQL을 사용하여 내 안드로이드 앱이 서버에 보내는 사용자의 위치를 ​​저장하고 있습니다. 나는 특정 시간 동안 사용자가 여행 한 총 거리를 찾아야했다.PostgreSQL 쿼리를 사용하여 이동 거리를 계산하십시오.

사용자 위치는 아래의 표에 저장된다

CREATE TABLE userlocation 
(
latitude character varying, 
longitude character varying, 
geopoint point, 
userid integer, 
locationtime timestamp 
) 

내가 레코드를 검색하고 다음 하버 사인 거리 방법을 사용하여 자바의 거리를 계산 :

public double getdistance(final double lat1, final double lon1, final double lat2, final double lon2, final char unit) { 
    final double theta = lon1 - lon2; 
    double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) 
      + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) 
      * Math.cos(deg2rad(theta)); 
    dist = Math.acos(dist); 
    dist = rad2deg(dist); 
    dist = dist * 60 * 1.1515; 
    if (unit == 'K') { 
     dist = dist * 1.609344; 
    } else if (unit == 'N') { 
     dist = dist * 0.8684; 
    } 
    if (Double.isNaN(dist)) { 
     dist = 0.0; 
    } 
    return (dist); 
} 

그러나이 계산 시간 특히 레코드가 많아서 며칠 동안 거리를 계산하는 동안 소모합니다. 계산 시간을 줄이기 위해 데이터베이스 수준에서 거리 계산을 시도하기로 결정했습니다.

SELECT latitude, longitude, geopoint <-> '19.23,72.89' AS distance FROM userlocation ORDER BY distance; 

내가 총 주행 거리 반환을 얻거나, 두 개의 연속 된 행과 상점 사이의 거리를 계산하는 것 중 하나 쿼리를 만들려고 : 나는 나 특정 지점까지의 거리를 계산할 수있는 다음 쿼리를 발견 그것은 다른 열에 있으므로 거리 계산 대신 Java에서 합계를 계산합니다.

해결 방법을 찾으려고했지만 아직 찾을 수 없습니다. SO에 관한 대부분의 질문은 두 점 사이의 거리 계산을 처리합니다.

현재 PostGIS가 없습니다. PostgreSQL에서 거리를 계산하는 것이 가능할까요, 아니면 현재의 방식대로 진행해야합니까? 이 경우 거리 계산 시간을 줄이기위한 대안이 있습니다.

+0

안녕 Joyson을하는 데 도움이

CREATE EXTENSION "cube"; CREATE EXTENSION "earthdistance"; 

희망! earthdistance 설치를 시도 했습니까? 방금 설치 과정에서 답을 수정했습니다. – Abincepto

답변

2

나는 지난 달에도 같은 문제가있었습니다.

PostgreSQL에 Earthdistance 모듈을 추가했습니다. 이 플러그인은 두 점 사이의 큰 원형 거리를 계산하는 함수를 추가합니다.

설치는 간단하다

+0

Earthdistance가 설치되었습니다. 그것은 내가 이전에 postgresql에서 얻은 계산 된 거리를 더 이상 변환 할 필요가 없으며 마일로 직접 거리를 얻는 데 도움이되었습니다. 감사. – Joyson

+0

항상 즐겁게 도와주세요. :) – Abincepto