15.2. 속성 테이블 작업

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

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

QGIS는 공간 및 비공간 레이어를 로드할 수 있습니다. 이것은 현재 OGR에서 지원하는 테이블과 구분된 텍스트, Postgre를 포함합니다. 로드된 레이어는 Layers 패널 안에 나열됩니다. 레이어를 공간적으로 사용할 수 있는지 아닌지에 따라 맵에서 레이어와 상호 작용할 수 있는지 아닌지 결정됩니다.

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

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

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

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

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

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

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

표 15.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

Show/hide fields from the attribute table

calculateField

Open field calculator

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

Ctrl+I

conditionalFormatting

Conditional formatting

테이블 서식 작업 활성화

dock

Dock attribute table

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

actionRun

Actions

레이어 관련 액션 목록

참고

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

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

15.2.2.1. 테이블 뷰 대 양식 뷰

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

  • The openTable Table view, displays values of multiple features in a tabular mode, each row representing a feature and each column a field. A right-click on the column header allows you to configure the table display while a right-click on a cell provides interaction with the feature.

  • The formView Form view shows feature identifiers in a first panel and displays only the attributes of the clicked identifier in the second one. There is a pull-down menu at the top of the first panel where the “identifier” can be specified using an attribute (Column preview) or an Expression. The pull-down also includes the last 10 expressions for re-use. Form view uses the layer fields configuration (see 속성 양식 속성).

    You can browse through the feature identifiers with the arrows on the bottom of the first panel. The features attributes update in the second panel as you go. It’s also possible to identify or move to the active feature in the map canvas with pushing down any of the button at the bottom:

    • highlightFeature Highlight current feature if visible in the map canvas

    • 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

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

15.2.2.2. 열 환경 설정하기

Right-click in a column header when in table view to have access to tools that help you control:

열 너비 설정하기

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

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

  • Set all column widths… to the same value

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

  • Autosize all columns

A column size can also be changed by dragging the boundary on the right of its heading. The new size of the column is maintained for the layer, and restored at the next opening of the attribute table.

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

By right-clicking in a column header, you can choose to Hide column from the attribute table (in “table view” mode). For more advanced controls, press the editTable Organize columns… button from the dialog toolbar or choose Organize columns… in a column header contextual menu. In the new dialog, you can:

  • check/uncheck columns you want to show or hide: a hidden column will disappear from every instances of the attribute table dialog until it is actively restored.

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

  • add a new virtual Actions column that displays in each row a drop-down box or a button list of enabled actions. See 액션 속성 for more information about actions.

열 정렬하기

The table can be sorted by any column, by clicking on the column header. A small arrow indicates the sort order (downward pointing means descending values from the top row down, upward pointing means ascending values from the top row down). You can also choose to sort the rows with the Sort… option of the column header context menu and write an expression. E.g. to sort the rows using multiple columns you can write concat(col0, col1).

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

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

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

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

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

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

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

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

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

  • 규칙의 명칭

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

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

    • 배경 및 텍스트 색상

    • 아이콘 사용 여부

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

    • 폰트

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

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

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

15.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

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

15.2.3.2. 피처 필터링

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

  • openTable Show All Features

  • openTableSelected Show Selected Features - same as using Open Attribute Table (Selected Features) from the Layer menu or the Attributes Toolbar or pressing Shift+F6

  • openTableVisible Show Features visible on map - same as using Open Attribute Table (Visible Features) from the Layer menu or the Attributes Toolbar or pressing Ctrl+F6

  • openTableEdited Show Edited and New Features - same as using Open Attribute Table (Edited and New Features) from the Layer menu or the Attributes Toolbar

  • Field Filter - allows the user to filter based on value of a field: choose a column from a list, type or select a value and press Enter to filter. Then, only the features matching num_field = value or string_field ilike '%value%' expression are shown in the attribute table. You can check checkbox Case sensitive to be less permissive with strings.

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

  • Stored filter expressions ►: a shortcut to saved expressions frequently used for filtering your attribute table.

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

참고

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

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

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

15.2.3.3. Storing filter expressions

Expressions you use for attribute table filtering can be saved for further calls. When using Field Filter or Advanced Filter (expression) entries, the expression used is displayed in a text widget in the bottom of the attribute table dialog. Press the handleStoreFilterExpressionUnchecked Save expression with text as name next to the box to save the expression in the project. Pressing the drop-down menu next to the button allows to save the expression with a custom name (Save expression as…). Once a saved expression is displayed, the handleStoreFilterExpressionChecked button is triggered and its drop-down menu allows you to Edit the expression and name if any, or Delete stored expression.

