16.2. 속성 테이블 작업

속성 테이블은 선택한 레이어의 피처에 관한 정보를 표시합니다. 테이블에 있는 각 행은 (도형을 지닌 또는 지니지 않은) 피처를 나타내며, 각 열은 피처에 관한 한 가지 특정 정보를 담고 있습니다. 테이블에 있는 피처를 검색하고, 선택하고, 이동시키거나 편집할 수도 있습니다.

16.2.1. 서문: 공간 및 비공간 테이블

QGIS는 공간 및 비공간 레이어를 로드할 수 있습니다. PostgreSQL, MS SQL 서버, SpatiaLite 및 오라클은 물론 현재 GDAL에서 지원하는 테이블과 구분자로 구분된 텍스트도 포함합니다. 로드된 레이어는 모두 Layers 패널 안에 나열됩니다. 레이어를 공간적으로 활성화시킬 수 있는지 여부가 맵 상에서 레이어와 상호 작용할 수 있는지 여부를 결정합니다.

속성 테이블 뷰를 통해 비공간 테이블을 둘러보고 편집할 수 있습니다. 거기에, 비공간 테이블을 사용해서 필드 검색을 할 수도 있습니다. 예를 들면, 디지타이즈 작업 중에 비공간 테이블의 열을 이용해서 속성값 또는 허용되는 값의 범위를 정의한 다음 특정 벡터 레이어에 추가할 수 있습니다. 자세한 내용은 속성 양식 속성 에 있는 편집 위젯을 자세히 살펴보세요.

16.2.2. 속성 테이블 인터페이스 소개

벡터 레이어의 속성 테이블을 열려면, 레이어 패널 에서 해당 레이어를 클릭해서 활성화시키십시오. 그 다음 메인 Layer 메뉴에서 openTable Open Attribute Table 메뉴 옵션을 선택하십시오. 레이어를 오른쪽 클릭한 다음 컨텍스트 메뉴에서 openTable Open Attribute Table 을 선택하거나, 속성 툴바에 있는 openTable Open Attribute Table 아이콘을 클릭해도 됩니다. 단축키를 선호한다면, F6 키를 누르면 속성 테이블이 열릴 것입니다. Shift+F6 키 조합을 누르면 선택한 피처로 필터링한 속성 테이블이 열리고, Ctrl+F6 키 조합을 누르면 가시화 피처로 필터링한 속성 테이블이 열릴 것입니다.

이렇게 하면 레이어의 피처 속성을 표시하는 새 창이 열립니다. (그림 16.67 참조) Settings ► Options ► Data sources 메뉴의 설정에 따라, 도킹 창(docked window) 또는 일반 창에서 속성 테이블을 열 것입니다. 속성 테이블 제목에 레이어가 공간적으로 제한됐는지는 물론, 레이어에 있는 피처의 총 개수 및 현재 선택한/필터링한 피처의 개수도 표시됩니다.

../../../_images/vectorAttributeTable.png

그림 16.67 “regions” 레이어의 속성 테이블

속성 테이블 창 상단에 있는 아이콘들은 다음과 같은 기능을 제공합니다:

표 16.1 사용할 수 있는 도구들

아이콘

라벨

목적

기본 단축키

toggleEditing

Toggle editing mode

편집 기능 활성화

Ctrl+E

multiEdit

Toggle multi edit mode

여러 피처들의 여러 필드들을 업데이트

saveEdits

Save Edits

현재 수정 사항을 저장

refresh

Reload the table

newTableRow

Add feature

도형 없는 새 피처를 추가

deleteSelectedFeatures

Delete selected features

레이어에서 선택한 피처를 제거

editCut

Cut selected features to clipboard

Ctrl+X

copySelected

Copy selected features to clipboard

Ctrl+C

editPaste

Paste features from clipboard

복사한 피처로부터 새 피처를 삽입

Ctrl+V

expressionSelect

Select features using an Expression

selectAll

Select All

레이어에 있는 모든 피처를 선택

Ctrl+A

invertSelection

Invert selection

레이어에 있는 현재 선택을 반전

Ctrl+R

deselectActiveLayer

Deselect all

현재 레이어에 있는 모든 피처를 선택 해제

Ctrl+Shift+A

filterMap

양식을 이용해서 피처 필터링/선택하기

Ctrl+F

selectedToTop

Move selected to top

선택한 행을 테이블 맨 위로 이동

panToSelected

Pan map to the selected rows

Ctrl+P

zoomToSelected

Zoom map to the selected rows

Ctrl+J

newAttribute

New field

데이터소스에 새 필드를 추가

Ctrl+W

deleteAttribute

Delete field

데이터소스에서 필드를 제거

editTable

Organize columns

속성 테이블에서 필드를 표시/숨기기

calculateField

Open field calculator

행에 있는 여러 피처들의 필드를 업데이트

Ctrl+I

conditionalFormatting

Conditional formatting

테이블 서식 작업 활성화

dock

Dock attribute table

속성 테이블 도킹/언도킹을 토글

actionRun

Actions

레이어 관련 액션 목록

참고

데이터 유형 및 사용자의 QGIS 버전과 함께 빌드한 GDAL 라이브러리에 따라, 일부 도구를 사용하지 못 할 수도 있습니다.

이 아이콘들 아래엔 (편집 모드 일 때만 활성화되는) 간편 필드 계산 막대가 있는데, 이 계산 막대를 통해 레이어에 있는 피처들 전부 또는 일부에 계산을 간편하게 적용할 수 있습니다. 이 막대는 calculateField Field Calculator (속성값 편집 참조)와 동일한 표현식 을 이용합니다.

속성 테이블에서 Shift+마우스 을 사용하면 수직 스크롤 대신 수평으로 스크롤합니다.

16.2.2.1. 테이블 뷰 대 양식 뷰

QGIS는 속성 테이블에서 데이터를 쉽게 수정할 수 있는 뷰 모드 2개를 제공하고 있습니다:

  • openTable Table view: 피처 여러 개의 값을 각 행이 피처를 나타내고 각 열이 필드를 나타내는 표 모드로 표시합니다. 열 헤더를 오른쪽 클릭하면 테이블을 표시하는 방식을 환경 설정 할 수 있고, 셀을 오른쪽 클릭하면 피처와 대화형 작업 을 할 수 있습니다.

  • formView Form view: 첫 번째 패널에 피처 식별자 를 표시하고 두 번째 패널에는 첫 번째 패널에서 클릭한 식별자의 속성만 표시합니다. 첫 번째 패널 상단에 있는 드롭다운 메뉴에서 속성(Column preview) 또는 표현식(Expression)을 이용해서 “식별자” 를 지정할 수 있습니다. 이 드롭다운 메뉴에서 최근 사용한 표현식 10개를 다시 사용할 수도 있습니다. 양식 뷰는 레이어 필드 환경 설정을 (속성 양식 속성 참조) 사용합니다.

    첫 번째 패널 하단에 있는 화살표를 이용해서 피처 식별자를 탐색할 수 있습니다. 사용자가 탐색하는 대로 두 번째 패널의 피처 속성이 업데이트될 것입니다. 첫 번째 패널 하단의 다음 버튼들 가운데 하나로 맵 캔버스에 있는 활성 피처를 식별하거나 활성 피처로 이동할 수 있습니다:

    • highlightFeature Highlight current feature: 맵 캔버스에 현재 피처가 가시화되어 있는 경우 현재 피처를 강조합니다.

    • panTo Automatically pan to current feature: 현재 피처로 자동 이동합니다.

    • zoomTo Zoom to current feature: 현재 피처로 확대/축소합니다.

대화창 우하단에 있는 대응하는 아이콘을 클릭해서 두 뷰 모드 사이를 전환할 수 있습니다.

Settings ► Options ► Data Sources 메뉴에서 속성 테이블이 열릴 때의 Default view 를 설정할 수도 있습니다. ‘Remember last view’, ‘Table view’ 또는 ‘Form view’ 옵션 가운데 하나를 선택할 수 있습니다.

../../../_images/attribute_table_views.png

