14.4. 속성 테이블 작업

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

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

QGIS는 공간 및 비공간 레이어를 불러올 수 있습니다. 현재 PostgreSQL, MSSQL, SpatiaLite, DB2 및 Oracle 제공자는 물론, 구분 텍스트와 OGR이 지원하는 테이블도 포함합니다. 레이어를 불러오면, Layers 패널에 있는 목록에 레이어가 추가됩니다. 레이어가 공간적으로 활성화됐는지 아닌지 여부가 사용자가 맵 상에서 레이어와 대화형 작업을 할 수 있는지 없는지 여부를 결정합니다.

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

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

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

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

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

그림 14.68 《regions》 레이어의 속성 테이블

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

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

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

calculateField

Open field calculator

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

Ctrl+I

conditionalFormatting

Conditional formatting

테이블 서식 작업 활성화

dock

Dock attribute table

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

actionRun

Actions

레이어 관련 액션 목록

참고

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

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

14.4.2.1. 테이블 뷰 대 양식 뷰

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

  • openTable Table view: 각 행이 피처를 나타내고 각 열이 필드를 나타내는 표 서식으로 여러 피처의 값을 표시합니다.

  • formView Form view: 첫 번째 패널에 피처 식별자 를 표시하고 두 번째 패널에는 클릭한 식별자의 속성만 표시합니다. 첫 번째 패널 상단에 있는 풀다운 메뉴에서 속성(Column preview) 또는 표현식(Expression)을 사용해서 《식별자(identifier)》를 지정할 수 있습니다. 이 풀다운 메뉴는 최근 사용한 표현식 10개도 재사용하기 위해 포함하고 있습니다. 양식 뷰는 레이어 필드 환경 설정(속성 양식 속성 참조)을 이용합니다. 첫 번째 패널 하단에 있는 화살표를 가지고 피처 식별자를 탐색할 수 있습니다. 목록에서 피처를 노란색 마커로 선택하면, 캔버스 상에서도 해당 피처가 노란색으로 선택됩니다. 속성 테이블 상단에 있는 zoomToSelected 버튼을 클릭하면 해당 피처로 확대/축소합니다. (체크 사각형을 사용하지 않고) 목록에 있는 항목을 클릭하면 해당 피처가 어디에 있는지 알 수 있도록 빨간색으로 한번 번쩍입니다.

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

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

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

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

14.4.2.2. 열 환경 설정하기

테이블 뷰의 경우, 속성 테이블에 무엇을 어떻게 표시할지에 대한 환경을 설정할 수 있는 도구에 접근하려면 열 헤더를 오른쪽 클릭하십시오.

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

열 헤더를 오른쪽 클릭하면, 속성 테이블에서 열을 숨기는 옵션을 선택할 수 있습니다. 열을 숨김 해제하거나 열의 순서를 변경하는 등 한 번에 여러 열들의 습성을 변경하려면, Organize columns … 메뉴 옵션을 선택하십시오. 새 대화창에서 다음 작업을 할 수 있습니다:

  • 표시하거나 숨기려하는 열을 체크/체크 해제할 수 있습니다.

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

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

14.4.2.2.2. 열 너비 설정하기

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

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

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

열 헤더의 오른쪽 경계선을 드래그해도 너비를 변경할 수 있습니다. 레이어는 열의 새로운 크기를 유지하기 때문에, 다음에 속성 테이블을 열어도 변경한 너비가 복구됩니다.

14.4.2.2.3. 열 정렬하기

열 헤더를 클릭하면 어느 열 기준으로도 테이블을 정렬할 수 있습니다. 작은 화살표가 정렬 순서를 나타냅니다. (아래쪽 화살표는 맨 위 행에서 아래 행 방향으로 내림차순, 위쪽 화살표는 맨 위 행에서 아래 행 방향으로 오름차순을 의미합니다.) 열 헤더 컨텍스트 메뉴의 Sort 옵션을 선택한 다음 표현식을 입력해서 행들을 정렬하도록 선택할 수도 있습니다. 예를 들어 여러 열을 이용해서 행을 정렬하려면 concat(col0, col1) 같은 표현식을 작성하면 됩니다.

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

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

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

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

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

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

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

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

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

  • 규칙의 명칭

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

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

    • 배경 및 텍스트 색상

    • 아이콘 사용 여부

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

    • 폰트

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

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

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

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

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

