티스토리 뷰

반응형

MySQL은 데이터베이스 시스템 중 하나로, 위도와 경도를 이용한 거리 계산에도 사용될 수 있습니다. 이번 글에서는 MySQL에서 위도와 경도를 이용하여 거리를 계산하는 방법과 그 구현 방법을 알아보겠습니다.

 

1. 위도와 경도

위도와 경도는 지도상의 위치를 나타내는 좌표입니다. 위도는 적도를 기준으로 북쪽과 남쪽으로, 경도는 그리니치 천문대를 기준으로 동쪽과 서쪽으로 나타냅니다.

 

2. 거리 계산

위도와 경도를 이용하여 거리를 계산하는 방법은 여러 가지가 있습니다. 그 중에서도 대표적인 방법은 하버사인 공식(Haversine formula)을 이용한 방법입니다. 하버사인 공식은 지구를 구와 비슷한 모양으로 가정하고, 지구의 반지름을 이용하여 두 지점 사이의 거리를 계산하는 공식입니다.

 

3. MySQL에서 거리 계산하기

MySQL에서 거리를 계산하기 위해서는 먼저 위도와 경도 정보가 저장된 테이블이 필요합니다. 그리고 아래의 쿼리문을 이용하여 두 지점 사이의 거리를 계산할 수 있습니다.

SELECT 
    id, 
    ( 6371 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
FROM markers
HAVING distance < 25
ORDER BY distance
LIMIT 0 , 20;

위 쿼리문에서 markers는 위도와 경도 정보가 저장된 테이블의 이름입니다. 위도와 경도 정보는 각각 latlng라는 컬럼으로 저장되어 있습니다. 쿼리문에서 37-122는 각각 첫 번째 지점의 위도와 경도를 나타냅니다. 마지막으로 distance < 25는 거리가 25킬로미터 이하인 지점들만을 검색한다는 조건입니다.

 

4. 구현 방법

MySQL에서 위도와 경도를 이용한 거리 계산을 구현하기 위해서는 다음과 같은 단계를 거칩니다.

1) 테이블 생성

우선, 위도와 경도 정보를 저장할 테이블을 생성합니다. 다음과 같은 쿼리문을 실행하여 테이블을 생성할 수 있습니다.

CREATE TABLE markers (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  address varchar(255) NOT NULL,
  lat double(10,6) NOT NULL,
  lng double(10,6) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

위 쿼리문에서 markers라는 이름의 테이블을 생성하고, 각각의 필드에 대한 정보를 설정합니다. nameaddress 필드는 위치 정보와 관련된 정보를 저장하는 용도로 사용됩니다. latlng 필드는 위도와 경도 정보를 저장하는 용도로 사용됩니다.

 

2) 데이터 삽입

위도와 경도 정보가 저장된 테이블에 데이터를 삽입합니다. 다음과 같은 쿼리문을 실행하여 데이터를 삽입할 수 있습니다.

INSERT INTO markers (name, address, lat, lng) VALUES
('Seoul', 'South Korea', 37.566535, 126.977969),
('New York', 'United States', 40.712776, -74.005974),
('Paris', 'France', 48.856614, 2.352221),
('London', 'United Kingdom', 51.507351, -0.127758),
('Tokyo', 'Japan', 35.689487, 139.691711);

위 쿼리문에서 markers 테이블에 각각의 도시의 정보를 삽입하고, 이 도시들의 위도와 경도 정보를 저장합니다.

 

3) 거리 계산 쿼리문 실행

이제 위에서 삽입한 데이터를 이용하여, 두 지점 사이의 거리를 계산하는 쿼리문을 실행합니다. 위에서 살펴본 쿼리문을 이용하여 거리를 계산하고, 원하는 조건을 설정하여 검색할 수 있습니다.

예를 들어, 다음과 같은 쿼리문을 실행하여 서울에서 25킬로미터 이내의 도시를 검색할 수 있습니다.

SELECT 
    id, 
    ( 6371 * acos( cos( radians(37.566535) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(126.977969) ) + sin( radians(37.566535) ) * sin( radians( lat ) ) ) ) AS distance 
FROM markers
HAVING distance < 25
ORDER BY distance
LIMIT 0 , 20;

위 쿼리문에서, 첫 번째 지점의 위도와 경도를 서울의 위도와 경도로 설정하고, distance < 25라는 조건을 설정하여 25킬로미터 이내의 도시만 검색합니다. 검색된 결과는 거리 순으로 정렬되어 출력되며, 최대 20개의 결과만 출력됩니다.

 

4) 인덱스 설정

만약 위에서 생성한 markers 테이블의 레코드 수가 많아지면, 거리 계산 쿼리문의 실행 속도가 느려질 수 있습니다. 이런 경우, 인덱스를 설정하여 검색 속도를 높일 수 있습니다.

다음과 같은 쿼리문을 실행하여 인덱스를 설정할 수 있습니다.

ALTER TABLE markers ADD INDEX (lat,lng);

 

마무리

이제 MySQL에서 위도와 경도를 이용하여 거리 계산을 구현하는 방법에 대해 알아보았습니다. 위에서 살펴본 쿼리문을 이용하여, MySQL에서 간단하게 거리 계산을 구현할 수 있습니다. 또한, 인덱스를 설정하여 검색 속도를 높일 수 있습니다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함