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


431

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


1
이 링크가 매우 유용하다는 것을 알았습니다. howto-use-mysql-spatial-ext.blogspot.com/2007/11/… 조금 낡았지만 예제를 포함한 완전한 설명이 들어 있습니다.
madc

여기 대부분의 사람들은 무슨 일이 일어나고 있는지 이해하지 못합니다. 앱 코드 숫자에 자마자 , 가장 많이 사용하는 double을 사용하면 숫자 는 최대 배정도로 변 합니다. 백만 자릿수로 저장하면 아무런 효과가 없습니다. 으로 저장 한정 소수점 수 (예. 6 7) 파괴 그 정밀도의 일부와 누적 오차를 추가 가 재 기입 된 데이터베이스로 될 때마다 . 이중은 약 16 개의 유효 숫자, 잠재적으로 모든 소수를 포함합니다. 10 개를 긁으면 시간이 지남에 따라 누적 오류가 발생합니다. 이유는 「부동 점」입니다. 계속
Stormwind

계속 : 외부 소스에서 얻은 수치를 변경하지 않고 처음으로 소스 자료로 저장할 때 6 자리가 유효 할 수 있습니다. 그러나 계산을 한 번만 수행하고 다시 저장하는 경우 특정 소수 형식을 적용하여 정밀도의 일부를 제거 하는 것은 멍청 합니다. 서버 내부에서만 계산을 수행하는 것은 다를 수 있으며 (서버가 내부에서 두 배가 아닌 다른 것을 사용하거나 사용하지 않을 수 있음), 앱 계산에서 double보다 더 나쁜 숫자 표현을 사용하면 c의 저장 정밀도에 대한 요구가 동일하게 감소합니다.
Stormwind

Cont : 주장 된 "9.6" 에도 불구하고 서버가 더 높은 정밀도로 숫자를 저장하면 이 모든 것이 중요하지 않으며 형식은 순전히 편의상의 문제입니다. 정밀한 문제와 관련이 있습니다. 그러나 서버가 실제로 해당 형식의 소수점 이하 6 자릿수로 숫자를 반올림해도 놀라지 않을 것입니다.
Stormwind

계속 : 마지막으로, 위도, 론의 경우 소수점 6 자리는 ca 에 스냅 하는 문제입니다 . 11 센티미터 격자. 소수점 6 자리로 읽고 (터치) 계산하고 다시 저장할 때마다 새로운 스냅 (= 누적 오류)이 발생합니다. 모든 오류가 같은 방향으로 진행되면 오류가 발생합니다. 임시 곱셈을 수행하는 경우 (예 : 스케일 업, 뺄셈 및 스케일 다운) 훨씬 커질 수 있습니다. 좋은 레이 슨없이 정밀함을 긁지 마십시오!
Stormwind

답변:


161

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


25
예제를 시작하는 방법에 대한 예제 또는 기타 정보에 대한 다른 링크가 있습니까?
Codebeef

6
MYSQL Spatial은 좋은 옵션이지만 여전히 상당한 한계와 경고가 있습니다 (6 현재). 아래 내 답변을 참조하십시오 ...
James Schek

1
@James Schek이 맞습니다. 또한 MySQL은 유클리드 지오메트리를 사용하여 모든 계산을 수행하므로 lat / lng의 실제 사용 사례를 나타내지 않습니다.
mkuech

참고로; MySQL은 * .myisam 테이블, 즉 ISAM 엔진에서만 공간 인덱스를 지원합니다. 링크 : dev.mysql.com/doc/refman/5.0/en/creating-spatial-indexes.html
PodTech.io

마지막 업데이트 부분에서이 기사를 살펴보십시오 : mysqlserverteam.com/mysql-5-7-and-gis-an-example
Jaspal Singh

149

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

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


11
Google은 FLOAT 사양의 작동 방식을 명확하게 이해하지 못합니다 FLOAT(10,6). 좌표의 정수 부분에 4 자리를 남깁니다. 그리고 아니요, 부호는 계산되지 않습니다. 이는 부호없는 속성에서 비롯됩니다.
Alix Axel

2
그러나 [0, 180]의 필수 부품 값으로 저장해야하는 경우 충분해야합니다.
Hrvoje Golcic