14.4.3.2. 피처 필터링

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

  • Show All Features

  • Show Selected Features

  • Show Features visible on map

  • Show Edited and New Features

  • Field Filter: 필드의 값을 기반으로 필터링할 수 있습니다. 목록에서 열을 선택해서 값을 입력한 다음 Enter 키를 눌러 필터링합니다. 그러면 속성 테이블에 일치하는 피처만 표시될 것입니다.

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

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

참고

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

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

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

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

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

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

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

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

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

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

  • Filter within (《AND》)

  • Extend filter (《OR》)

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

14.4.4. 피처에 대한 액션 사용

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

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

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

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

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

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

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

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

그림 14.72 셀 내용 복사 버튼

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

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

  • 평문 텍스트, 도형 없음

  • 평문 텍스트, WKT 도형

  • GeoJSON

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

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

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

14.4.5. 속성값 편집

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

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

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

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

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

14.4.5.1. 필드 계산기 이용하기

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

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

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

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

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

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

그림 14.73 필드 계산기

새 필드를 추가하기로 결정한 경우, 필드명, 필드 유형(정수형, 실수형, 날짜 또는 문자열), 그리고 필요한 경우 필드의 총 길이 및 정밀도를 입력해야 합니다. 예를 들면, 필드 길이를 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 를 찾아볼 수 있습니다.

14.4.5.2. 가상 필드 생성하기

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

참고

가상 필드 사용법

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

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

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

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

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

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

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

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

그림 14.74 간편 필드 계산 막대

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

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

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

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

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

참고

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    참고

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

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

  • 관계 강도(Relationship strength): 부모와 자식 레이어 관계의 강도를 설정합니다. 기본 Association 유형은 부모 레이어가 자식 레이어에 단순히 링크돼 있다는 의미인 반면, Composition 유형은 부모 레이어의 피처를 복제하는 경우 자식 피처도 복제되도록 할 수 있습니다.

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

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

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

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

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

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

그림 14.78 《airports》와 관계가 생성된 《regions》의 식별 대화창

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

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

  • saveEdits 버튼은 모든 편집 내용을 저장합니다.

  • newTableRow 버튼은 공항 레이어 속성 테이블에 새 레코드를 추가할 것입니다. 또 기본적으로 현재 지역에 새 공항을 할당할 것입니다.

  • capturePoint 버튼은 newTableRow 버튼과 동일하지만, 속성 테이블에 새 레코드를 추가하기 전에 맵 캔버스에서 공항 도형을 디지타이즈할 수 있게 해줍니다. 아이콘은 도형 유형에 따라 변한다는 점을 기억하십시오.

  • duplicateFeature 버튼은 하나 이상의 자식 피처를 복사할 수 있습니다.

  • deleteSelectedFeatures 버튼은 선택한 공항을 영구적으로 삭제할 것입니다.

  • link 버튼은 기존의 어떤 공항이라도 선택해서 현재 지역에 할당시킬 수 있는 새 대화창을 엽니다. 사용자가 잘못된 지역에 공항을 실수로 생성한 경우 이 기능이 유용할 겁니다.

  • unlink 버튼은 현재 지역에서 선택한 공항을 할당 해제시켜, 사실상 비할당 상태로 (외래 키가 NULL로 설정된 상태로) 남겨둡니다.

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

  • 오른쪽에 있는 formViewopenTable 두 버튼은 테이블 뷰와 양식 뷰를 서로 전환하는데, 양식 뷰에서는 모든 공항을 각각의 양식대로 살펴볼 수 있습니다.

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

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

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

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

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

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

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

그림 14.79 《regions》와 관계가 생성된 《airports》의 식별 대화창

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

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

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

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

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

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

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

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

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

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

그림 14.82 관계와 자동검색

사용자가 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

그림 14.83 관계 기수성 설정

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

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

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