그림 16.68 속성 테이블의 테이블 뷰(위) 대 양식 뷰(아래)

16.2.2.2. 열 환경 설정하기

테이블 뷰에서 열 헤더를 오른쪽 클릭하면, 다음을 제어할 수 있도록 해주는 도구에 접근할 수 있습니다:

열 너비 설정하기

열 헤더를 오른쪽 클릭한 다음 다음 가운데 하나를 선택하면 열 너비를 설정할 수 있습니다:

  • Set width…: 원하는 값을 입력할 수 있습니다. 기본적으로, 위젯에는 현재 값이 표시됩니다.

  • Set all column widths…: 모든 열 너비를 동일한 값으로 설정할 수 있습니다.

  • Autosize: 열에 가장 알맞은 너비로 조정할 수 있습니다.

  • Autosize all columns: 모든 열을 가장 알맞은 너비로 조정할 수 있습니다.

열 헤더의 오른쪽 경계선을 드래그해서 열 너비를 변경할 수도 있습니다. 이 새 열 너비는 레이어에 저장되어, 다음에 속성 테이블을 열 때 복원될 것입니다.

열 숨기기와 정리하기 및 액션 활성화하기

Hide column: 열 헤더를 오른쪽 클릭하면 (“테이블 뷰” 모드인) 속성 테이블에서 열을 숨길 수 있습니다. 좀 더 고급 제어를 하려면, 대화창 툴바에서 editTable Organize columns… 버튼을 누르거나 열 헤더의 컨텍스트 메뉴에서 Organize columns… 항목을 선택하십시오. 새로 열리는 대화창에서 다음을 제어할 수 있습니다:

  • 사용자가 표시하거나 숨기고자 하는 열을 체크/체크 해제할 수 있습니다: 숨긴 열은 직접 복원할 때까지 속성 테이블 대화창의 모든 인스턴스에서 사라질 것입니다.

  • 속성 테이블에서 열을 재정렬하기 위해 항목을 드래그&드롭할 수 있습니다. 이 작업은 테이블 렌더링을 변경하는 것이지 레이어 데이터소스의 필드 순서를 변경하는 것이 아니라는 점을 기억하십시오.

  • 각 행에 활성화된 액션들의 드롭다운 박스 또는 버튼 목록을 표시하는 새로운 가상 Actions 열을 추가할 수 있습니다. 액션에 관한 자세한 정보를 알고 싶다면 액션 속성 을 참조하세요.

열 정렬하기

열 헤더를 클릭하면, 어떤 열로든 테이블을 정렬시킬 수 있습니다. 작은 화살표는 정렬 순서를 나타냅니다. (아래를 가리키는 화살표는 최상위 행으로부터 아래 방향으로 값을 내림차순으로 정렬하고, 위를 가리키는 화살표는 최상위 행으로부터 아래 방향으로 값을 오름차순으로 정렬한다는 의미입니다.) 열 헤더의 컨텍스트 메뉴에서 Sort… 항목을 선택하고 표현식을 작성해서 행들을 정렬시킬 수도 있습니다. 예를 들어 열 여러 개를 이용해서 행들을 정렬시키려면 concat(col0, col1) 같은 표현식을 작성하면 됩니다.

양식 뷰에서는, sort Sort by preview expression 옵션을 통해 피처 식별자를 정렬할 수 있습니다.

서로 다른 유형의 열을 기반으로 정렬하기

문자열과 숫자 유형의 열들을 기반으로 속성 테이블을 정렬하려 할 때, concat("USE", "ID") 표현식이 문자열 값을 (예를 들어 'Borough105' < 'Borough6') 반환하기 때문에 예기치 못한 결과로 이어질 수도 있습니다. 대신 concat("USE", lpad("ID", 3, 0)) 과 같은 표현식을 사용하면 'Borough105' > 'Borough006' 을 반환하므로 이런 오류를 해결할 수 있습니다.

16.2.2.3. 테이블 셀의 조건부 서식 작업

조건부 서식을 설정하면, 피처에 대해 사용자 지정 조건을 적용시켜 사용자가 특별히 집중하고자 하는 속성 테이블 항목을 강조할 수 있습니다:

  • 도형 (예를 들어 다중 부분 피처, 작은 면적을 가진 피처, 또는 지정한 맵 범위 안에 있는 피처 등등)

  • 필드 값 (예를 들어 값을 한계값과 비교하거나, 비어 있는 셀을 식별하거나 등등)

테이블 뷰의 (양식 뷰에서는 사용할 수 없습니다) 속성 창 우상단에 있는 conditionalFormatting 아이콘을 클릭하면 조건부 서식 패널을 활성화할 수 있습니다.

이 새 패널에서 radioButtonOnField 또는 radioButtonOffFull row 의 서식을 렌더링하기 위한 새 규칙을 추가할 수 있습니다. 새 규칙을 추가하는 양식이 열리는데, 다음 항목을 정의할 수 있습니다:

  • 규칙의 이름

  • 표현식 작성기 함수를 이용한 조건

  • 서식: 사전 정의된 서식 목록에서 선택하거나, 다음과 같은 속성을 기반으로 생성할 수도 있습니다:

    • 배경 및 텍스트 색상

    • 아이콘 사용 여부

    • 볼드체, 이탤릭체, 밑줄, 취소선

    • 폰트

../../../_images/attribute_table_conditional_formating.png

그림 16.69 속성 테이블의 조건부 서식

16.2.3. 속성 테이블의 피처와 상호작용

16.2.3.1. 피처 선택

테이블 뷰에서, 속성 테이블의 각 행은 레이어에 있는 유일 피처의 속성들을 표시합니다. 행을 선택하면 피처도 선택되며 마찬가지로 맵 캔버스에서 (도형을 사용할 수 있는 레이어인 경우) 피처를 선택하면 속성 테이블에서 해당 행이 선택됩니다. 맵 캔버스(또는 속성 테이블)에서 선택한 피처의 집합을 변경하는 경우, 그에 따라 속성 테이블(또는 맵 캔버스)에 있는 선택도 업데이트됩니다.

행 왼쪽에 있는 행 번호를 클릭하면 행을 선택할 수 있습니다. Ctrl 키를 누른채 클릭하면 여러 행들 을 선택 표시할 수 있습니다. Shift 키를 누른 채 행 왼쪽에 있는 행 헤더를 몇 개 클릭하면 연속 선택 을 할 수 있습니다. 현재 커서 위치와 클릭한 행 사이의 모든 행들이 선택될 것입니다. 테이블에 있는 셀을 클릭해서 속성 테이블에서 커서 위치를 이동해도 행 선택이 변경되지는 않습니다. 맵 캔버스에서 선택을 변경해도 속성 테이블에서 커서 위치가 이동되지 않습니다.

속성 테이블의 양식 뷰에서는, 기본적으로 왼쪽 패널에 표시된 필드의 값으로 (표시 속성 참조) 피처를 식별합니다. 패널 상단에 있는 드롭다운 목록을 통해 기존 필드를 선택하거나 또는 사용자 지정 표현식을 이용해서 이 식별자를 대체할 수 있습니다. 컨텍스트 메뉴에서 피처 목록을 정렬하도록 선택할 수도 있습니다.

오른쪽 패널에 피처의 속성을 표시하려면 왼쪽 패널에 있는 값을 클릭하십시오. 피처를 선택하려면, 식별자 왼쪽에 있는 정사각형 심볼 안을 클릭해야 합니다. 기본적으로, 심볼이 노랑색으로 바뀔 겁니다. 테이블 뷰와 마찬가지로, 앞에서 설명한 대로 조합키를 이용해서 여러 피처를 한꺼번에 선택할 수 있습니다.

마우스로 피처를 선택하는 것 외에도, 속성 테이블 툴바에서 다음과 같은 툴을 이용해서 피처의 속성에 기반한 자동 선택을 할 수 있습니다(더 자세한 정보와 용례를 알고 싶다면 자동 선택 항 및 그 다음 항을 참조하세요):

  • expressionSelect Select By Expression…

  • formSelect Select Features By Value…

  • deselectActiveLayer Deselect All Features from the Layer

  • selectAll Select All Features

  • invertSelection Invert Feature Selection

