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

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

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



답변

위도 / 길이가 될 수있는 데이터 유형 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 매뉴얼을 읽으 십시오 .


답변

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;


답변

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


답변

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

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


답변

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);


답변