37
@AlixAxel Google은 그것이 무엇을하는지 알고 있다고 생각합니다. " Google지도의 현재 확대 / 축소 기능을 사용하면 소수점 이하 6 자리의 정밀도 만 필요합니다. 그러면 소수점 이하 6 자리와 소수점 이하 4 자리까지 필드에 저장됩니다. 예 : - 123.456789 도. ". unsigned를 체크하면 패턴은 1234,567890이 됩니다. 아무 문제 없습니다.
1.44mb 2019

16
@AlixAxel 그는 시퀀스의 숫자를 세고 있습니다. 실제 좌표를 사용하지 않는 ...
Andrew Ellis

8
데이터 유형을 사용 DoubleLaravel 위해
FOOBAR

133

기본적으로 위치에 필요한 정밀도에 따라 다릅니다. 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

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


2
나는 게시물의 내용에 초점을 맞춘 건설적이고 자세한 해설을 작성해야하므로 Rick James의 웹 사이트에서 제공하는 정확성 표를 관찰하면서 해상도 설명 "강아지에 대한 함대"에 경쾌하게 웃겼으며 그것은 kudos의 가치가 있다고 느꼈다. 기술적으로 말하면 이것은 두 주소 사이의 거리를 측정하기 위해 좌표를 저장할 때 사용할 데이터 유형을 결정하는 데 도움이되는 유용한 묘사였습니다. @ Simon, 공유해 주셔서 감사합니다.
Sam_Butler

FWIW, 그 링크의 "SMALLINT scaled"사용은 엄청나게 비효율적입니다. Oguzhan의 대답 은 소수점 뒤에 7 자리의 long / lat을 4 바이트 부호있는 int 로 저장하는 좋은 방법 입니다. 작은 크기 (4B)에서 뛰어난 정밀도 (~ 1cm).
ToolmakerSteve

74

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

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

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


26
휴식 : MySQL Spatial Extensions는 위도 / 경도로 표시되는 지표면의 점 사이의 원거리를 계산하는 데 적합하지 않습니다. 거리 함수 등은 직교, 평면, 좌표에만 유용합니다.
O. Jones

71

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

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

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

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


3
감사합니다. 도움이되었습니다. 이미 8 년 전인 2008 년의 모든 질문과 답변을 읽는 것이 이상하다고 느낍니다.
aexl

1
@TheSexiestManinJamaica-IEEE 754-1985 이전에는 컴퓨터 부동 소수점 하드웨어가 혼란 스러웠습니다. 기계에 a*b동일하지 않은 기계도있었습니다 b*a(일부 값의 경우). 다음과 같은 많은 예가있었습니다 : 2+2 = 3.9999. 이 표준은 많은 혼란을 없애고 거의 모든 하드웨어와 소프트웨어에서 '빠르게'채택되었습니다. 따라서이 논의는 2008 년 이후가 아니라 3 세기 동안 유효했습니다.
Rick James

42

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

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).

2
이전 답변의 붙여 넣은 부분을 복사하고 해당 테이블을 만든 사람이 권장하지 않은 내용으로 "요약" 합니다 .«파티하는 방법? 글쎄, MySQL은 매우 까다 롭다. FLOAT / DOUBLE이 없습니다. DECIMAL이 종료되었습니다. 그래서 우리는 약간의 멍청이에 갇혀 있습니다. 기본적으로 Lat / Lng를 INT 크기로 변환하고 PARTITION BY RANGE를 사용해야합니다.» 그리고«FLOAT는 24 개의 유효 비트를 가지고 있습니다; DOUBLE에는 53이 있습니다. (파티션과 함께 작동하지 않지만 완전성을 위해 포함되어 있습니다. 사람들은 종종 얼마나 많은 오버 킬 과 얼마나 많은 공간 을 인식하지 않고 DOUBLE을 사용 합니다.)»작성한 SDT 부분을 그대로 두십시오.
팔 걸음

1
@Armfoot 당신이 편집 시간을 보면, 그것은 나에게서 복사 한 다른 대답입니다. 중요하지 않습니다. Stack Overflow에 "미래를위한 메모"가 더 많이 표시됩니다.
Gajus

1
그는 당신에게서 복사하지 않았습니다. 그는 2014 년에 참조 한 링크 (당신의 게시물은 2015 년입니다)에서와 같이 테이블을 붙여 넣었습니다. Btw, 공간 데이터 유형 을 연결할 때 "특별"철자가 틀렸다고 생각합니다 . James가 언급했듯이CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g)) ENGINE=MyISAM; SDT 제한에 대한 더 많은 예제와 경고 를 추가하면 다른 사람들도 도움을 줄 수 있습니다. ..
Armfoot