양식을 이용해서 피처 필터링하기/선택하기 를 이용해서 피처를 선택할 수도 있습니다.

16.2.3.2. 피처 필터링

속성 테이블에서 피처를 선택하고 나면, 테이블에 선택한 레코드만 표시하기를 바랄 수도 있습니다. 속성 테이블 대화창 좌하단에 있는 드롭다운 목록에서 Show Selected Features 항목을 선택하면 간단하게 선택한 레코드만 볼 수 있습니다. 이 목록은 다음과 같은 필터를 제공하고 있습니다:

  • openTable Show All Features

  • openTableSelected Show Selected Features - Layer 메뉴에서 Open Attribute Table (Selected Features) 항목을 선택하거나 Attributes Toolbar 를 이용하거나 Shift+F6 단축키를 누르는 것과 동일합니다.

  • openTableVisible Show Features visible on map - Layer 메뉴 또는 Attributes Toolbar 에서 Open Attribute Table (Visible Features) 항목을 선택하거나, 또는 Ctrl+F6 단축키를 누르는 것과 동일합니다.

  • openTableEdited Show Edited and New Features - Layer 메뉴 또는 Attributes Toolbar 에서 Open Attribute Table (Edited and New Features) 항목을 선택하는 것과 동일합니다.

  • Field Filter - 필드 값을 기반으로 필터링할 수 있습니다: 목록에서 열을 선택한 다음 값을 입력 또는 선택하고 Enter 키를 눌러 필터링합니다. 그러면 속성 테이블에 num_field = value 또는 string_field ilike '%value%' 표현식과 일치하는 피처만 표시합니다. 문자열을 좀 더 엄격하게 필터링하려면 checkbox Case sensitive 옵션을 체크하면 됩니다.

  • Advanced filter (Expression): 표현식 작성기 대화창을 엽니다. 이 대화창에서 테이블 행들과 일치시킬 복잡 표현식 을 생성할 수 있습니다. 예를 들어 하나 이상의 필드를 이용해서 테이블을 필터링할 수 있습니다. 이를 적용하면, 필터 표현식이 양식 하단에 표시될 것입니다.

  • Stored filter expressions ►: 사용자 속성 테이블을 필터링하는 데 자주 쓰이는 저장된 표현식 을 불러옵니다.

양식을 이용해서도 피처를 필터링할 수 있습니다.

참고

속성 테이블에서 레코드를 필터링해도 레이어에서 피처를 필터링하지는 않습니다. 일시적으로 테이블에서 숨겨진 것뿐으로, 맵 캔버스에서 접근할 수도 있고 필터를 제거해서 접근할 수도 있습니다. 레이어에서 피처를 실제로 숨기는 필터를 원한다면, 쿼리 작성기 를 이용하십시오.

Show Features Visible on Map 으로 데이터소스 필터링 업데이트

성능 향상을 목적으로, 속성 대화창이 열릴 때 속성 테이블에 표시되는 피처가 공간적으로 맵 캔버스 범위로 제한돼 있는 경우 (이 방법에 대해서는 데이터소스 옵션 을 참조하세요) 새 캔버스 범위 상에서 Show Features Visible on Map 을 선택하면 공간 제약 조건을 업데이트합니다.

16.2.3.3. 필터 표현식 저장하기

사용자가 속성 테이블 필터링에 사용한 표현식을 향후 호출을 위해 저장할 수 있습니다. Field Filter 또는 Advanced Filter (expression) 항목을 사용하는 경우, 속성 테이블 대화창 하단의 텍스트 위젯에 사용한 표현식을 표시합니다. 이 텍스트 란 옆에 있는 handleStoreFilterExpressionUnchecked Save expression with text as name 아이콘을 클릭하면 프로젝트에 해당 표현식을 저장합니다. 이 아이콘 옆에 있는 드롭다운 메뉴를 클릭하면 (Save expression as…) 저장할 표현식의 이름을 사용자 지정할 수 있습니다. 저장한 표현식이 표시되고 나면, 아이콘이 handleStoreFilterExpressionChecked 으로 변화하고 드롭다운 메뉴에서 표현식을 편집하고(Edit the expression) 이름을 새로 명명하거나, 또는 저장된 표현식을 삭제(Delete stored expression)할 수 있습니다.

필터 표현식은 프로젝트에 저장되며, 속성 테이블의 Stored filter expressions 메뉴를 통해 사용할 수 있습니다. 이 저장된 필터 표현식은 활성화된 사용자 프로파일의 모든 프로젝트가 공유하는 사용자 표현식 과는 다릅니다.

16.2.3.4. 양식을 이용해서 피처 필터링하기/선택하기

filterMap Filter/Select features using form 을 클릭하거나 Ctrl+F 조합키를 누르면 속성 테이블 대화창이 양식 뷰로 전환되고 모든 위젯도 해당 위젯의 검색형으로 대체될 것입니다.

이 다음부터 설명할 도구 기능은 값으로 피처 선택 에서 설명한 것과 유사합니다. 이 항에서 모든 연산자 및 선택 모드에 대한 설명을 찾아볼 수 있습니다.

../../../_images/tableFilteredForm.png

그림 16.70 필터 양식으로 필터링한 속성 테이블

속성 테이블에서 피처를 필터링/선택하는 경우, 필터를 정의하고 미세 조정할 수 있는 Filter features 버튼이 존재합니다. 이 버튼을 사용하면 Advanced filter (Expression) 옵션을 촉발해서 양식 하단에 있는 편집 가능한 텍스트 위젯에 대응하는 필터 표현식을 표시합니다.

이미 필터링한 피처가 있는 경우, Filter features 버튼 옆에 있는 드롭다운 목록을 이용해서 필터를 미세 조정할 수 있습니다. 다음 옵션을 선택할 수 있습니다:

  • Filter within (“AND”)

  • Extend filter (“OR”)

필터를 적용 해제하려면, 좌하단의 풀다운 메뉴에서 Show all features 메뉴 옵션을 선택하거나 또는 표현식을 삭제한 다음 Apply 버튼을 클릭하거나 Enter 키를 누르십시오.

16.2.4. 피처에 대한 액션 사용

컨텍스트 메뉴를 통해 피처를 다음과 같이 처리할 수 있습니다:

  • Select all: 피처를 모두 선택(Ctrl+A)할 수 있습니다.

  • Copy cell content: 클립보드로 셀의 내용을 복사할 수 있습니다.

  • Zoom to feature: 피처를 먼저 선택하지 않고서도 피처로 확대/축소할 수 있습니다.

  • Pan to feature: 피처를 먼저 선택하지 않고서도 피처로 이동할 수 있습니다.

  • Flash feature: 맵 캔버스에 있는 피처를 강조할 수 있습니다.

  • Open form: 클릭한 피처의 속성 테이블을 양식 뷰로 켜고 끕니다.

../../../_images/copyCellContent.png

그림 16.71 셀 내용 복사 버튼

외부 프로그램에서 (예: 엑셀, 리브레오피스, QGIS 또는 사용자 지정 웹 응용 프로그램 등) 속성 데이터를 이용하고 싶은 경우, 하나 또는 그 이상의 행(들)을 선택한 다음 copySelected Copy selected rows to clipboard 아이콘을 클릭하거나 Ctrl+C 조합키를 누르십시오.

Settings ► Options ► Data Sources 메뉴에서 Copy features as 드롭다운 목록을 통해 붙여넣을 포맷을 다음 가운데 정의할 수 있습니다:

  • 평문 텍스트, 도형 없음

  • 평문 텍스트, WKT 도형

  • GeoJSON

이 컨텍스트 메뉴에 액션 목록을 표시할 수도 있습니다. Layer properties ► Actions 탭에서 활성화할 수 있습니다. 액션에 관한 자세한 정보는 액션 속성 을 참조하세요.

16.2.4.1. 선택한 피처를 새 레이어로 저장하기

