source

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

lovecheck 2023. 4. 17. 21:57
반응형

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

ANSI SQL 준거 데이터베이스에 위도 또는 경도 데이터를 저장할 때 가장 적합한 데이터 유형은 무엇입니까?할까float사용되거나, 또는decimal아니면...?

Oracle, MySql 및 SQL Server가 지역 데이터 처리에 특별한 데이터 유형을 추가한 것은 알고 있습니다만, "일반" SQL 데이터베이스에 정보를 저장하는 방법에 관심이 있습니다.

위도 사용:Decimal(8,6), 및 경도는 다음과 같습니다.Decimal(9,6)

파라미터의 정밀도 및 축척에 익숙하지 않은 경우 다음과 같은 형식 문자열을 시각적으로 보여 줍니다.

위도와 경도##.######그리고.###.######

소수점 이하 6자리까지는 좌표의 정확도가 약 10cm가 됩니다.

플로트를 사용하지만 소수점 이하 6자리 숫자도 사용할 수 있습니다.

당신의 데이터에 적절한 정밀도를 가진 소수점을 사용하겠습니다.

Latitude/Lightitude 저장 방법을 물으셨는데, 제 답변은 다음과 같습니다.WGS 84(유럽 ETS 89의 경우)는 Geo 참조의 표준이므로 사용을 고려할 수 있습니다.

그러나 SQL 2008에 지역 지원이 포함되기 전 며칠 동안 사용자 정의 유형을 사용했습니다.

바닐라 Oracle에서는 LOCATOR(Spatial의 정지된 버전)이라는 기능을 사용하려면 NUMBER(정밀하지 않음)의 데이터 유형을 사용하여 좌표 데이터를 저장해야 합니다.공간 쿼리를 지원하기 위해 기능 기반 인덱스를 작성하려고 하면 그렇지 않으면 차단됩니다.

다음 변환 알고리즘을 사용하여 위/론 10진수를 정수와 십진수로 분할하여 여기에 제시된 대로 따로 저장하는 대신 부호 없는 정수 필드에 쉽게 저장할 수 있습니다.

저장된 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에서 이 2개의 함수는 다음과 같이 보입니다.

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 */

SQL Server 2008에서 도입된 새로운 Spatial 데이터 유형을 살펴봐야 합니다.이러한 유형의 작업은 특별히 설계되어 인덱싱 및 데이터 쿼리를 훨씬 쉽고 효율적으로 수행할 수 있습니다.

http://msdn.microsoft.com/en-us/library/bb933876(v=sql.105).aspx

가장 자주 해야 할 수술에 따라 다르다고 생각합니다.

십진수로 전체 값이 필요한 경우 적절한 정밀도와 척도를 가진 십진수를 사용하십시오.플로트는 당신의 필요를 훨씬 넘어섰다고 생각합니다.

deg notationmin'sec" fraction 표기로 자주 변환하는 경우 각 값을 정수형(smallint, tinyint, smallint?)으로 저장하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/1196415/what-datatype-to-use-when-storing-latitude-and-longitude-data-in-sql-databases

반응형