@Gajus-두 분이 내 문서를 찾게되어 영광입니다! (아니, 나는 벼룩이 얼마나 큰지 모르겠지만 누군가의 관심을 끌 것이라고 느꼈습니다.)
Rick James

POINT 클래스를 사용할 때 좌표 저장을위한 인수의 순서는 POINT (longitude / X, latitude / Y) 여야합니다.
AndreyP


19

사용 DECIMAL(8,6)위도 (90 -90도)과 DECIMAL(9,6)경도 (180 -180도)를 위해. 소수점 이하 6 자리는 대부분의 응용 프로그램에 적합합니다. 음수 값을 허용하려면 둘 다 "서명"해야합니다.


DECIMAL유형은 floor/ceil허용 되지 않는 재무 계산을위한 것입니다 . 평범한 것이 FLOAT성능을 크게 능가 DECIMAL합니다.
Kondybas

1
@ Kondybas-데이터베이스의 주요 비용은 행을 가져 오는 것이므로 float와 decimal의 성능 차이는 중요하지 않습니다.
Rick James

14

구글 맵스에 따르면, 가장 멀리 갈 필요는 없다.


이 정보를 어디서 찾을 수 없습니까? 무언가가 변하는 경우를 대비하여.
webfacer

1
@webfacer, "MySQL에서 테이블 생성"섹션에 있습니다. developers.google.com/maps/documentation/javascript/…lat FLOAT( 10, 6 ) NOT NULL, lng FLOAT( 10, 6 ) NOT NULL
turrican_34

1
@webfacer,의 FLOAT구문은 더 이상 사용되지 않는 것 같습니다 mysql 8.0.17. MySQL은 이제 FLOAT정밀 매개 변수 dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.htmldev.mysql.com/doc/refman/5.5/en/floating-point-
turrican_34

7

우리는 두 배의 반올림 오류를 피하기 위해 위도 / 경도 X 1,000,000을 오라클 데이터베이스에 NUMBERS로 저장합니다.

소수점 6 자리까지의 위도 / 경도는 10cm의 정확도로 우리가 필요한 전부였습니다. 다른 많은 데이터베이스들도 위도 / 경도를 소수점 6 자리까지 저장합니다.


2
정수 연산 (예 : 인덱싱 된 검색)이 부동 소수점보다 훨씬 빠르기 때문에 많은 데이터가있는 경우 일부 (예 : 백만)를 곱하면 좋습니다.
Kaitlin Duck Sherwood

@ KaitlinDuckSherwood-비트는 비트입니다-32 비트 부동 소수점이 32 비트 정수보다 검색 (인덱싱 또는 그렇지 않은 경우)이 더 느린 이유를 알지 못합니다. 요즘 떠 다니는 수학조차도 문제가되지 않을 정도로 빠릅니다. 그럼에도 불구하고 나는 정수와 함께 암시 적 승수를 사용한다는 의견에 동의합니다 .32 비트에서 얻는 정밀도를 최대화합니다. 기술이 발전함에 따라 약간의 미래 보장.
ToolmakerSteve

6

완전히 다른 간단한 관점에서 :

이 방법을 사용하면 숫자를 색인화하고 좌표를 망치는 데이터 유형과 관련된 다른 모든 문제에 대해 걱정할 필요가 없습니다.


좋지 않다. 영업 이익은 그가 위도 / 경도의 LNG 쌍에 계산을 수행 할 것이라고 말했다 - 답이 배제 그
Yarin

4
@Yarin 이것은 많은 사람들이 자신의 필요에 따라 좌표를 저장하는 방법에 대한 답변이 필요한 인기있는 질문입니다 (대부분의 사람들은 Google지도를 사용할 수 있습니다). 귀하의 공감대는이 답변이 도움이되지 않을 것을 제안합니다 ... 좌표를 문자열로 저장함으로써 그들은 그들에게 제공된 원래 값 (예 : 구글에 의해)을 정확히 알게 될 것입니다. 앱을 소유하고 계산을 수행합니다. 당시에는 전환으로 엉망이되지 않았기 때문에 원본 데이터는 그대로 유지됩니다.
Armfoot