선택한 피처를 모든 GDAL 지원 벡터 포맷으로 저장할 수 있고, 또다른 좌표계로 변형시킬 수도 있습니다. Layers 패널에 있는 레이어의 컨텍스트 메뉴에서, Export ► Save selected features as… 를 클릭해서 산출물 데이터셋의 이름, 포맷 및 좌표계를 정의할 수 있습니다. (기존 레이어로부터 레이어 생성 을 참조하세요.) 선택한 피처만 저장하는 checkbox Save only selected features 옵션이 체크돼 있을 것입니다. 이 대화창에서 GDAL 생성 옵션도 설정할 수 있습니다.

16.2.5. 속성값 편집

다음과 같은 방법으로 속성값을 편집할 수 있습니다:

  • 셀 안에 새 값을 직접 입력합니다. 속성 테이블이 테이블 뷰 모드인지 양식 뷰 모드인지는 상관없습니다. 셀 별로, 피처 별로 변경할 수 있습니다.

  • 필드 계산기 이용하기: 행에 이미 존재할 수도 있는 필드를 업데이트하거나, 여러 피처에 대해 필드를 생성합니다. 필드 계산기를 이용해서 가상 필드도 생성할 수 있습니다.

  • 간편 필드 계산 막대 이용하기: 필드 계산기와 동일하지만 기존 필드에 대해서만 사용할 수 있습니다.

  • 다중 편집 모드를 이용합니다. 행에서 여러 피처의 여러 필드를 업데이트합니다.

16.2.5.1. 필드 계산기 이용하기

속성 테이블에 있는 calculateField Field Calculator 아이콘으로 기존 속성값을 기반으로 계산하거나, 또는 ─ 예를 들어 도형 피처의 길이 또는 면적을 계산하는 ─ 함수를 정의할 수 있습니다. 계산 결과를 (가상 필드 일 수도 있는) 새 속성 필드에 저장할 수도 있고, 기존 필드에 있는 값을 업데이트하는 데 쓸 수도 있습니다.

편집을 지원하는 레이어라면 필드 계산기를 사용할 수 있습니다. 필드 계산기 아이콘을 클릭하면 대화창이 열립니다. (그림 16.72 참조) 레이어가 편집 모드가 아닌 경우, 필드 계산기가 계산을 하기 전에 경고 메시지를 표시한 다음 레이어를 편집 모드로 전환할 것입니다.

필드 계산기 대화창은 표현식 작성기 대화창을 바탕으로 표현식을 정의하고 계산 결과를 기존 또는 새로 생성한 필드에 적용할 수 있는 완전한 인터페이스를 제공합니다. 필드 계산기 대화창을 이용하려면, 먼저 다음 가운데 어떤 작업을 하기 원하는지 선택해야만 합니다.

  1. 레이어 전체에 계산 결과를 적용할지 또는 선택한 피처에만 계산 결과를 적용할지

  2. 계산 결과를 추가할 새 필드를 생성할지 또는 기존 필드를 업데이트할지

../../../_images/fieldcalculator.png

그림 16.72 필드 계산기

새 필드를 추가하기로 결정한 경우, 필드명, 필드 유형(정수형, 실수형, 날짜 또는 문자열), 그리고 필요한 경우 필드의 총 길이 및 정밀도를 입력해야 합니다. 예를 들면, 필드 길이를 10으로 그리고 필드 정밀도를 3으로 선택한 경우 소수점 앞에 7자리, 소수점, 그리고 소수점 아래 3자리를 입력할 수 있습니다.

다음은 Expression 탭을 이용하는 경우 필드 계산기가 어떻게 작동하는지 보여주는 짧은 예시입니다. QGIS 예시 데이터셋의 railroads 레이어의 길이를 킬로미터 단위로 계산하려 합니다:

  1. QGIS에 railroads.shp shapefile을 불러온 다음 openTable Open Attribute Table 아이콘을 클릭합니다.

  2. toggleEditing Toggle editing mode 아이콘을 클릭한 다음 calculateField Field Calculator 아이콘으로 필드 계산기 대화창을 엽니다.

  3. checkbox Create a new field 체크박스를 체크해서 계산 결과를 새로운 필드로 저장하도록 합니다.

  4. Output field name 산출 필드명을 length_km 으로 설정하십시오.

  5. Output field type 산출 필드 유형을 Decimal number (real) 로 선택하십시오.

  6. Output field length 산출 필드 길이를 10 으로, Precision 정밀도를 3 으로 설정하십시오.

  7. Geometry 그룹의 $length 를 더블클릭해서 필드 계산기 표현식 란에 도형의 길이를 추가하십시오. (표현식이 작성되는 대로 표현식 란 아래에 실시간으로 업데이트되는 산출물의 미리보기를 60글자까지 볼 수 있습니다.)

  8. 필드 계산기 표현식 란에 / 1000 을 입력해서 표현식을 완성한 다음 OK 버튼을 클릭하십시오.

  9. 이제 속성 테이블에서 새 필드 length_km 를 찾아볼 수 있습니다.

16.2.5.2. 가상 필드 생성하기

가상 필드란 실시간으로 계산되는 표현식을 기반으로 한 필드를 말합니다. 즉 기저 파라미터가 변하자마자 그 값을 자동적으로 업데이트한다는 뜻입니다. 표현식은 한 번만 설정하면 됩니다. 기저 값이 변할 때마다 필드를 다시 계산해야 할 필요가 없습니다. 예를 들어, 사용자가 피처를 디지타이즈하는 과정에서 면적을 평가해야 하는 경우 또는 변할 수도 있는 (예: now() 함수 이용 시) 날짜들 사이의 기간을 자동으로 계산해야 하는 경우 가상 필드를 이용할 수 있습니다.

참고

가상 필드 사용법

  • 가상 필드는 레이어 속성에 영구히 유지되지 않습니다. 가상 필드가 생성된 프로젝트의 프로젝트 파일에만 저장되고 사용할 수 있다는 뜻입니다.

  • 필드 생성 시에만 가상 필드로 설정할 수 있습니다. 가상 필드는 레이어 속성 대화창의 필드 탭에서 정규 물리 또는 결합 필드와 구분하기 위해 보라색 배경으로 표시됩니다. 가상 필드를 생성한 다음에도 코멘트 열에 있는 표현식 버튼을 누르면 가상 필드의 표현식을 편집할 수 있습니다. 가상 필드의 표현식을 수정할 수 있는 표현식 편집기 창이 열릴 것입니다.

16.2.5.3. 간편 필드 계산 막대 사용하기

언제든 사용할 수 있는 필드 계산기와는 달리, 속성 테이블 상단에 있는 간편 필드 계산 막대는 레이어가 편집 모드인 경우에만 표시됩니다. 간편 필드 계산 막대는 표현식 엔진의 도움을 받아 이미 존재하는 필드를 더 빨리 편집할 수 있습니다:

  1. 드롭다운 목록에서 업데이트할 필드를 선택하십시오.

  2. 사용자가 표현식을 직접 입력하거나 또는 expression 표현식 버튼을 이용해서 표현식을 작성해서 텍스트란을 채우십시오.

  3. 사용자의 필요에 따라 Update All, Update Selected 또는 Update Filtered 버튼 가운데 하나를 클릭하십시오.

../../../_images/fieldcalculatorbar.png

그림 16.73 간편 필드 계산 막대

16.2.5.4. 다중 필드 편집하기

이전 도구들과는 달리, 다중 편집 모드는 동시에 서로 다른 피처들의 여러 속성들을 편집할 수 있습니다. 레이어가 편집 모드로 전환되면, 다음과 같이 다중 편집 기능에 접근할 수 있습니다:

  • 속성 테이블 대화창에 있는 툴바에서 multiEdit Toggle multi edit mode 버튼을 클릭하십시오.

  • Edit ► multiEdit Modify attributes of selected features 메뉴를 선택하십시오.

참고

속성 테이블에 있는 도구와는 달리, Edit ► Modify Attributes of Selected Features 메뉴 옵션을 선택하면 속성 변경 사항을 입력할 수 있는 모달 대화창이 열립니다. 즉, 실행 전에 피처를 선택해놓아야 합니다.