Saved filter expressions are saved in the project and available through the Stored filter expressions menu of the attribute table. They are different from the user expressions, shared by all projects of the active user profile.

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

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

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

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

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

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

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

  • Filter within (“AND”)

  • Extend filter (“OR”)

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

15.2.4. 피처에 대한 액션 사용

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

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

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

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

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

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

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

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

그림 15.70 셀 내용 복사 버튼

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

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

  • 평문 텍스트, 도형 없음

  • 평문 텍스트, WKT 도형

  • GeoJSON

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

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

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

15.2.5. 속성값 편집

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

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

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

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

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

15.2.5.1. 필드 계산기 이용하기

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

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

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

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

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

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

그림 15.71 필드 계산기

새 필드를 추가하기로 결정한 경우, 필드명, 필드 유형(정수형, 실수형, 날짜 또는 문자열), 그리고 필요한 경우 필드의 총 길이 및 정밀도를 입력해야 합니다. 예를 들면, 필드 길이를 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 함수를 더블클릭해서 필드 계산기의 표현식 란에 도형의 길이를 추가하십시오.

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

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

15.2.5.2. 가상 필드 생성하기

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

참고

가상 필드 사용법

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

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

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

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

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

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

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

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

그림 15.72 간편 필드 계산 막대

15.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

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

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

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

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

참고

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

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

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

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

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

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

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

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

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 sets the strength of the relation between the parent and the child layer. The default Association type means that the parent layer is simply linked to the child one while the Composition type allows you to duplicate also the child features when duplicating the parent ones and on deleting a feature the children are deleted as well, resulting in cascade over all levels (means children of children of… are deleted as well).

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

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

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

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

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

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

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

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

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

  • The saveEdits button is for saving all the edits in the child layer (airport).

  • The capturePoint button lets you digitize the airport geometry in the map canvas and assigns the new feature to the current region by default. Note that the icon will change according to the geometry type.

  • The newTableRow button adds a new record to the airport layer attribute table and assigns the new feature to the current region by default. The geometry can be drawn later with the Add part digitizing tool.

  • The duplicateFeature button allows you to copy and paste one or more child features within the child layer. They can later be assigned to a different parent feature or have their attributes modified.

  • The deleteSelectedFeatures button deletes the selected airport(s) permanently.

  • The link symbol opens a new dialog where you can select any existing airport which will then be assigned to the current region. This may be handy if you created the airport on the wrong region by accident.

  • The unlink symbol unlinks the selected airport(s) from the current region, leaving them unassigned (the foreign key is set to NULL) effectively.

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

  • The two buttons formView and openTable to the right switch between the table view and form view of the related child features.

If you use the Drag and Drop Designer for the regions feature, you can select which tools are available. You can even decide whether to open a new form when a new feature is added using Force hide form on add feature option. Be aware that this option implies that not null attributes must take a valid default value to work correctly.

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

그림 15.77 Drag and Drop Designer for configure regions-airports relation tools

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

15.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

그림 15.80 관계와 자동검색

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

참고

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

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

Finally we have to select the right cardinality in the Layer Properties ► Attributes Form for the airports and airlines layers. For the first one we should choose the airlines (id) option and for the second one the airports (id) option.

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

그림 15.81 관계 기수성 설정

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

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

그림 15.82 공항과 항공사 사이의 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) 같은 제약조건은 작동하지 않을 것입니다.

15.2.6.3. Introducing polymorphic relations

Polymorphic relations are special case of 1-N relations, where a single referencing (document) layer contains the features for multiple referenced layers. This differs from normal relations which require different referencing layer for each referenced layer. A single referencing (document) layer is achieved by adding an adiditonal layer_field column in the referencing (document) layer that stores information to identify the referenced layer. In its most simple form, the referencing (document) layer will just insert the layer name of the referenced layer into this field.

To be more precise, a polymorphic relation is a set of normal relations having the same referencing layer but having the referenced layer dynamically defined. The polymorphic setting of the layer is solved by using an expression which has to match some properties of the referenced layer like the table name, layer id, layer name.

