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 바이트입니다.
숫자 유형 및 기하 유형 에 대한 자세한 설명서를 읽으십시오 .
geometry
및 geography
데이터 유형은 추가 모듈에 의해 제공됩니다 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);