[mysql] MySQL 데이터베이스에 위도 / 경도를 저장할 때 사용하기에 이상적인 데이터 유형은 무엇입니까?

위도 / 경도 쌍에서 계산을 수행한다는 점을 염두에두고 MySQL 데이터베이스에 가장 적합한 데이터 유형은 무엇입니까?



답변

GIS와 함께 MySQL의 공간 확장 을 사용하십시오 .


답변

Google은 Google지도를 사용하여 “Store Locator”응용 프로그램에 대한 PHP / MySQL 솔루션을 완성하기 시작했습니다. 이 예제에서는 위도 / 경도 값을 “10,6”길이의 “Float”로 저장합니다.

http://code.google.com/apis/maps/articles/phpsqlsearch.html


답변

기본적으로 위치에 필요한 정밀도에 따라 다릅니다. DOUBLE을 사용하면 3.5nm 정밀도를 얻을 수 있습니다. DECIMAL (8,6) / (9,6)은 16cm로 내려갑니다. 플로트는 1.7m입니다 …

이 매우 흥미로운 테이블은 더 완전한 목록을 가지고 있습니다 : http://mysql.rjweb.org/doc.php/latlng :

Datatype               Bytes            Resolution

Deg*100 (SMALLINT)     4      1570 m    1.0 mi  Cities
DECIMAL(4,2)/(5,2)     5      1570 m    1.0 mi  Cities
SMALLINT scaled        4       682 m    0.4 mi  Cities
Deg*10000 (MEDIUMINT)  6        16 m     52 ft  Houses/Businesses
DECIMAL(6,4)/(7,4)     7        16 m     52 ft  Houses/Businesses
MEDIUMINT scaled       6       2.7 m    8.8 ft
FLOAT                  8       1.7 m    5.6 ft
DECIMAL(8,6)/(9,6)     9        16cm    1/2 ft  Friends in a mall
Deg*10000000 (INT)     8        16mm    5/8 in  Marbles
DOUBLE                16       3.5nm     ...    Fleas on a dog

도움이 되었기를 바랍니다.


답변

MySQL의 Spatial Extensions는 공간 연산자와 인덱스의 전체 목록을 자유롭게 사용할 수 있으므로 최상의 옵션입니다. 공간 인덱스를 사용하면 거리 기반 계산을 매우 빠르게 수행 할 수 있습니다. 6.0부터는 공간 확장이 여전히 불완전하다는 점에 유의하십시오. 나는 MySQL Spatial을 내려 놓지 않고 너무 멀리 가기 전에 함정을 알려줍니다.

점과 DISTANCE 기능 만 엄격하게 다루는 경우에는 문제가 없습니다. 다각형, 선 또는 버퍼 포인트로 계산해야하는 경우 공간 연산자는 “관련”연산자를 사용하지 않으면 정확한 결과를 제공하지 않습니다. 21.5.6 맨 위에있는 경고를 참조하십시오 . 포함, 내부 또는 교차와 같은 관계는 정확한 지오메트리 모양이 아닌 MBR을 사용합니다 (예 : 타원은 사각형으로 처리됨).

또한 MySQL Spatial의 거리는 첫 번째 지오메트리와 동일한 단위입니다. 즉, 10 진수도를 사용하는 경우 거리 측정 값은 10 진수 도입니다. 이것은 적도에서 furthur를 얻을 때 정확한 결과를 얻는 것을 매우 어렵게 만듭니다.


답변

ARINC424에서 만든 탐색 데이터베이스에 대해이 작업을 수행했을 때 상당한 양의 테스트를 수행하고 코드를 다시 살펴 보았습니다 .DECIMAL (18,12) (실제로는 NUMERIC (18,12)는 파이어 버드이므로)을 사용했습니다.

플로트와 복식은 정확하지 않으며 반올림 오류가 발생하여 매우 나쁠 수 있습니다. 문제가있는 실제 데이터를 찾은 경우 기억이 나지 않습니다. 그러나 float 또는 double에 정확하게 저장할 수 없으면 문제가 발생할 수 있다고 확신합니다.

요점은 각도 또는 라디안을 사용할 때 값의 범위를 알고 분수 부분에 가장 많은 숫자가 필요하다는 것입니다.

MySQL의 공간 확장은 그들이 수행하기 때문에 좋은 대안이다 OpenGIS 지오메트리 모델 . 데이터베이스를 이식 가능하게 유지해야했기 때문에 사용하지 않았습니다.


답변

필요한 정밀도에 따라 다릅니다.

Datatype           Bytes       resolution
------------------ -----  --------------------------------
Deg*100 (SMALLINT)     4  1570 m    1.0 mi  Cities
DECIMAL(4,2)/(5,2)     5  1570 m    1.0 mi  Cities
SMALLINT scaled        4   682 m    0.4 mi  Cities
Deg*10000 (MEDIUMINT)  6    16 m     52 ft  Houses/Businesses
DECIMAL(6,4)/(7,4)     7    16 m     52 ft  Houses/Businesses
MEDIUMINT scaled       6   2.7 m    8.8 ft
FLOAT                  8   1.7 m    5.6 ft
DECIMAL(8,6)/(9,6)     9    16cm    1/2 ft  Friends in a mall
Deg*10000000 (INT)     8    16mm    5/8 in  Marbles
DOUBLE                16   3.5nm     ...    Fleas on a dog

보낸 사람 : http://mysql.rjweb.org/doc.php/latlng

요약하면 다음과 같습니다.

  • 가장 정확한 옵션은 DOUBLE입니다.
  • 가장 많이 사용되는 유형은 DECIMAL(8,6)/(9,6)입니다.

현재 의 MySQL 5.7 , 사용을 고려 공간 데이터 유형 즉, (SDT)를 POINT하나의 좌표를 저장. 5.7 이전의 SDT는 인덱스를 지원하지 않습니다 (테이블 유형이 MyISAM 인 경우 5.6 제외).

노트 :

  • POINT클래스를 사용할 때 좌표 저장을위한 인수의 순서는이어야합니다 POINT(latitude, longitude).
  • 공간 인덱스작성하기 위한 특별한 구문이 있습니다 .
  • SDT를 사용하면 얻을 수있는 가장 큰 이점은 공간 분석 함수에 액세스 할 수 있다는 것입니다 . 예를 들어 두 점 사이의 거리를 계산 ST_Distance하고 ( ) 한 영역이 다른 영역에 포함되어 있는지 여부를 결정합니다 ( ST_Contains).

답변

이 위키 기사 http://en.wikipedia.org/wiki/Decimal_degrees#Accuracy를 기반으로

MySQL의 적절한 데이터 유형은 경도와 위도를 별도의 필드에 저장하기위한 Decimal (9,6)입니다.