Imagine we are going to the park and want to take pictures of different species of plants and animals we see there. Each plant or animal has multiple pictures associated with it, so if we use the normal 1:N relations to store pictures, we would need two separate tables, animal_images and plant_images. This might not be a problem for 2 tables, but imagine if we want to take separate pictures for mushrooms, birds etc.

Polymorphic relations solve this problem as all the referencing features are stored in the same table documents. For each feature the referenced layer is stored in the referenced_layer field and the referenced feature id in the referenced_fk field.

Defining polymorphic relations

First, let QGIS know about the polymorphic relations between the layers. This is done in Project ► Properties…. Open the Relations tab and click on the little down arrow next to the symbologyAdd Add Relation button, so you can select the Add Polymorphic Relation option from the newly appeared dropdown.

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

그림 15.83 Adding a polymorphic relation using documents layer as referencing and animals and plants as referenced layers.

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

  • Referencing Layer (Child) also considered as child layer, is the one with the foreign key field on it. In our case, this is the documents layer. For this layer you need to add a referencing field which points to the other layer, so this is referenced_fk.

    참고

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

  • Layer Field is the field in the referencing table that stores the result of the evaluated layer expression which is the referencing table that this feature belongs to. In our example, this would be the referenced_layer field.

  • Layer expression evaluates to a unique identifier of the layer. This can be the layer name @layer_name, the layer id @layer_id, the layer’s table name decode_uri(@layer, 'table') or anything that can uniquely identifies a layer.

  • Relationship strength sets the strength of the generated relations between the parent and the child layer. The default Association type means that the parent layer is simply linked to the child one while the Composition type allows you to duplicate also the child features when duplicating the parent ones and on deleting a feature the children are deleted as well, resulting in cascade over all levels (means children of children of… are deleted as well).

  • Referenced Layers also considered as parent layers, are those with the primary key, pointed to, so here they would be plants and animals layers. You need to define the primary key of the referenced layers from the dropdown, so it is fid. Note that the definition of a valid primary key requires all the referenced layers to have a field with that name. If there is no such field you cannot save a polymorphic relation.

Once added, the polymorphic relation can be edited via the Edit Polymorphic Relation menu entry.

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

그림 15.84 Preview of the newly created polymorphic relation and it’s child relations for animals and plants.

The example above uses the following database schema:

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

15.2.7. Storing and fetching an external resource

A field may target a resource stored on an external storage system. Attribute forms can be configured so they act as a client to an external storage system in order to store and fetch those resources, on users demand, directly from the forms.

15.2.7.1. Configuring an external storage

In order to setup an external storage, you have to first configure it from the vector attribute form properties and select the Attachment widget.

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

그림 15.85 Editing a WebDAV external storage for a given field

From the Attachment widget, you have to first select the Storage type:

  • Select Existing File: The target URL already exists. When you select a resource, no store operation is achieved, the attribute is simply updated with the URL.

  • Simple Copy: Stores a copy of the resource on a file disk destination (which could be a local or network shared file system) and the attribute is updated with the path to the copy.

  • WebDAV Storage: The resource is pushed to a HTTP server supporting the WebDAV protocol and the attribute is updated with its URL. Nextcloud, Pydio or other file hosting software support this protocol.

Then, you have to set up the Store URL parameter, which provides the URL to be used when a new resource needs to be stored. It’s possible to set up an expression using the data defined override widget in order to have specific values according to feature attributes.

The variable @selected_file_path could be used in that expression and represent the absolute file path of the user selected file (using the file selector or drag’n drop).

참고

Using the WebDAV external storage, if the URL ends with a “/”, it is considered as a folder and the selected file name will be appended to get the final URL.

If the external storage system needs to, it’s possible to configure an authentication.

15.2.7.2. Using an external storage

Once configured, you can select a local file using the button when editing a feature’s attribute. Depending on the configured storage type, the file will be stored on the external storage system (except if Select existing file has been selected) and the field will be updated with the new resource URL.

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

그림 15.86 Storing a file to a WebDAV external storage

참고

User can also achieve the same result if he drags and drops a file on the whole attachment widget.

Use the taskCancel Cancel button to abort the storing process. It’s possible to configure a viewer using the Integrated document viewer so the resource will be automatically fetched from the external storage system and displayed directly below the URL. The above warning icon indicates that the resource cannot be fetched from the external storage system. In that case, more details might appear in the 로그 메시지 패널.