2017-09-19 4 views
0

많이 연구하고 해결책을 찾지 못한 후에 물어보십시오. Mysql에서 Long/Lat 점 사이의 거리를 어떻게 계산합니까? (효율적인 방법?)두 개의 long/lat 사이의 거리를 계산하십시오.

또한 this 해결책을 찾았지만, 거기에 내가 @long가 @lat 알고 해달라고 스프링 데이터 JPA 나던 (MysqlSpatial 방언을 사용 제외) 지오메트리 유형을 수 있기 때문에 내가 포인트를 사용하고 있지 않다

자바에서 나는 다음과 같이 계산하고 있습니다 :

private double getDistanceFromLatLonInKm(double lat1,double lon1,double lat2,double lon2) { 
    int R = 6371; //Earth Radius 
    double dLat = degreeToRadiant(lat2-lat1); 
    double dLon = degreeToRadiant(lon2-lon1); 
    double a = 
      Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(degreeToRadiant(lat1)) * Math.cos(degreeToRadiant(lat2)) * 
          Math.sin(dLon/2) * Math.sin(dLon/2) 
      ; 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    return R * c; //Distance in km 
} 

그리고 내 테이블/법인 위도 하나의 경도에 대한 열 및 다른 포함되어 있습니다.

또 다른 질문은 봄 데이터 jpa로 이전에 말한 것처럼 이것을 해결할 수 있을까요?

자바 코드를 MySQL로 변환하려고했지만 거리가 길어졌습니다. 나는 솔루션 위의 내 코드에서 실수를 발견

SELECT name, (6371 * (
    2 * ATAN2(
       SQRT(
        SIN(RADIANS((48.3069400-latitude))/2) * SIN(RADIANS((48.3069400-latitude)/2)) + 
        COS(RADIANS(latitude)) * COS(RADIANS(48.3069400)) * SIN(RADIANS((48.3069400-longitude)/2)) * 
        SIN(RADIANS((48.3069400-longitude)/2)) 
       ),SQRT(
        1-(SIN(RADIANS((48.3069400-latitude))/2) * SIN(RADIANS((48.3069400-latitude)/2)) + 
        COS(RADIANS(latitude)) * COS(RADIANS(48.3069400)) * SIN(RADIANS((48.3069400-longitude)/2)) * 
        SIN(RADIANS((48.3069400-longitude)/2))) 
       ) 
      ) 
)) as distance FROM event 
+0

[두 위도/경도 사이의 거리를 찾는 가장 빠른 방법] 가능한 복제본 (https://stackoverflow.com/questions/1006654/fastest-way-to-find-distance-between-two-lat-long- 포인트) –

+0

나는 이미 세 번째 문장에서 링크했습니다 ... –

+0

@ MarkusG.what는 귀하의 MySQL 버전입니까? – olegsv

답변

1

는 가장 효과적인 방법 이럴 지오메트리 기능을 사용하는 것입니다 5.7.x.

MariaDB에서 st_distance (...)는 비슷한 결과를 반환합니다.

+0

은 10.1.19-MariaDB에서 작동하지 않습니다. –

+0

실제로 [호환 매트릭스] (https://mariadb.com/kb/en/library/mysqlmariadb-spatial-support-matrix/)는 MariaDB가 거리 함수를 지원하지 않음을 나타냅니다. – olegsv

+0

@ MarkusG. ST_DISTANCE()를 사용하십시오. – olegsv

0

좋아, 하하 또한 코드를 검색하는 사람들을 위해

를 경도를 삽입하는 것을 잊었다, 다음 코드는 사이의 거리를 계산 주어진 점과 테이블 행의 좌표. 숫자가 48.306... is the given latitude이고 숫자가 14.28... is the given longitude 인 경우

거리는 킬로미터로 계산되며 숫자 6371은 지구 반경입니다.

SELECT st_distance_sphere(POINT(lat1, long1) , POINT(lat2, long2)); 

당신이 미터의 거리를 얻을 수 있습니다 : MySQL의에서

SELECT name, (6371 * (
    2 * ATAN2(
       SQRT(
        SIN(RADIANS((48.3069400-latitude))/2) * SIN(RADIANS((48.3069400-latitude)/2)) + 
        COS(RADIANS(latitude)) * COS(RADIANS(48.3069400)) * SIN(RADIANS((14.2858300-longitude)/2)) * 
        SIN(RADIANS((14.2858300-longitude)/2)) 
       ),SQRT(
        1-(SIN(RADIANS((48.3069400-latitude))/2) * SIN(RADIANS((48.3069400-latitude)/2)) + 
        COS(RADIANS(latitude)) * COS(RADIANS(48.3069400)) * SIN(RADIANS((14.2858300-longitude)/2)) * 
        SIN(RADIANS((14.2858300-longitude)/2))) 
       ) 
      ) 
)) as distance FROM event 
관련 문제