복붙노트

[SQL] SQL 데이터베이스에 위도와 경도 데이터를 저장할 때 어떤 데이터 유형을 사용 하는가? [복제]

SQL

SQL 데이터베이스에 위도와 경도 데이터를 저장할 때 어떤 데이터 유형을 사용 하는가? [복제]

은 ANSI SQL 호환 데이터베이스에 위도 또는 경도 데이터를 저장하면, 어떤 데이터 형식 가장 적절한 것입니까? ... 사용, 또는 10 진수, 또는 float를해야 하는가?

나는 오라클, MySQL은, 및 SQL Server는 특히 지리적 데이터를 처리하기위한 특별한 데이터 유형을 추가 한 것을 알고 있어요,하지만 난 당신이 "일반 바닐라"SQL 데이터베이스에 정보를 저장하는 것입니다 방법에 관심이 있어요.

해결법

  1. ==============================

    1.진수 (9,6)

    진수 (9,6)

    당신은 정밀도와 규모 매개 변수를 사용하지 않는 경우, 여기 형식 문자열 시각이다 :

    ###.######

  2. ==============================

    2.우리는 플로트를 사용하지만, 6 소수점해야 또한 작업과 숫자의 맛.

    우리는 플로트를 사용하지만, 6 소수점해야 또한 작업과 숫자의 맛.

  3. ==============================

    3.글쎄, 당신은 위도 / 경도를 저장하는 방법을 물어 내 대답은 : 마, 당신은 사용하는 것이 좋습니다하지 WGS (84)가 지리적 참조에 대한 표준으로 (유럽 ETRS 89).

    글쎄, 당신은 위도 / 경도를 저장하는 방법을 물어 내 대답은 : 마, 당신은 사용하는 것이 좋습니다하지 WGS (84)가 지리적 참조에 대한 표준으로 (유럽 ETRS 89).

    그러나 세부 사항은 따로 드디어 지리적 지원을 포함 SQL 2008 이전의 일 유형 정의 사용자를 사용했다.

  4. ==============================

    4.바닐라 오라클에서 기능이라고 LOCATOR (공간의 파행 버전) 좌표 데이터 번호 (NO 정밀)의 데이터 유형을 사용하여 저장해야합니다. 공간 데이터 쿼리를 지원하는 기능을 기반으로 인덱스를 만들려고 할 때 그렇지 않으면 개그 것이다.

    바닐라 오라클에서 기능이라고 LOCATOR (공간의 파행 버전) 좌표 데이터 번호 (NO 정밀)의 데이터 유형을 사용하여 저장해야합니다. 공간 데이터 쿼리를 지원하는 기능을 기반으로 인덱스를 만들려고 할 때 그렇지 않으면 개그 것이다.

  5. ==============================

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

    6.나는 당신의 데이터에 대한 적절한 정밀도로 소수점을 사용합니다.

    나는 당신의 데이터에 대한 적절한 정밀도로 소수점을 사용합니다.

  7. ==============================

    7.나는 당신이 가장 자주 할 필요가있을거야 작업에 따라 달라집니다 생각합니다.

    나는 당신이 가장 자주 할 필요가있을거야 작업에 따라 달라집니다 생각합니다.

    10 진수 번호와 가치를해야 할 경우, 적절한 정밀도와 규모 진수를 사용합니다. 플로트가 당신의 요구 사항을 넘어 방법입니다, 저는 믿습니다.

    자주 degºmin'sec "분수 표기법에서 /로 변환됩니다 경우에, 나는 정수 형식으로 각 값을 저장하는 생각 하는데요 (SMALLINT, TINYINT, TINYINT, SMALLINT?).

  8. ==============================

    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

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