위도와 경도를 얼마나 정확하게 저장해야합니까?


103

나는 여기에서이 질문을 읽고 있었다 :

SQL 데이터베이스에 위도 및 경도 데이터를 저장할 때 사용할 데이터 유형은 무엇입니까?

그리고 일반적인 합의는 Decimal (9,6)을 사용하는 것이 갈 길이라는 것입니다. 제 질문은 이것이 얼마나 정확한가요?

예를 들어 Google의 API는 다음과 같은 결과를 반환합니다.

"lat": 37.4219720,
"lng": -122.0841430

-122.0841430 중 몇 자리가 필요합니까? 나는 여러 가이드를 읽었지만 그것들을 이해하기에는 충분히 이해할 수 없습니다.

내 질문에 대해 더 정확하게 말하면 : 정확한 위치에서 50 피트 이내의 정확도를 유지하려면 몇 개의 소수점을 저장해야합니까?

아마도 더 나은 질문은 실제로 비 프로그래밍 질문 일 것입니다. 그러나 그것은 각 소수점이 얼마나 더 정확할까요?

간단합니까?

  1. 목록 항목
  2. x00 = 6000 마일
  3. xx0 = 600 마일
  4. xxx = 60 마일
  5. xxx.x = 6 마일
  6. xxx.xx = .6 마일
  7. 기타?

7
좌표의 정확도는 좌표의 위치에 따라 달라집니다. 행성의 표면은 완벽한 구체가 아니고 극점으로부터의 거리도 중요한 요소이기 때문입니다. 그러나 평균적으로 소수점 3 자리는 약 120 미터 / 400 피트입니다. 소수점 4 자리는 12 미터 / 40 피트 등이됩니다.
Marc B

1
GIS stackexchange에서이 질문보기 : gis.stackexchange.com/questions/8650/…
Flimm

답변:


191

적도에서의 정확도 대 소수 자릿수

decimal  degrees    distance
places
-------------------------------  
0        1.0        111 km
1        0.1        11.1 km
2        0.01       1.11 km
3        0.001      111 m
4        0.0001     11.1 m
5        0.00001    1.11 m
6        0.000001   0.111 m
7        0.0000001  1.11 cm
8        0.00000001 1.11 mm

심판 : https://en.wikipedia.org/wiki/Decimal_degrees#Precision


4
이것이 적도에 있다면 최악의 경우 오류라는 뜻입니까?
Liath

6
사실, 적도는 최상의 경우입니다. 위도 1 도와 경도 1 도는 적도 (69 마일)에서 크기가 같지만 경도 1 도는 극 중 하나에 접근하면 0으로 축소됩니다. 다음은 아주 좋은 설명입니다. nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud

11
@codingoutloud 최악의 경우 오류가 발생합니다. 또는 현명하게 말하면 해수면에서 위도 / 경도를 사용하는 최악의 경우 오류입니다. 고도 6,378m에서 오차는 0.1 % 증가합니다.
Scott B

@codingoutload : 그 링크 :( 더 이상 분명히 존재
톰 Stambaugh

1
@ 톰 Stambaugh : 그에 대한 web.archive.org있다 : web.archive.org/web/20070810120810/http://nationalatlas.gov/...
스테판 스타 이거

19
+----------------+-------------+
|    Decimals    |  Precision  |
+----------------+-------------+
|    5           |  1m         |
|    4           |  11m        |
|    3           |  111m       |
+----------------+-------------+

50ft (15m) 정밀도를 원하면 4 자리로 이동합니다. 그래서decimal(9,6)


9
SQL Server를 사용하는 경우 ... 정밀도가 1-9이면 5 바이트가 사용된다는 점에 주목할 가치가 있습니다. 따라서 decimal (7,4) 대신 decimal (9,6)을 사용하고 둘 다 같은 공간을 차지하므로 더 높은 정확도를 활용할 수 있습니다.
Theo

위도의 경우 사용 (8,6)(또는 (6,4)MySQL에서 바이트 저장)
Rick James

15

저는 데이터베이스를 설계하고이 질문을 한동안 연구 해 왔습니다. 우리는 데이터 필드가 소수점 17 자리를 허용하도록 정의 된 Oracle 백엔드와 함께 기성품 애플리케이션을 사용합니다. 어리석은! 그것은 천분의 일 인치입니다. 세상에 그렇게 정확한 GPS 기기는 없습니다. 따라서 소수점 17 자리를 제쳐두고 실용적으로 처리합시다. 정부는 그들의 시스템이 95 % 신뢰 수준에서 7.8 미터의 "최악의 경우"의사 거리 정확도에 적합하다고 보장하지만, 실제 FAA (고품질 장비 사용)가 GPS 판독 값이 일반적으로 좋은 것으로 나타났습니다. 미터 이내.

따라서 스스로에게 두 가지 질문을해야합니다. 1) 가치의 원천은 무엇입니까? 2) 데이터는 어디에 사용됩니까?

휴대 전화는 특히 정확하지 않으며 Google / MapQuest 판독 값은 소수점 이하 4 자리 또는 5 자리에 불과합니다. 고품질 GPS 기기는 6 개를받을 수 있습니다 (미국 내). 그러나 그 이상을 캡처하는 것은 입력 및 저장 공간 낭비입니다. 또한 값에 대한 검색이 수행되면 사용자가 6이 가장 많이 찾아야한다는 것을 아는 것이 좋습니다 (분명히 입력 된 모든 검색 값은 먼저 검색되는 데이터 값과 동일한 정확도로 반올림되어야합니다). ).

