위도 / 경도 쌍에서 계산을 수행한다는 점을 염두에두고 MySQL 데이터베이스에 가장 적합한 데이터 유형은 무엇입니까?
답변
GIS와 함께 MySQL의 공간 확장 을 사용하십시오 .
답변
Google은 Google지도를 사용하여 “Store Locator”응용 프로그램에 대한 PHP / MySQL 솔루션을 완성하기 시작했습니다. 이 예제에서는 위도 / 경도 값을 “10,6”길이의 “Float”로 저장합니다.
답변
기본적으로 위치에 필요한 정밀도에 따라 다릅니다. 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)입니다.
