위도와 경도에 대한 데이터 유형은 무엇입니까?


154

PostgreSQL과 PostGIS를 처음 사용합니다. PostgreSQL 9.1.1 데이터베이스 테이블에 위도 및 경도 값을 저장하고 싶습니다. 두 점 사이의 거리를 계산하고이 위치 값을 사용하여 더 가까운 점을 찾습니다.

위도와 경도에 어떤 데이터 유형을 사용해야합니까?


4
두 점 (2D 위도 / 경도 맵)을 수행하는 경우 Geometry 데이터 유형을 사용합니다. 당신이 당신의 거리 계산에 지구의 고도 또는 곡률을 소개 해야하는 경우, 지리가 가고 싶은 곳입니다.
12

4
아래 답변 중 귀하의 질문에 대한 답변이 있습니까? 그렇다면 답으로 하나를 선택하는 것이 좋습니다.)
Volte

답변:


140

위도 / 길이가 될 수있는 데이터 유형 point-결합 (x,y)을 사용할 수 있습니다. 16 바이트를 점유합니다 : float8내부적으로 2 개의 숫자.

또는 float(= float8또는 double precision) 유형의 두 열로 만드십시오 . 각각 8 바이트
또는 real(= float4) 추가 정밀도가 필요하지 않은 경우. 각각 4 바이트
또는numeric 절대 정밀도가 필요한 경우 입니다. 각 그룹의 4 자리 숫자는 2 바이트이며 오버 헤드는 3-8 바이트입니다.

숫자 유형기하 유형 에 대한 자세한 설명서를 읽으십시오 .


geometrygeography데이터 유형은 추가 모듈에 의해 제공됩니다 PostGIS와 차지할 하나의 테이블에 열을. 각 포인트에 대해 32 바이트를 차지합니다. SRID와 같은 추가 오버 헤드가 있습니다. 이러한 유형은 (lat / long)이 아닌 (long / lat)을 저장합니다.

여기 에서 PostGIS 매뉴얼을 읽으 십시오 .


5
float데이터 유형을 사용하지 않는 것이 좋습니다 . 좌표 계산이 매우 복잡합니다. geography이러한 계산 에는 PostGIS와 데이터 유형을 사용해야합니다 .
m13r

9
정말 훌륭한 매뉴얼입니까? 문서에서 빛나는 예.
otocan

1
원래의 긴 위도에 대한 구문 분석 지오메트리보다 긴, 위도 및 지오그를 저장하는 것이 더 빠릅니까?
Dan

1
@ Dan : 다릅니다. 자세한 내용 은 새로운 질문 을하십시오. 컨텍스트를 위해 항상이 링크에 연결할 수 있습니다. 의견은 새로운 질문의 장소가 아닙니다.
Erwin Brandstetter 2

40

PostGIS에는 위도와 경도가있는 점에 대해 지리 데이터 유형이 있습니다.

열을 추가하려면

alter table your_table add column geog geography;

데이터를 삽입하려면

insert into your_table (geog) values ('SRID=4326;POINT(longitude latitude)');

4326은 GPS와 마찬가지로 경도와 위도의 데이터를 나타내는 공간 참조 ID입니다. 그것에 대한 자세한 내용 : http://epsg.io/4326

차수는 경도, 위도이므로지도로 표시하면 (x, y)입니다.

가장 가까운 점을 찾으려면 먼저 공간 인덱스를 작성해야합니다.

create index on your_table using gist (geog);

주어진 지점에 가장 가까운 5를 요청하십시오.

select * 
from your_table 
order by geog <-> 'SRID=4326;POINT(lon lat)' 
limit 5;

1
설명 SRID 4326은 위도의 경도를 순서대로 원합니다. 그러나 PostGIS의 SRID 4326 해석은 위도 순서대로 위도를 원합니다. PostGIS 사용에 대한 예가 맞습니다. postgis.net/2013/08/18/tip_lon_lat
hahmed

26

PostGis를 강력하게 옹호합니다 . 이러한 종류의 데이터 유형에 따라 다르며 미래에 유용 할 수있는 다른 GIS 작업 중에서 포인트 사이의 거리를 계산하는 기본 방법이 있습니다.


5

PostGIS가 제공하는 모든 기능이 필요하지 않은 경우 Postgres (현재)는 earthdistance 라는 확장 모듈을 제공합니다 . 거리 계산에 필요한 정확도에 따라 포인트 또는 큐브 데이터 유형을 사용합니다 .

이제 earth_box 함수를 사용하여 위치의 특정 거리 내에있는 점을 쿼리 할 수 ​​있습니다.


2

PostGIS에서 지오메트리 (라운드 어스 모델)보다 지오메트리가 선호됩니다. 계산이 훨씬 간단하므로 더 빠릅니다. 또한 더 많은 기능을 사용할 수 있지만 장거리에서는 정확도가 떨어집니다.

CSV를 긴 위도 필드로 DECIMAL(10,6)열로 가져옵니다 . 6 자리 숫자는 10cm 정밀도이며 대부분의 경우에 충분해야합니다.

그런 다음 가져온 데이터를 전송하십시오.

SELECT 
    --ST_SetSRID(ST_Point(long, lat),4326) geom -- the wrong way because SRID not set in geometry_columns table
    ST_Point(long, lat)::geometry(Geometry, 4326) geom
INTO target_table
FROM source_table;

SRID가 0이 아닌지 확인하십시오!

SELECT * FROM public.geometry_columns WHERE f_table_name = 'target_table';

WKT 뷰어를 사용하여 long lat 매개 변수의 순서를 확인하고 ST_AsEWKT(target_table.geom) .

그런 다음 최상의 성능을 위해 색인을 생성하십시오.

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