4

응용 프로그램에 따라 FLOAT (9,6)를 사용하는 것이 좋습니다.

공간 키는 더 많은 기능을 제공하지만 프로덕션 벤치 마크에서는 플로트가 공간 키보다 훨씬 빠릅니다. (AVG에서는 0,01 VS 0,001)


1
테스트 결과를 여기에 제공 할 수 있습니까?
NameNotFoundException

4

MySQL은 모든 float에 double을 사용합니다. 따라서 double 유형을 사용하십시오. float를 사용하면 대부분의 상황에서 예기치 않은 반올림 값이 발생합니다.


1
MySQL 은에서 작업을 수행합니다DOUBLE . MySQL을 사용하면 데이터를 4 바이트 또는 8 바이트로 저장할 수 있습니다 . 따라서 식을 열에 저장할 때 정밀도가 떨어질 수 있습니다 . FLOATDOUBLEFLOAT
Rick James

4

모든 작업에 최적은 아니지만지도 타일을 만들거나 하나의 투영만으로 많은 마커 (도트)로 작업하는 경우 (예 : Google지도와 같은 메르카토르 및 기타 미끄러운지도 프레임 워크에서 예상하는) 저는 "Vast Coordinate System"을 호출하여 정말 편리합니다. 기본적으로 x 및 y 픽셀 좌표를 확대 / 축소 방식으로 저장합니다. 줌 레벨 23을 사용합니다. 여기에는 몇 가지 이점이 있습니다.

  • 포인트를 처리 할 때마다 값 비싼 위도 / 경도에서 메르카토르 픽셀 변환을 한 번 수행합니다.
  • 확대 / 축소 수준이 주어진 레코드에서 타일 좌표를 가져 오려면 오른쪽으로 한 번 이동해야합니다.
  • 레코드에서 픽셀 좌표를 가져 오려면 한 번의 오른쪽 이동과 한 번의 비트 단위 AND가 필요합니다.
  • 시프트는 너무 가벼워서 SQL에서 실행하는 것이 실용적입니다. 즉, DISTINCT를 수행하여 픽셀 위치 당 하나의 레코드 만 리턴 할 수 있습니다. 이는 백엔드가 리턴 한 레코드 수를 줄이므로 처리량이 줄어 듭니다. 프런트 엔드.

나는 최근 블로그 게시물 에서이 모든 것에 대해 이야기했다 : http://blog.webfoot.com/2013/03/12/optimizing-map-tile-generation/


4

나는 일부 답변 / 의견에 크게 놀랐습니다.

왜 지구상에서 누구나 자발적으로 정밀도를 "감소"한 다음 나중에 더 나쁜 숫자에 대한 계산을 수행하려고합니까? 멍청한 소리.

소스의 64 비트 정밀도가 확실하다면 스케일을 자발적으로 고정하는 것은 멍청 할 것입니다. 소수점 이하 6 자리이며 정밀도를 최대 9 자리까지 제한합니다 (일반적으로 제안되는 10 진수 9.6 형식으로 발생).

당연히 소스 자료의 정확성으로 데이터를 저장합니다. 정밀도를 낮추는 유일한 이유는 저장 공간이 제한되어 있기 때문입니다.

  • 원본 정확도로 원본 수치 저장
  • 소스에서 계산 된 수치를 계산에 정확하게 저장합니다 (예 : 애플리케이션 코드가 복식을 사용하는 경우 결과를 복식으로 저장)

10 진수 9.6- 포맷은 격자에 스냅 현상을 일으 킵니다. 그것이 일어나기 위해서는 그것이 마지막 단계가되어야합니다.

내 둥지에 누적 오류를 초대하지 않습니다.


2
대부분의 GPS 도구 및 응용 프로그램은 소수점 이하 6 자리까지만 정확하기 때문입니다. 도구가 gis.stackexchange.com/questions/8650/
Yarin