행에서 여러 필드를 편집하려면:

  1. 편집하고자 하는 피처를 선택합니다.

  2. 속성 테이블 툴바에서 multiEdit 버튼을 클릭하면 대화창이 양식 뷰로 전환될 것입니다. 이 단계에서 피처를 선택할 수도 있습니다.

  3. 속성 테이블의 오른쪽에 선택한 피처의 필드들(및 값들)이 표시됩니다. 각 필드 옆에 현재 다중 편집 상태를 표시해주는 다음과 같은 새 위젯들이 나타납니다:

    • multiEditMixedValues 선택한 피처들이 이 필드에 서로 다른 값들을 담고 있습니다. 텅 빈 것으로 표시되며 각 피처가 원본 값을 유지할 것입니다. 위젯의 드롭다운 목록에서 필드의 값을 리셋할 수 있습니다.

    • multiEditSameValues 선택한 모든 피처들이 이 필드에 동일한 값을 지니며 양식에 표시된 값이 유지될 것입니다.

    • multiEditChangedValues 필드 편집이 끝나 선택한 모든 피처에 입력한 값을 적용할 것입니다. 대화창 상단에 사용자 변경 사항을 적용할지 또는 리셋할지를 묻는 메시지를 표시합니다.

    이 위젯 가운데 하나를 클릭하면 필드 별로 현재 값을 설정하거나 원본 값으로 리셋할 수 있습니다. 즉 필드 별로 사용자 변경 사항을 되돌릴 수 있다는 뜻입니다.

    ../../../_images/attribute_multiedit.png

    그림 16.74 여러 피처의 필드들을 편집하기

  4. 사용자가 원하는 필드를 변경합니다.

  5. 상단의 메시지 텍스트 또는 왼쪽 패널의 다른 모든 피처에 있는 Apply changes 버튼을 클릭합니다.

선택한 모든 피처 에 변경 사항을 적용할 것입니다. 선택한 피처가 없는 경우, 전체 테이블을 사용자 변경 사항으로 업데이트합니다. 수정 작업은 단일 편집 명령어로 이루어집니다. 따라서 undo Undo 아이콘을 클릭하면 선택한 모든 피처의 속성 변경 사항을 한 번에 되돌릴 것입니다.

참고

다중 편집 모드는 자동 생성된 드래그&드롭 양식에서만 사용할 수 있습니다. (사용자 데이터용 양식을 사용자 지정하기 을 참조하세요.) 사용자 UI 양식은 지원하지 않습니다.

16.2.6. 일대다 또는 다대다 관계 생성

관계는 데이터베이스에서 자주 이용되는 기술입니다. 관계란 서로 다른 레이어(테이블)의 피처(행)가 서로에게 속할 수 있다는 개념입니다.

16.2.6.1. 1대다(1-N) 관계 소개

예를 들어 사용자에게 알래스카의 모든 지역을 담고 있고, 지역명, 지역 유형, (기본키로 동작하는) 유일 ID 관련 속성을 제공하는 (폴리곤) 레이어가 있다고 해보겠습니다.

그런데 알래스카 지역에 위치한 공항 관련 정보를 담고 있는 또다른 포인트 레이어 또는 테이블을 얻었고, 사용자가 이 공항들도 파악하고 싶다고 해보겠습니다. regions 레이어에 이 공항들을 추가하려면, 외래 키(foreign key)를 이용해서 일대다 관계를 생성해야 합니다. 왜냐하면 대부분의 지역에 공항이 몇 군데씩 있기 때문입니다.

../../../_images/relations1.png

그림 16.75 알래스카의 지역과 공항

1대다(1-N) 관계의 레이어들

QGIS는 테이블과 벡터 레이어를 전혀 구분하지 않습니다. 기본적으로, 벡터 레이어는 도형을 지닌 테이블입니다. 따라서 사용자의 테이블을 벡터 레이어로 추가할 수 있습니다. 일대다 관계를 시연해보기 위해, regions shapefile과 regions 레이어에 대한 외래 키 필드(fk_region)를 가지고 있는 airports shapefile을 불러오겠습니다. 이 말은 각 공항이 딱 1개 지역에만 속해 있는 반면 각 지역은 공항을 몇 개든 가지고 있을 수 있다는 뜻입니다. (전형적인 일대다 관계죠.)

1대다(1-N) 관계의 외래 키

airports 레이어의 속성 테이블에 있는 기존 속성 이외에, 외래 키로 동작하는 또다른 fk_region 필드가 필요할 겁니다. (데이터베이스를 사용하고 있다면, 외래 키에 제약 조건을 정의해두는 편이 좋습니다.)

fk_region 필드는 항상 지역의 ID를 담고 있습니다. ID가 속한 지역을 가리키는 포인터라고 생각할 수도 있습니다. 그리고 편집 작업을 위한 사용자 지정 편집기를 디자인할 수 있으며, QGIS가 설정을 처리할 겁니다. 서로 다른 제공자들과 작동하며 (따라서 shapefile 및 CSV 파일도 사용할 수 있습니다) 사용자가 해야 할 일은 QGIS에 사용자의 두 테이블 간의 관계를 알려주는 것뿐입니다.

1대다(1-N) 관계 정의하기

가장 먼저 할 일은 QGIS 에 두 레이어 간의 관계를 알려주는 것입니다. Project ► Properties… 메뉴에서 이 작업을 할 수 있습니다. Relations 탭을 선택한 다음 symbologyAdd Add Relation 버튼을 클릭하십시오.

  • 이름(Name): 제목으로 사용됩니다. 사람이 읽을 수 있는 문자열이어야 하며, 관계의 목적을 설명합니다. 이 예시에서는 그냥 airport_relation 라고 하겠습니다.

  • 참조되는 레이어(Referenced Layer) (부모): 부모 레이어로도 간주되는 이 레이어는 외래 키가 가리키는 기본 키를 가지고 있습니다. 즉 이 예시에서는 regions 레이어입니다. 참조되는 레이어의 기본 키를 정의해야 하는데, 이 예시에서는 ID 입니다.

  • 참조하는 레이어(Referencing Layer) (자식): 자식 레이어로도 간주되는 이 레이어가 외래 키 필드를 담고 있습니다. 이 예시에서는 airports 레이어입니다. 이 레이어의 경우 다른 레이어를 가리키는 참조하는 필드를 추가해야 합니다. 이 예시에서는 fk_region 입니다.

    참고

    어떤 경우, 레이어에 있는 피처들을 유일하게 식별하기 위해 단일 필드 이상이 필요할 때가 있습니다. 이런 레이어와의 관계를 생성하는 데에는 복합 키(composite key), 예를 들어 일치하는 필드들의 단일 쌍 이상이 필요합니다. symbologyAdd Add new field pair as part of a composite foreign key 버튼을 이용해서 필요한만큼 많은 쌍을 추가하십시오.

  • ID: 내부 목적으로 사용되며, 유일한 값이어야 합니다. 사용자 지정 양식 을 작성하기 위해 필요할 수도 있습니다. 이 항목을 비워둘 경우, 자동적으로 생성되지만 사용자가 더 쉽게 다룰 수 있는 ID를 직접 할당할 수도 있습니다.

  • 관계 강도(Relationship Strength): 상위(부모)와 하위(자식) 레이어 사이의 관계 강도를 설정합니다. 기본 Association 유형은 상위 레이어가 하위 레이어에 단순하게 링크되어 있다는 의미인 반면, Composition 유형은 상위 피처를 복제할 때 하위 피처도 복제할 수 있으며 상위 레이어의 피처를 삭제하면 하위 피처도 삭제할 수 있는 등, 모든 수준에서 순차적(cascade)으로 결과물을 산출합니다. (다시 말해 하위의 하위의 … 하위 피처도 삭제할 수 있다는 뜻입니다.)

../../../_images/relations2.png

그림 16.76 지역과 공항 레이어 사이에 관계 추가하기