또한 Google지도에서 위치를 보거나 GPS에 저장하기 만하면 4 ~ 5 개면 충분합니다.

나는 여기 주변 사람들이 그 모든 숫자를 입력하는 것을 비 웃어야한다. 그리고 정확히 어디에서 측정을하고 있습니까? 현관 손잡이? 우편함이 앞에 있습니까? 건물의 중심? 기지국 꼭대기? 그리고 ... 모두가 같은 장소에서 일관되게 복용하고 있습니까?

좋은 데이터베이스 설계로서, 저는 사용자로부터 5 자리 이상의 소수에 대한 값을 수락 한 다음 일관성을 위해 5 개만 반올림하고 캡처합니다 (기기가 양호하고 최종 사용이이를 보증하는 경우 6 개).


4
17 자리 숫자가 너무 많다는 데 동의하지만 데이터를 후 처리 할 경우 6 자리가 너무 적다고 제안합니다. 반경 쿼리 ( '이 지점에서 반경 0.5 마일 이내의 응답 기능')와 같은 작업을 수행하면 잘림을 포함한 오류가 확대됩니다. 이러한 쿼리의 출력에 십진수 6 자리가 필요한 경우 입력 은 훨씬 더 많이 시작해야합니다. 저희 가게는 DECIMAL (18,15)을 사용하는 경향이 있습니다. 우리의 목표는 db가 공간 계산의 정확성을 제한하는 요소가 아닌지 확인하는 것입니다.
Tom Stambaugh

소수점 6 자리를 넘어서는 것은 오늘날 GPS 위성의 사용 가능한 정밀도를 넘어서는 것입니다. 사후 처리로 인해 상당한 오류가 발생하지 않습니다. DECIMAL(18,15)9 바이트를 사용합니다.
Rick James

11

각 위도 사이의 거리는 지구의 모양에 따라 달라지며 각 경도 사이의 거리는 극에 가까워 질수록 작아집니다. 따라서 각도 사이거리는 위도 110.574km, 경도 111.320km 인 적도에 대해 이야기 해 봅시다 .

50ft는 0.01524km이므로 :

  • 0.01524 / 110.574 = 위도의 1/7255
  • 0.01524 / 111.320 = 1/7304 경도

총 7 자리의 정밀도로 1 만분의 1도까지 내려갈 수있는 4 자리 스케일이 필요합니다.

DECIMAL(7,4) 당신의 필요에 충분해야합니다.


5

구의 다양한 부분과 대각선 거리를 고려할 때 사용 가능한 정밀도 테이블은 다음과 같습니다.

   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#representation_choices


3

부동 소수점 값을 저장하지 마십시오. 정확하다고 생각할 수도 있지만 그렇지 않습니다. 근사치입니다. 그리고 다른 언어에는 부동 소수점 정보를 "파싱"하는 다른 방법이 있습니다. 그리고 데이터베이스마다 값 근사치를 구현하는 방법이 다릅니다.

대신 Geohash를 사용하십시오 . 이 비디오는 Geohash를 5 분 이내에 소개하고 시각적으로 설명합니다. Geohash는 일관된 방식으로 경도 / 위도 정보를 인코딩 / 디코딩하는 우수한 방법입니다. 경도 / 위도의 대략적인 부동 소수점 값을 데이터베이스 열로 "직렬화"하지 않고 대신 Geohash를 사용하면 문자열 값과 동일한 바람직한 왕복 일관성 보장을 얻을 수 있습니다. 이 웹 사이트는 Geohash를 사용하는 데 도움이됩니다.


FLOAT그리고 DOUBLE, 이 맥락 에서은 귀하가 설명하는 일부 문제로 인해 어려움을 겪지 않습니다.
Rick James

@RickJames "이 컨텍스트"를 충분히 지정하지 않았습니다. 정확히 말하면 두 개의 DB 열에 값을 저장하는 것입니다. 그러나 주어진 값은 사용되지 않은 DB 열에 만있는 것이 아니라 이러한 값에 대해 (근접성) 쿼리가 작성된다는 암시 적 가정입니다. 그리고이 상당히 실용적인 가정을 유지한다는 것은 신뢰할 수없는 근사치라는 모든 문제가 계속 유지된다는 것을 의미합니다.
chaotic3quilibrium

1
FLOAT값과 '다음'값이 서로 너무 가까워서 한 도시 (또는 차량, 사람 또는 벼룩)를 다른 도시와 구분할 수없는 경우 반올림 및 표현 오류는 중요하지 않습니다. 한편, 두 개 FLOATs( DOUBLEs또는 근사치 DECIMALs)를 '=' 로 비교하는 것은 거의 항상 어리석은 일 입니다.
Rick James

요점을 놓치고있는 것 같습니다. 시도 된 쿼리는 명시 적이 지 않은 경우 암시 적으로 같음을 사용합니다. 그리고 이것은 값이있는 다른 계층과 언어를 거치지 않고 엄격하게 SQL Server 내부에 머무르고 있다고 가정합니다. 다음은 SQL Server에 대한 Microsoft의 공식 응답입니다. blogs.msdn.microsoft.com/qingsongyao/2009/11/14/…
chaotic3quilibrium

죄송합니다. 질문이 [mysql]SQL Server가 아니라 태그라고 생각했습니다 .
Rick James

2

Google지도에서 위치를 클릭하면 소수점 이하 7 자리의 위도와 경도가 표시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.