16.2. Lesson: 단순 피처 모델
어떻게 데이터베이스 안에 지리 피처를 저장하고 표현할 수 있을까요? 이번 강의에서 OGC가 정의한 단순 피처 모델이라는 한 가지 접근법을 배워보도록 합시다.
이 강의의 목표: SFS 모델이 무엇인지 그리고 어떻게 사용하는지 배우기.
16.2.1. OGC란?
자발적인 국제 표준 합의 기구 OGC(Open Geospatial Consortium)는 1994년 창립되었다. 전 세계적으로 370개 이상의 기업, 정부, 비영리 및 연구 조직들이 모여 지리공간 콘텐츠와 서비스, GIS 데이터 처리와 데이터 공유를 위한 표준 개발 및 시행을 장려하는 공개 합의 과정에 협력하고 있다. - 위키백과
16.2.2. SFS 모델이란?
SFS(Simple Feature for SQL) 모델은 데이터베이스에 비위상적인 방식으로 지리공간 데이터를 저장하고 이 데이터를 접근, 작업, 구성하는 기능들을 정의합니다.
이 모델은 포인트, 라인스트링, 폴리곤 (그리고 이들의 집합인 다중 오브젝트) 유형으로 지리공간 데이터를 정의합니다.
For further information, have a look at the OGC Simple Feature for SQL standard.
16.2.3. 테이블에 도형 필드 추가
사용자의 ‘people’ 테이블에 포인트 필드를 추가해봅시다:
alter table people add column the_geom geometry;
16.2.4. 도형의 유형을 기반으로 하는 제약 조건 추가
도형 필드의 유형이 무조건 필드에 들어 있는 도형의 *유형*을 지정하지는 않는다는 사실을 눈치챘을 겁니다. 이를 위해서는 제약 조건이 필요합니다:
alter table people
add constraint people_geom_point_chk
check(st_geometrytype(the_geom) = 'ST_Point'::text
OR the_geom IS NULL);
이렇게 테이블에 제약 조건을 걸면 포인트 도형 또는 널 값만을 받아들이게 됩니다.
16.2.5. Try Yourself 고급
‘cities’라는 새 테이블을 생성하고 폴리곤(도시 경계)을 저장하기 위한 도형 필드를 포함한 적절한 몇몇 열을 부여하십시오. 도형 필드가 폴리곤만을 받아들이도록 하는 제약 조건을 걸어야 합니다.
Answer
create table cities (id serial not null primary key,
name varchar(50),
the_geom geometry not null);
alter table cities
add constraint cities_geom_point_chk
check (st_geometrytype(the_geom) = 'ST_Polygon'::text );
16.2.6. ‘geometry_columns’ 테이블 채우기
이제 geometry_columns
테이블에도 항목을 추가해야 합니다:
insert into geometry_columns values
('','public','people','the_geom',2,4326,'POINT');
왜냐구요? 특정 응용 프로그램들이 데이터베이스에서 도형 데이터를 담고 있는 테이블을 찾을 때 geometry_columns 를 이용하기 때문입니다.
참고
앞의 INSERT
선언문이 오류를 일으키면 우선 다음 쿼리를 실행하십시오:
select * from geometry_columns;
f_table_name 열이 people 값을 담고 있다면, 이 테이블은 이미 등록됐다는 뜻이므로 아무것도 할 필요가 없습니다.
2
값은 차원의 개수를 의미합니다. 이 경우 X 와 Y 2개를 뜻합니다.
4326 값은 우리가 사용할 투영체를 의미합니다. 이 경우, 4326이란 숫자는 (EPSG에 대한 앞에서의 설명대로) WGS84를 뜻합니다.
Try Yourself 초급
사용자의 ‘cities’ 레이어에 적합한 ‘geometry_columns’ 항목을 추가하십시오.
Answer
insert into geometry_columns values
('','public','cities','the_geom',2,4326,'POLYGON');
16.2.7. SQL을 이용해 테이블에 도형 레코드 추가
이제 테이블에서 지리공간 데이터를 이용할 수 있으므로, 테이블에 도형을 저장할 수 있습니다:
insert into people (name,house_no, street_id, phone_no, the_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 를 클릭한 다음 평상시처럼 사용자 프로젝트에 레이어를 추가하십시오.
Try Yourself 중급
인물의 성명, 도로명 및 (‘the_geom’ 열로부터) 위치를 플레인 텍스트로 보여주는 쿼리를 작성하십시오.
Answer
select people.name,
streets.name as street_name,
st_astext(people.the_geom) as geometry
from streets, people
where people.street_id=streets.id;
Result:
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)
As you can see, our constraint allows nulls to be added into the database.
16.2.8. In Conclusion
사용자 데이터베이스에 공간 오브젝트를 추가하는 방법 및 GIS 소프트웨어에서 해당 오브젝트를 보는 방법을 배웠습니다.
16.2.9. What’s Next?
다음으로 어떻게 사용자 데이터베이스에 데이터를 가져오는지, 그리고 사용자 데이터베이스에서 데이터를 내보내는지 배울 것입니다.