Relations 탭에서, symbologyAdd Discover Relation 버튼을 눌러 불러온 레이어들의 제공자로부터 사용할 수 있는 관계를 가져올 수도 있습니다. 이 기능은 PostgreSQL 또는 SpatiaLite 같은 데이터 제공자에 저장된 레이어에 대해서 사용할 수 있습니다.

1대다(1-N) 관계용 양식

이제 QGIS가 관계를 인지했으니, 관계를 이용해서 QGIS가 생성하는 양식을 향상시킬 것입니다. 기본 양식 생성 방법(자동 생성)을 변경하지 않았으므로, 양식에 위젯 하나만 추가할 것입니다. 범례에서 regions 레이어를 선택한 다음 식별 도구를 써보십시오. 사용자 설정에 따라 양식이 바로 열릴 수도 있고, 식별 대화창의 액션을 통해 양식을 열어야 할 수도 있습니다.

../../../_images/relations3.png

그림 16.77 “airports”와 관계가 생성된 “regions”의 식별 대화창

그림에서 보이듯이, 이 특정 지역에 할당된 공항이 테이블에 전부 표시됩니다. 또 사용할 수 있는 버튼도 몇 개 있습니다. 이 버튼들을 간단히 설명하겠습니다.

  • toggleEditing 버튼은 편집 모드를 켜고 끕니다. 현재 regions 레이어에 있는 피처의 피처 양식을 보고 있긴 하지만, 이 버튼은 airports 레이어의 편집 모드를 켜고 끈다는 점을 조심하십시오. 왜냐하면 테이블이 airports 레이어의 피처를 표시하고 있기 때문입니다.

  • saveEdits 버튼은 하위 레이어(airports)의 모든 편집 내용을 저장합니다.

  • capturePoint 버튼은 맵 캔버스에 공항(airports) 도형을 디지타이즈할 수 있게 해주며, 기본적으로 현재 지역(regions)에 새 피처를 할당합니다. 도형 유형에 따라 아이콘이 바뀔 것이라는 사실을 기억하십시오.

  • newTableRow 버튼은 airports 레이어의 속성 테이블에 새 레코드를 추가하고, 기본적으로 현재 지역(regions)에 새 피처를 할당합니다. 나중에 Add part 디지타이즈 작업 도구로 도형을 그릴 수 있습니다.

  • duplicateFeature 버튼은 하위 레이어 안에 있는 하나 이상의 하위 피처를 복사하고 붙여넣기할 수 있습니다. 나중에 서로 다른 상위 피처에 이 하위 피처를 할당하거나 또는 하위 피처의 속성을 수정할 수 있습니다.

  • deleteSelectedFeatures 버튼은 선택한 공항(들)을 영구 삭제합니다.

  • link 심볼은 나중에 현재 지역에 할당될 어떤 공항이든 선택할 수 있는 새 대화창을 엽니다. 사용자가 실수로 잘못된 지역에 공항을 생성한 경우 편리할 수도 있습니다.

  • unlink 심볼은 현재 지역에서 선택한 공항(들)을 링크 해제합니다. 즉 선택한 공항(들)을 실질적으로 할당되지 않은 상태로 남겨둔다는 (외래 키를 NULL로 설정한다는) 뜻입니다.

  • zoomToSelected 버튼을 사용하면 선택한 자식 피처로 맵을 확대/축소할 수 있습니다.

  • 오른쪽에 있는 formViewopenTable 두 버튼은 관련된 하위 피처들의 테이블 뷰와 양식 뷰 를 전환합니다.

regions 피처에 드래그&드롭 설계자 를 사용하는 경우, 어떤 도구를 사용할 수 있는지 선택할 수 있습니다. Force hide form on add feature 옵션을 이용해서 새 피처를 추가할 때 새 양식을 열지 여부를 결정할 수도 있습니다. 이 옵션이 정확하게 동작하기 위해 NULL 값을 가진 속성이 무결한 기본값을 반드시 가져오지 않아도 된다는 사실을 기억하십시오.

../../../_images/relations11.png

그림 16.78 지역-공항 관계를 환경 설정하기 위한 드래그&드롭 설계자 도구

앞의 예시에서 참조하는 레이어가 도형을 보유하고 있기 (즉 그저 문자와 숫자를 조합한 테이블이 아니기) 때문에, 앞의 단계를 수행하면 레이어 속성 테이블에 대응 도형 피처가 없는 항목을 생성할 것입니다. 도형을 추가하려면:

  1. openTable Open Attribute Table: 참조하는 레이어의 속성 테이블을 여십시오.

  2. 참조되는 레이어의 피처 양식 안에서 이전에 추가된 레코드를 선택하십시오.

  3. addPart Add Part 디지타이즈 작업 도구를 사용해서 선택한 속성 테이블 레코드에 도형을 첨부하십시오.

공항 테이블을 작업하는 경우, (관계를 생성하기 위해 사용된) fk_region 필드를 대상으로 관계 참조 위젯을 자동으로 설정합니다. 관계 참조 위젯 을 참조하세요.

공항 양식의 fk_region 필드 오른쪽에 formView 버튼이 있을 겁니다. 이 버튼을 클릭하면 지역 레이어의 양식이 열릴 것입니다. 이 위젯에서 링크된 부모 피처의 양식을 쉽고 빠르게 열 수 있습니다.

../../../_images/relations4.png

그림 16.79 “regions”와 관계가 생성된 “airports”의 식별 대화창

관계 참조 위젯은 자식 레이어의 양식 안에 부모 레이어의 양식을 삽입할 수 있는 옵션도 가지고 있습니다. 공항 레이어의 Properties ► Attributes Form 메뉴를 선택하고, fk_region 필드를 선택한 다음 Show embedded form 옵션을 활성화하십시오.

지금 피처 대화창을 보고 있다면, 지역의 양식이 공항 양식 안에 삽입돼 있고 현재 공항을 다른 지역으로 할당할 수 있는 콤보박스도 있다는 것을 알 수 있을 겁니다.

../../../_images/relations5.png

게다가 공항 레이어의 편집 모드를 켜고 끌 경우, fk_region 필드도 자동 완성 기능을 지원합니다. 사용자가 입력하는 중에 지역 레이어의 id 필드의 모든 값을 보게 될 것입니다. 이때 공항 레이어의 Properties ► Attributes Form 메뉴에서 Allow adding new features 옵션을 선택했다면 symbologyAdd 버튼을 눌러 폴리곤을 디지타이징할 수 있습니다.

자식 피처의 속성을 기반으로 부모 레이어의 피처를 선택하기 위해 값으로 피처 선택 도구에서 자식 레이어를 사용할 수도 있습니다.

그림 16.80 에서, 공항의 평균 해발고도가 500m를 초과하는 모든 지역을 선택합니다.

이 양식에서 여러 서로 다른 집계 함수들을 사용할 수 있을 것입니다.

../../../_images/relation_select_by_value.png

그림 16.80 자식 값으로 부모 피처 선택

16.2.6.2. 다대다(N-M) 관계 소개

N-M 관계란 두 테이블 간의 다대다 관계를 말합니다. airportsairlines 레이어를 예로 들 수 있습니다. 공항은 여러 항공사의 노선을 받아들이고 항공사는 여러 공항에 이착륙합니다.

다음 SQL 코드는 PostgreSQL/PostGIS 스키마에 locations 라는 이름의 N-M 관계를 위해 필요한 테이블 3개를 생성합니다. PostGIS의 경우 Database ► DB Manager… 메뉴를 통해, 또는 pgAdmin 같은 외부 도구들을 통해 코드를 실행할 수 있습니다. 공항 테이블은 airports 레이어를, 항공사 테이블은 airlines 레이어를 저장하고 있습니다. 이 두 테이블에서 관계를 분명히 하기 위해 사용되는 필드는 몇 개 되지 않습니다. 까다로운 부분은 airports_airlines 테이블입니다. 이 테이블에 모든 공항에 대해 모든 항공사를 (그리고 그 반대도) 전부 목록화해야 합니다. 이런 유형의 테이블을 피벗(pivot) 테이블 이라고 합니다. 공항과 항공사 둘 다 이미 각각의 레이어에 존재하는 경우에만 공항을 항공사와 관련지을 수 있도록 강제하는 것이 이 테이블의 제약조건 입니다.

