[SQL] SQL 데이터베이스에 위도와 경도 데이터를 저장할 때 어떤 데이터 유형을 사용 하는가? [복제]
SQLSQL 데이터베이스에 위도와 경도 데이터를 저장할 때 어떤 데이터 유형을 사용 하는가? [복제]
은 ANSI SQL 호환 데이터베이스에 위도 또는 경도 데이터를 저장하면, 어떤 데이터 형식 가장 적절한 것입니까? ... 사용, 또는 10 진수, 또는 float를해야 하는가?
나는 오라클, MySQL은, 및 SQL Server는 특히 지리적 데이터를 처리하기위한 특별한 데이터 유형을 추가 한 것을 알고 있어요,하지만 난 당신이 "일반 바닐라"SQL 데이터베이스에 정보를 저장하는 것입니다 방법에 관심이 있어요.
해결법
-
==============================
1.진수 (9,6)
진수 (9,6)
당신은 정밀도와 규모 매개 변수를 사용하지 않는 경우, 여기 형식 문자열 시각이다 :
###.######
-
==============================
2.우리는 플로트를 사용하지만, 6 소수점해야 또한 작업과 숫자의 맛.
우리는 플로트를 사용하지만, 6 소수점해야 또한 작업과 숫자의 맛.
-
==============================
3.글쎄, 당신은 위도 / 경도를 저장하는 방법을 물어 내 대답은 : 마, 당신은 사용하는 것이 좋습니다하지 WGS (84)가 지리적 참조에 대한 표준으로 (유럽 ETRS 89).
글쎄, 당신은 위도 / 경도를 저장하는 방법을 물어 내 대답은 : 마, 당신은 사용하는 것이 좋습니다하지 WGS (84)가 지리적 참조에 대한 표준으로 (유럽 ETRS 89).
그러나 세부 사항은 따로 드디어 지리적 지원을 포함 SQL 2008 이전의 일 유형 정의 사용자를 사용했다.
-
==============================
4.바닐라 오라클에서 기능이라고 LOCATOR (공간의 파행 버전) 좌표 데이터 번호 (NO 정밀)의 데이터 유형을 사용하여 저장해야합니다. 공간 데이터 쿼리를 지원하는 기능을 기반으로 인덱스를 만들려고 할 때 그렇지 않으면 개그 것이다.
바닐라 오라클에서 기능이라고 LOCATOR (공간의 파행 버전) 좌표 데이터 번호 (NO 정밀)의 데이터 유형을 사용하여 저장해야합니다. 공간 데이터 쿼리를 지원하는 기능을 기반으로 인덱스를 만들려고 할 때 그렇지 않으면 개그 것이다.
-
==============================
5.당신은 쉽게 대신 정수와 소수 부분의 분할을 최대로, 부호없는 정수 필드에 위도 / 경도 진수를 저장하고 개별적으로 다소 다음 변환 알고리즘을 사용하여 여기에서 제안하는 저장 할 수 있습니다 :
당신은 쉽게 대신 정수와 소수 부분의 분할을 최대로, 부호없는 정수 필드에 위도 / 경도 진수를 저장하고 개별적으로 다소 다음 변환 알고리즘을 사용하여 여기에서 제안하는 저장 할 수 있습니다 :
저장된 MySQL의 함수로서 :
CREATE DEFINER=`r`@`l` FUNCTION `PositionSmallToFloat`(s INT) RETURNS decimal(10,7) DETERMINISTIC RETURN if( ((s > 0) && (s >> 31)) , (-(0x7FFFFFFF - (s & 0x7FFFFFFF))) / 600000, s / 600000)
다시
CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7)) RETURNS int(10) DETERMINISTIC RETURN s * 600000
요구 부호 INT (10)에 저장 될 것을 관대 MySQL은 물론 SQLite는이 작동된다.
경험을 통해, 나는 모든 당신에게이 필요한 경우이며,이 정말 빨리 작동 저장 좌표를 찾아 몇 가지 수학을 할 사람들을 검색 할 수 있습니다.
PHP에서 그 두 기능을 같이
function LatitudeSmallToFloat($LatitudeSmall){ if(($LatitudeSmall>0)&&($LatitudeSmall>>31)) $LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1; return (float)$LatitudeSmall/(float)600000; }
그리고 다시 :
function LatitudeFloatToSmall($LatitudeFloat){ $Latitude=round((float)$LatitudeFloat*(float)600000); if($Latitude<0) $Latitude+=0xFFFFFFFF; return $Latitude; }
이것은 일부는 정수로, 예를 들어 memcached를 고유 키를 생성의 관점에서뿐만 아니라 장점을 추가했다. (예는 : 지오 코딩 결과를 캐시합니다). 이 토론에 가치를 추가 바랍니다.
당신은 GIS 확장하지 않고 있으며 단순히 그들이 정수 사실에서 이익을 위해 MySQL의에서 이러한 필드에 파티션을 사용할 수 있습니다, 그 위도 / 경도 쌍의 몇 만 달러를 유지하려는 경우 다른 응용 프로그램이 될 수 :
Create Table: CREATE TABLE `Locations` ( `lat` int(10) unsigned NOT NULL, `lon` int(10) unsigned NOT NULL, `location` text, PRIMARY KEY (`lat`,`lon`) USING BTREE, KEY `index_location` (`locationText`(30)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50100 PARTITION BY KEY () PARTITIONS 100 */
-
==============================
6.나는 당신의 데이터에 대한 적절한 정밀도로 소수점을 사용합니다.
나는 당신의 데이터에 대한 적절한 정밀도로 소수점을 사용합니다.
-
==============================
7.나는 당신이 가장 자주 할 필요가있을거야 작업에 따라 달라집니다 생각합니다.
나는 당신이 가장 자주 할 필요가있을거야 작업에 따라 달라집니다 생각합니다.
10 진수 번호와 가치를해야 할 경우, 적절한 정밀도와 규모 진수를 사용합니다. 플로트가 당신의 요구 사항을 넘어 방법입니다, 저는 믿습니다.
자주 degºmin'sec "분수 표기법에서 /로 변환됩니다 경우에, 나는 정수 형식으로 각 값을 저장하는 생각 하는데요 (SMALLINT, TINYINT, TINYINT, SMALLINT?).
-
==============================
8.당신은 그들이 특별히 작업 및 메이크업 인덱싱 훨씬 더 쉽고 효율적으로 데이터를 쿼리 이런 종류의 설계 SQL 서버 2008에 도입 된 새로운 공간 데이터 유형을 살펴해야한다.
당신은 그들이 특별히 작업 및 메이크업 인덱싱 훨씬 더 쉽고 효율적으로 데이터를 쿼리 이런 종류의 설계 SQL 서버 2008에 도입 된 새로운 공간 데이터 유형을 살펴해야한다.
http://msdn.microsoft.com/en-us/library/bb933876(v=sql.105).aspx
http://blogs.technet.com/andrew/archive/2007/11/26/sql-server-2008-spatial-data-types.aspx
from https://stackoverflow.com/questions/1196415/what-datatype-to-use-when-storing-latitude-and-longitude-data-in-sql-databases by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] "여기서 1 = 1"문 [중복] (0) | 2020.04.28 |
---|---|
[SQL] 어떻게 SQL 쿼리에서 변수를 설정하는 방법? (0) | 2020.04.28 |
[SQL] 테이블의 열 순서 걱정할 어떤 이유가 있나요? (0) | 2020.04.28 |
[SQL] 때 ... FOR UPDATE SELECT 사용 하는가? (0) | 2020.04.28 |
[SQL] PostgreSQL의에서 인덱스 목록 열 (0) | 2020.04.28 |