1
@Yarin 그렇습니다.하지만 질문에 언급되지 않은 측정 및 GPS에 대해 이야기합니다. 가장 정확한 수치가 존재합니다. 그러나 GPS를 고려하자. 예를 들어 이미 부정확성을 포함하는 64 비트 부동 소수점의 소스 데이터 세트를 말합니다. 소수점 6 자리는 위도를 약 11 센티미터에 맞추는 것을 의미합니다. 따라서 이제 데이터 (소수 6 자리) 만 저장하면 22cm의 부정확성 (원래 11cm 인 경우)이 발생할 수 있습니다. 자발적으로, 아마도 그것에 대해 64 비트 계산을 수행하고, 아마도 3 번째 시간을 저장하기 전에-이제 33cm 부정확 한 창, + -16cm. 바보 소리, 임호.
Stormwind

@ Rick James 아마 64 비트로 저장할 것입니다. 0.3333333333333333. 우리는 지리 데이터를 이야기합니다. "1/3"은 일반적으로 물체가 적절한 정밀도로 측정되는 경우에는 거의 나타나지 않습니다.
Stormwind

4

TL; DR

NASA / 군에서 일하지 않고 항공기를 해상 시스템으로 만들지 않는 경우 FLOAT (8,5)를 사용하십시오.


질문에 완전히 대답하려면 몇 가지 사항을 고려해야합니다.

체재

  • 도 분 초 : 40 ° 26 ′ 46 ″ N 79 ° 58 ′ 56 ″ W
  • 십진수 분 : 40 ° 26.767 ′ N 79 ° 58.933 ′ W
  • 십진수 1 : 40.446 ° N 79.982 ° W
  • 십진수 2 : -32.60875, 21.27812
  • 다른 집에서 만든 형식입니까? 아무도 당신이 당신의 자신의 홈 중심 좌표계를 만드는 것을 금지하고 그것을 집과의 거리와 거리로 저장합니다. 이것은 작업중 인 특정 문제에 적합합니다.

따라서 응답의 첫 번째 부분은 좌표를 저장 하여 응용 프로그램이 지속적으로 변환하는 것을 피하고 간단한 SQL 쿼리를 만드는 데 사용 하는 형식으로 저장할 수 있다는 것 입니다.

대부분 Google지도 또는 OSM을 사용하여 데이터를 표시하고 GMaps는 "10 진수 2"형식을 사용합니다. 따라서 동일한 형식으로 좌표를 저장하는 것이 더 쉬울 것입니다.

정도

그런 다음 필요한 정밀도를 정의하고 싶습니다. 물론 "-32.608697550570334,21.278081997935146"과 같은 좌표를 저장할 수 있지만 해당 지점으로 이동하는 동안 밀리미터 정도 걱정 한 적이 있습니까? NASA에서 일하지 않고 위성이나 로켓 또는 비행기 궤도를 수행하지 않는 경우 몇 미터의 정확도로 괜찮을 것입니다.

일반적으로 사용되는 형식은 점 뒤에 5 자리이며 50cm의 정확도를 제공합니다.

: X, 21.278081 8 과 X, 21.278081 9 사이에 1cm 거리가 있습니다. 따라서 도트 뒤에 7 자리는 1 / 2cm의 정밀도를, 도트 뒤에 5 자리는 1/2 미터의 정밀도를 제공합니다 (개별 포인트 사이의 최소 거리가 1m이므로 반올림 오차는 절반을 초과 할 수 없음). 대부분의 민사 목적으로는 충분합니다.

십진수 분 형식 (40 ° 26.767 ′ N 79 ° 58.933 ′ W)은 점 뒤에 5 자리와 정확히 동일한 정밀도를 제공합니다.

공간 효율적인 스토리지

10 진수 형식을 선택한 경우 좌표는 쌍입니다 (-32.60875, 21.27812). 분명히 2 x (부호는 1 비트, 도는 2 자리, 지수는 5 자리)이면 충분합니다.

그래서 여기 에서 FLOAT (10,6)에 저장하라는 Google의 제안이 실제로 추가된다는 의견에서 Alix Axel 을 지원하고 싶습니다. 주요 부분에 4 자리가 필요하지 않기 때문에 (기호가 구분되고 위도가 제한되어 있기 때문에) 경도는 90으로 제한되며 경도는 180으로 제한됩니다. 1 / 2m 정밀도에는 FLOAT (8,5)를, 50 / 2cm 정밀도에는 FLOAT (9,6)를 쉽게 사용할 수 있습니다. 또는 FLOAT (7,5)가 위도에 충분하기 때문에 위도 및 경도를 구분 된 유형으로 저장할 수도 있습니다. MySQL float 유형 참조를 참조하십시오 . 그들 중 하나는 일반적인 FLOAT와 같으며 어쨌든 4 바이트와 같습니다.

