중요
번역은 여러분이 참여할 수 있는 커뮤니티 활동입니다. 이 페이지는 현재 100.00% 번역되었습니다.
16.2. 수업: 단순 피처 모델
데이터베이스 안에 지리 피처를 어떻게 저장하고 표현할 수 있을까요? 이번 수업에서 OGC가 정의한 단순 피처 모델(Simple Feature Model)이라는 한 접근법을 배워보도록 합시다.
이 수업의 목표: SFS 모델이 무엇인지 그리고 어떻게 사용하는지 배우기.
16.2.1. OGC란?
자발적인 국제 표준 합의 기구 OGC(Open Geospatial Consortium)는 1994년 창립되었다. 전 세계적으로 370개 이상의 기업, 정부, 비영리 및 연구 조직들이 모여 지리공간 콘텐츠와 서비스, GIS 데이터 처리와 데이터 공유를 위한 표준 개발 및 구현을 장려하는 공개 합의 과정에 협력하고 있다. - 위키백과
16.2.2. SFS 모델이란?
SFS(Simple Feature for SQL) 모델은 데이터베이스에 비위상적인 방식으로 지리공간 데이터를 저장하고 이 데이터를 접근, 작업, 구성하는 기능들을 정의합니다.
이 모델은 포인트, 라인스트링, 폴리곤 (그리고 이들의 집합인 멀티 객체) 유형으로 지리공간 데이터를 정의합니다.
더 자세한 정보를 알고 싶다면 OGC의 SQL 용 단순 피처 표준을 참조하십시오.
16.2.3. 테이블에 도형 필드 추가하기
사용자의 ‘people’ 테이블에 포인트 필드를 추가해봅시다:
alter table people add column geom geometry;
16.2.4. 도형 유형 기반 제약조건 추가하기
도형 필드의 유형이 무조건 필드에 들어 있는 도형의 *유형*을 지정하지는 않는다는 사실을 눈치챘을 겁니다. 이를 위해서는 제약조건이 필요합니다:
alter table people
add constraint people_geom_point_chk
check(st_geometrytype(geom) = 'ST_Point'::text
OR geom IS NULL);
이렇게 테이블에 제약조건을 추가하면 포인트 도형 또는 NULL 값만을 받아들이게 됩니다.
16.2.5. ★★★ 혼자서 해보세요:
‘cities’라는 새 테이블을 생성하고 폴리곤(도시 경계)을 저장하기 위한 도형 필드를 포함한 적절한 몇몇 열을 지정하십시오. 도형 필드가 폴리곤만을 받아들이도록 하는 제약조건을 걸어야 합니다.
해답
16.2.6. ‘geometry_columns’ 테이블 채우기
이 시점에서 geometry_columns
테이블에도 항목을 추가해야 합니다:
insert into geometry_columns values
('','public','people','geom',2,4326,'POINT');
왜냐구요? 특정 응용 프로그램들이 데이터베이스에서 도형 데이터를 담고 있는 테이블을 찾을 때 geometry_columns 를 이용하기 때문입니다.
참고
앞의 INSERT
선언문이 오류를 일으키는 경우, 우선 다음 쿼리를 실행하십시오:
select * from geometry_columns;
f_table_name 열이 people 값을 담고 있다면, 이 테이블은 이미 등록됐다는 뜻이므로 아무것도 할 필요가 없습니다.
2
값은 차원의 개수를 의미합니다. 이 경우 X 와 Y 2개를 뜻합니다.
4326 값은 우리가 사용할 투영체를 의미합니다. 이 경우, 4326이란 숫자는 (EPSG에 대한 앞에서의 설명대로) WGS84를 뜻합니다.
★☆☆ 혼자서 해보세요:
사용자의 ‘cities’ 레이어에 적합한 ‘geometry_columns’ 항목을 추가하십시오.
해답
insert into geometry_columns values
('','public','cities','geom',2,4326,'POLYGON');
16.2.7. SQL을 사용해서 테이블에 도형 레코드 추가하기
이제 테이블에서 지리공간 데이터를 이용할 수 있으므로, 테이블에 도형을 저장할 수 있습니다:
insert into people (name,house_no, street_id, phone_no, geom)
values ('Fault Towers',
34,
3,
'072 812 31 28',
'SRID=4326;POINT(33 -33)');
참고
이 새 항목에 대해, 사용하고자 하는 투영체(SRID)를 지정해야 합니다. 플레인 텍스트 문자열로 이 새 포인트 도형을 입력했기 때문에, 정확한 투영체 정보를 자동으로 추가하지 못 합니다. 이 새 포인트는 당연히 자기가 추가되는 데이터셋과 동일한 SRID를 사용해야 하므로, 이를 지정해주어야 합니다.
예를 들어 이 시점에서 GUI를 사용하고 있을 경우, 각 포인트에 대해 자동적으로 투영체를 지정할 것입니다. 다시 말해 이전 단계에서처럼 데이터셋에 투영체를 설정했다면, 추가하고자 하는 모든 포인트에 정확한 투영체를 사용했는지 일반적으로는 걱정할 필요가 없습니다.
이제 QGIS를 실행해서 사용자의 people 테이블을 살펴보도록 합시다. 또, 레코드를 편집/추가/삭제한 다음 데이터베이스에 선택 쿼리를 실행해서 데이터가 어떻게 변경됐는지 보도록 합시다.
QGIS에 PostGIS 레이어를 불러오려면, 메뉴에서
항목을 선택하거나 다음 툴바 버튼을 클릭하십시오:다음 대화창이 나타날 것입니다:
New 버튼을 클릭해서 다음 대화창을 여십시오:
새 연결을 다음처럼 정의하십시오:
Name: myPG
Service:
Host: localhost
Port: 5432
Database: address
User:
Password:
QGIS가 address 데이터베이스를 찾았는지, 그리고 사용자의 사용자 이름과 비밀번호가 정확한지 보려면 Test Connect 를 클릭하십시오. 성공할 경우, Save Username 및 Save Password 옆의 체크박스를 체크하십시오. 그 다음 OK 를 클릭해서 이 연결을 생성합니다.
다시 Add PostGIS Layers 대화창으로 돌아가서, Connect 를 클릭한 다음 평상시처럼 사용자 프로젝트에 레이어를 추가하십시오.
★★☆ 혼자서 해보세요:
사람 이름, 도로 이름 및 (‘geom’ 열로부터 나온) 위치를 플레인 텍스트로 보여주는 쿼리를 작성하십시오.
해답
select people.name,
streets.name as street_name,
st_astext(people.geom) as geometry
from streets, people
where people.street_id=streets.id;
결과:
name | street_name | geometry
--------------+-------------+---------------
Roger Jones | High street |
Sally Norman | High street |
Jane Smith | Main Road |
Joe Bloggs | Low Street |
Fault Towers | Main Road | POINT(33 -33)
(5 rows)
제약조건이 데이터베이스에 NULL 값을 추가할 수 있게 해준다는 사실을 알 수 있습니다.
16.2.8. 결론
데이터베이스에 공간 객체를 추가하는 방법과 GIS 소프트웨어에서 해당 객체를 보는 방법을 배웠습니다.
16.2.9. 다음은 무엇을 배우게 될까요?
다음으로 데이터베이스에 데이터를 어떻게 가져오는지, 그리고 데이터베이스에서 데이터를 어떻게 내보내는지 배울 것입니다.