CREATE SCHEMA locations;

CREATE TABLE locations.airports
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airport_name text NOT NULL,
   CONSTRAINT airports_pkey PRIMARY KEY (id)
);

CREATE INDEX airports_geom_idx ON locations.airports USING gist (geom);

CREATE TABLE locations.airlines
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airline_name text NOT NULL,
   CONSTRAINT airlines_pkey PRIMARY KEY (id)
);

CREATE INDEX airlines_geom_idx ON locations.airlines USING gist (geom);

CREATE TABLE locations.airports_airlines
(
   id serial NOT NULL,
   airport_fk integer NOT NULL,
   airline_fk integer NOT NULL,
   CONSTRAINT airports_airlines_pkey PRIMARY KEY (id),
   CONSTRAINT airports_airlines_airport_fk_fkey FOREIGN KEY (airport_fk)
      REFERENCES locations.airports (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED,
   CONSTRAINT airports_airlines_airline_fk_fkey FOREIGN KEY (airline_fk)
      REFERENCES locations.airlines (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED
 );

PostgreSQL 대신 GeoPackage도 사용할 수 있습니다. 이 경우, 사용자가 Database ► DB Manager… 메뉴를 통해 세 테이블을 직접 생성할 수 있습니다. GeoPackage에는 스키마가 존재하지 않기 때문에 접두어 locations 을 붙일 필요도 없습니다.

Table ► Create Table… 또는 Table ► Edit Table… 메뉴로는 airports_airlines 테이블의 외래 키 제약조건을 생성할 수 없기 때문에, Database ► SQL Window… 를 사용해서 생성해야 합니다. GeoPackage는 ADD CONSTRAINT 선언문을 지원하지 않으므로 airports_airlines 테이블을 다음 두 단계를 거쳐 생성해야 합니다:

  1. Table ► Create Table… 메뉴를 사용해서 id 필드만 보유한 테이블을 설정합니다.

  2. Database ► SQL Window… 메뉴로 SQL 창을 열고, 다음 SQL 코드를 입력하고 실행합니다:

    ALTER TABLE airports_airlines
       ADD COLUMN airport_fk INTEGER
       REFERENCES airports (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    
    ALTER TABLE airports_airlines
       ADD COLUMN airline_fk INTEGER
       REFERENCES airlines (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    

그 다음 QGIS에서, 앞에서 설명한 대로 일대다(1-N) 관계 2개를 설정해야 합니다:

  • airlines 테이블과 피벗 테이블 간의 관계

  • airports 테이블과 피벗 테이블 간의 두 번째 관계

Project ► Properties ► Relations 메뉴에서 Discover Relations 메뉴 옵션을 사용하면 (PostgreSQL인 경우에만) 이 작업을 더 쉽게 할 수 있습니다. QGIS가 사용자 데이터베이스의 모든 관계를 자동으로 읽어들여, 사용자는 필요한 두 관계만 선택하면 됩니다. 먼저 QGIS 프로젝트에 세 테이블을 불러와야 한다는 것을 잊지마세요.

../../../_images/relations6.png

그림 16.81 관계와 자동검색

사용자가 airport 또는 airline 을 제거하고자 하는 경우, QGIS는 airports_airlines 테이블에서 관련 레코드(들)를 제거하지 않을 것입니다. 현재 예시에서처럼 피벗 테이블 생성 시 올바른 제약조건 을 지정한 경우 데이터베이스가 관련 레코드(들)를 제거할 것입니다.

참고

다대다 관계를 자동 트랜잭션(transaction) 그룹과 결합하기

이런 맥락에서 작업하는 경우 Project Properties ► Data Sources ► 메뉴 옵션에서 트랜잭션 모드를 활성화시켜야 합니다. QGIS가 모든 테이블(airlines, airports 및 피벗 테이블)에 있는 행(들)을 추가하거나 업데이트할 수 있어야 하기 때문입니다.

마지막으로 Layer Properties ► Attributes Form 메뉴에서 airportsairlines 레이어에 대한 올바른 기수(cardinality)를 선택해야 합니다. 첫 번째 기수로 airlines (id) 옵션을, 두 번째 기수로는 airports (id) 옵션을 선택해야 합니다.

../../../_images/relations7.png

그림 16.82 관계 기수성 설정

이제 Add child feature 또는 하위 양식에 있는 Link existing child feature 를 통해 공항을 항공사와 (또는 항공사를 공항과) 관련시킬 수 있습니다. 레코드가 airports_airlines 테이블에 자동적으로 삽입될 것입니다.

../../../_images/relations8.png

그림 16.83 공항과 항공사 사이의 N-M 관계

참고

다대일 관계 기수성 사용하기

N-M 관계에서 피벗 테이블을 숨기는 것이 바람직하지 않을 때가 있습니다. 주로 관계가 확정된 후에야 값을 가질 수 있는 관계에 있는 속성이 존재하기 때문입니다. 사용자 테이블이 레이어인 (도형 필드를 보유하고 있는) 경우 피벗 테이블의 외래 키 필드에 대해 On map identification 옵션을 (Layer Properties ► Attributes Form ► Available widgets ► Fields) 활성화시켜보면 재미있을 수도요.

참고

피벗 테이블의 기본 키

피벗 테이블의 기본 키에 여러 필드를 사용하는 일을 피하십시오. QGIS는 단일 기본 키를 가정하기 때문에 constraint airports_airlines_pkey primary key (airport_fk, airline_fk) 같은 제약조건은 작동하지 않을 것입니다.

16.2.6.3. 다형성 관계 소개

다형성 관계(polymorphic relation)는 1대다(1-N) 관계의 특례로, 단일 (문서) 참조 레이어가 참조되는 레이어 여러 개의 피처를 담고 있는 경우입니다. 서로 다른 참조하는 레이어가 각각 참조되는 레이어를 필요로 하는 일반적인 관계와는 다릅니다. (문서) 참조하는 레이어에 참조되는 레이어를 식별하기 위한 정보를 저장하는 추가적인 layer_field 열을 추가하면 단일 (문서) 참조 레이어를 생성할 수 있습니다. 가장 단순한 형태의 경우, (문서) 참조 레이어는 그냥 이 필드에 참조되는 레이어의 레이어 이름을 삽입할 것입니다.

좀 더 정확하게 말하자면, 다형성 관계란 참조하는 레이어는 동일하지만 참조되는 레이어는 동적으로 정의되는 일반적인 관계들의 집합입니다. 레이어의 다형성 설정은 참조되는 레이어의 테이블 이름, 레이어 ID, 레이어 이름 같은 일부 속성과 일치해야 하는 표현식을 이용해서 정의할 수 있습니다.

공원에 방문해서 그곳에서 볼 수 있는 다양한 plantsanimals 종들의 사진을 찍는다고 상상해보십시오. 각 식물 또는 동물과 관련된 사진이 여러 장일 것이기 때문에, 일반적인 일대다 관계를 이용해서 사진을 저장하는 경우 animal_imagesplant_images, 2개의 개별 테이블이 필요할 것입니다. 테이블이 2개라면 문제가 되지 않을 수도 있겠지만, 버섯이나 새 등등에 대해서도 개별적으로 사진을 찍기를 원한다면 어떨까요.

다형성 관계는 모든 참조 피처를 동일한 documents 테이블에 저장함으로써 이 문제를 해결합니다. 각 피처에 대해 referenced_layer 필드에 참조되는 레이어를, referenced_fk 필드에 참조되는 피처의 ID를 저장해서 말이죠.

다형성 관계 정의하기

먼저, Project ► Properties… 메뉴를 통해 QGIS에 레이어들 간의 다형성 관계가 존재한다는 사실을 알리십시오. Relations 탭으로 가서 symbologyAdd Add Relation 버튼 옆에 있는 아래 방향 화살표를 클릭하면, 새로 나타나는 드롭다운 목록에서 Add Polymorphic Relation 옵션을 선택할 수 있습니다.

../../../_images/relations9.png

그림 16.84 documents 레이어를 참조하는 레이어로, animalsplants 레이어를 참조되는 레이어로 이용해서 다형성 관계를 추가합니다.

  • ID: 내부 목적으로 사용되며, 유일한 값이어야 합니다. 사용자 지정 양식 을 작성하기 위해 필요할 수도 있습니다. 이 항목을 비워둘 경우, 자동적으로 생성되지만 사용자가 더 쉽게 다룰 수 있는 ID를 직접 할당할 수도 있습니다.

  • 참조하는 레이어(Referencing Layer) (자식): 자식 레이어로도 간주되는 이 레이어가 외래 키 필드를 담고 있습니다. 이 예시에서는 documents 레이어입니다. 이 레이어의 경우 다른 레이어를 가리키는 참조하는 필드를 추가해야 합니다. 이 예시에서는 referenced_fk 입니다.

    참고

    어떤 경우, 레이어에 있는 피처들을 유일하게 식별하기 위해 단일 필드 이상이 필요할 때가 있습니다. 이런 레이어와의 관계를 생성하는 데에는 복합 키(composite key), 예를 들어 일치하는 필드들의 단일 쌍 이상이 필요합니다. symbologyAdd Add new field pair as part of a composite foreign key 버튼을 이용해서 필요한만큼 많은 쌍을 추가하십시오.

  • 레이어 필드: 평가된 레이어 표현식의 결과를 저장하는, 해당 피처가 속해 있는 참조하는 테이블인, 참조하는 테이블에 있는 필드입니다. 이번 예시에서는 referenced_layer 필드입니다.

  • 레이어 표현식: 이 표현식의 평가 결과가 레이어의 유일 식별자가 됩니다. 레이어 이름 @layer_name, 레이어 ID @layer_id, 레이어의 테이블 이름 decode_uri(@layer, 'table'), 또는 레이어를 유일하게 식별할 수 있다면 무엇이든 가능합니다.

  • 관계 강도(Relationship Strength): 상위(부모)와 하위(자식) 레이어 사이에 생성된 관계의 강도를 설정합니다. 기본 Association 유형은 상위 레이어가 하위 레이어에 단순하게 링크되어 있다는 의미인 반면, Composition 유형은 상위 피처를 복제할 때 하위 피처도 복제할 수 있으며 상위 레이어의 피처를 삭제하면 하위 피처도 삭제할 수 있는 등, 모든 수준에서 순차적(cascade)으로 결과물을 산출합니다. (다시 말해 하위의 하위의 … 하위 피처도 삭제할 수 있다는 뜻입니다.)

  • 참조되는 레이어: 상위(부모) 레이어로도 간주되는 참조된 레이어는 기본 키(primary key)가 가리키는 레이어이기 때문에, 이 예시에서는 plantsanimals 레이어입니다. 드롭다운 메뉴에서 참조되는 레이어의 기본 키를 정의해야 합니다. 이 예시에서는 fid 입니다. 무결한 기본 키를 정의하려면 참조되는 레이어 모두가 이 이름을 가진 필드를 가지고 있어야 한다는 사실을 기억하십시오. 참조되는 레이어 가운데 하나에라도 이 이름을 가진 필드가 없다면, 다형성 관계를 저장할 수 없습니다.

다형성 관계를 추가하고 나면, Edit Polymorphic Relation 메뉴 항목을 통해 다형성 관계를 편집할 수 있습니다.

../../../_images/relations10.png

그림 16.85 새로 생성한 다형성 관계와 이 관계의 동식물에 대한 하위(자식) 관계의 미리보기

이 예시는 다음과 같은 데이터베이스 스키마를 이용합니다:

CREATE SCHEMA park;

CREATE TABLE park.animals
(
   fid serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   animal_species text NOT NULL,
   CONSTRAINT animals_pkey PRIMARY KEY (fid)
);

CREATE INDEX animals_geom_idx ON park.animals USING gist (geom);

CREATE TABLE park.plants
(
   fid serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   plant_species text NOT NULL,
   CONSTRAINT plants_pkey PRIMARY KEY (fid)
);

CREATE INDEX plants_geom_idx ON park.plants USING gist (geom);

CREATE TABLE park.documents
(
   fid serial NOT NULL,
   referenced_layer text NOT NULL,
   referenced_fk integer NOT NULL,
   image_filename text NOT NULL,
   CONSTRAINT documents_pkey PRIMARY KEY (fid)
);

16.2.7. 외부 리소스 저장하기 및 가져오기

필드가 외부 저장소 시스템에 저장된 리소스를 대상으로 삼을 수도 있습니다. 사용자의 요청에 따라 양식에 외부 리소스를 저장하고 가져올 수 있게 하기 위해, 속성 양식을 외부 저장소 시스템의 클라이언트 역할을 하도록 환경 설정할 수 있습니다.

16.2.7.1. 외부 저장소 환경 설정하기

외부 저장소를 설정하려면, 먼저 벡터 속성 양식 속성 에서 외부 저장소를 환경 설정한 다음 Attachment 위젯을 선택해야 합니다.

../../../_images/external_storage_configuration.png

그림 16.86 지정한 필드에 대한 WebDAV 외부 저장소를 편집하기

Attachment 위젯에서 Storage type 을 먼저 선택해야 합니다:

  • Select Existing File: 대상 URL이 이미 존재합니다. 사용자가 리소스를 선택할 때 어떤 저장 작업도 하지 않고 단순히 URL로 속성을 업데이트합니다.

  • Simple Copy: (로컬 디스크일 수도 있고 네트워크 공유 파일 시스템일 수도 있는) 파일 디스크 대상 위치에 리소스의 복사본을 저장하고 해당 복사본을 가리키는 경로로 속성을 업데이트합니다.

  • WebDAV Storage: WebDAV 프로토콜을 지원하는 HTTP 서버에 리소스를 푸시하고 해당 서버 URL로 속성을 업데이트합니다. Nextcloud, Pydio, 또는 다른 파일 호스팅 소프트웨어가 이 프로토콜을 지원합니다.

다음으로, 새 리소스를 저장해야 할 경우 사용할 URL을 제공하는 Store URL 파라미터를 설정해야 합니다. 피처 속성에 따라 특정 값을 설정하려면 데이터 정의 무시 위젯 을 이용해서 표현식을 작성할 수 있습니다.

이 표현식에 @selected_file_path 변수를 사용하면 사용자가 (파일 선택기 또는 드래그&드롭으로) 선택한 파일의 절대 경로를 나타낼 수 있습니다.

참고

WebDAV 외부 저장소를 사용할 때, URL이 “/” 으로 끝나는 경우 이를 폴더로 간주하고 선택한 파일명을 뒤에 붙여 최종 URL로 만들 것입니다.

외부 저장소 시스템에 요구하는 경우 인증 방법 을 환경 설정할 수 있습니다.

16.2.7.2. 외부 저장소 사용하기

환경 설정이 끝나면, 피처의 속성을 편집할 때 버튼을 이용해서 로컬 파일을 선택할 수 있습니다. 환경 설정된 저장소 유형 에 따라 (Select existing file 을 선택한 경우를 제외하고) 외부 저장소 시스템에 파일을 저장하고 새 리소스 URL로 필드를 업데이트할 것입니다.

../../../_images/external_storage_store.png

그림 16.87 WebDAV 외부 저장소에 파일을 저장하기

참고

Attachment 위젯 전체에 파일을 드래그&드롭해도 동일한 결과를 얻을 수 있습니다.

저장 프로세스를 중단하려면 taskCancel Cancel 버튼을 누르십시오. Integrated document viewer 를 이용해서 외부 저장소 시스템으로부터 리소스를 자동으로 가져와 URL 바로 아래에 표시하도록 뷰어를 환경 설정할 수 있습니다. external_storage_storewarning 아이콘은 외부 저장소 시스템에서 리소스를 가져올 수 없다는 사실을 나타냅니다. 이런 경우 로그 메시지 패널 에 더 상세한 정보가 나타날 수도 있습니다.