일반적으로 오늘날 공간은 문제가되지 않지만 어떤 이유로 든 저장소를 실제로 최적화하려면 (면책 조항 : 사전 최적화하지 마십시오) lat (91 000 값 + 부호) + long (no 2xFLOAT (8 바이트 == 64 비트)보다 훨씬 작은 21 비트 ~ 1 억 8 천 개 이상의 값 + 부호 )


3

PostGIS의 공간 함수는 MySQL 공간 함수의 기능보다 훨씬 더 기능적입니다 (즉, BBOX 작업으로 제한되지 않음). 확인 : 링크 텍스트


1
  1. 위도의 범위는 -90에서 +90 (도)이므로 DECIMAL (10, 8)은 괜찮습니다.

  2. 경도는 -180에서 +180 (도)까지이며 DECIMAL (11, 8)이 필요합니다.

참고 : 첫 번째 숫자는 저장된 총 자릿수이고 두 번째 숫자는 소수점 뒤의 숫자입니다.

한마디로 : lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL



-2

Lat Long 계산에는 정밀도가 필요하므로 일부 유형의 10 진수 유형을 사용하고 수학 계산을 수행하기 위해 저장할 수보다 최소 2 높은 정밀도를 만드십시오. 내 SQL 데이터 형식에 대해 모르지만 SQL Server 사람들은 종종 소수점 대신 실수 또는 실수를 사용하고 실제 숫자가 아닌 것으로 추정되므로 문제가 발생합니다. 따라서 사용하는 데이터 유형이 부동 소수점 유형이 아닌 진정한 십진 유형인지 확인하고 괜찮습니다.


1
float 및 decimal 형식은 모두 제자리에 있습니다. 일반적으로 float는 물리적 변수를 의미하고 소수는 셀 수있는 엔티티 (대부분 돈)를 의미합니다. 나는 왜 당신이 위도 / 경도에 소수점을 선호하는지 모르겠다
Javier

1
또한 float은 위도 / 경도에 적합하다고 생각합니다. SQL Server 이상 (4 바이트, 7 자리) 이상
Dragoljub Ćurčić

플로트는 정확하지 않으며, 위도의 호수는 치명적입니다! 지구상에서 완전히 다른 지점을 가리킬 수 있습니다.
HLGEM

2
float 데이터 유형의 최대 오류는 문제가되지 않을 정도로 낮습니다. 어쨌든 두 구현 모두에서 오류 곱셈 / 누적을 알고 있어야합니다.
Spidey

@HLGEM- 소수점 이하 자릿수로 반올림해도 지구의 다른 지점에 착륙합니다. 문제는 다른 지점이 너무 가까워서 중요하지 않은지 여부입니다.
Rick James

-3

A FLOAT는 필요한 모든 정밀도를 제공하고 각 좌표를 문자열 등으로 저장하는 것보다 비교 기능에 더 좋습니다.

MySQL 버전이 5.0.3 이전 인 경우 특정 부동 소수점 비교 오류에 주의해야합니다 .

MySQL 5.0.3 이전에는 DECIMAL 열이 문자열로 표시되기 때문에 정확한 정밀도로 값을 저장하지만 DECIMAL 값에 대한 계산은 부동 소수점 연산을 사용하여 수행됩니다. 5.0.3부터 MySQL은 소수점 이하 64 자리의 정밀도로 DECIMAL 연산을 수행하므로 DECIMAL 열과 관련하여 가장 일반적인 부정확성 문제를 해결해야합니다.


2
쉬운 수학을 위해서는 실제 위도 / 경도 좌표 데이터 유형이 필요합니다. 에 해당하는 같은 것을의 편의를 상상해 "상점에서 선택 * 어디 거리 (stores.location, mylocation) <5마일"
커크 Strauser

1
이전에 공간 확장에 대해 들어 본 적이 없었습니다. 이것은 매우 편리하게 들리 며, 이전에 상당히 많은 지리적 관련 계산을 수행하는 상속 된 앱에서 작업 한 적이 있으므로 확인해야합니다.
ConroyP

@ConroyP-아니오. 그 인용문은 DECIMAL부동 구현의 사용으로 인해 (5.0.3 이전) 특정 오류 가 있음을 지적합니다 .
Rick James
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.