파이썬 프로그램밍 시작

경고

A new version of this tutorial is available at Getting Started With Python Programming (QGIS3)

QGIS는 강력한 프로그래밍 인터페이스를 가지고 있는데 이것으로 소프트웨어의 핵심 기능을 확장할 수 있고 작업을 자동화하는 스크립트를 만들어 낼 수 있습니다. QGIS는 요즘 인기있는 파이썬 스크립팅 언어를 지원합니다. 초보자라할 지라도 조금만 파이썬과 QGIS 프로그래밍 인터페이스를 배우면 작업이 매우 생산적이 될 것입니다. 이 예제에서는 사전에 프로그램에 대한 지식이 없다고 가정하고 QGIS (PyQGIS)엣 파이썬을 소개하고자 합니다.

과업 개요

예제에서는 모든 주요 공항을 표현하는 벡터 점 레이어를 불러와서 파이썬 스크립팅으로 레이어에서 공항의 이름, 공항코드, 각 공항의 위도와 경도를 텍스트파일로 만들 것입니다.

데이터 획득

Natural Earth의 Airports 데이터셋을 사용합니다.

`Airports shapefile <http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_airports.zip>`_를 다운로드 하십시오.

데이터 출처: [NATURALEARTH]

과정

  1. QGIS에서 메뉴 레이어 –> 레이어 추가 –> 벡터 레이어 추가 :menuselection:`Layers –> Add Vector Layer`로 가십시오. 다운로드한 ``ne_10m_airports.zip``파일을 찾고 열기 :guilabel:`Open`를 누릅니다. ``ne_10m_airports.shp``레이어를 선택하고 확인 :guilabel:`OK`을 누릅니다.

../_images/1185.png
  1. QGIS에 ``ne_10m_airports``레이어가 불러들여질 것입니다.

../_images/2151.png
  1. 객체 확인 Identify 툴을 선택하고 사용가능한 속성을 확인하기 위해 아무 점이나 누릅니다. 공항이름과 공항의 3자리수 코드가 속성의 ``name``과 ``iata_code``로 각각 포함되어 있는 것을 보게됩니다.

../_images/394.png
  1. QGIS는 파이썬 명령어를 입력할 수 있고 결과를 얻을 수 있는 콘솔을 기본적으로 제공합니다. 이 콘솔은 스크립팅을 배울 수 있는 가장 좋은 방법이고 또한 데이터를 빠르게 처리할 수 있습니다. 메뉴 플러그인 –> Python 콘솔 :menuselection:`Plugins –> Python Console`로 가서 Python 콘솔 :guilabel:`Python Console`을 엽니다.

../_images/458.png
  1. QGIS 캔버스 아랫쪽에 새로운 패널이 열리는 것이 보일 것입니다. 명령어를 입력할 수 있는 아랫쪽에 >>>``과 같은 프롬프터를 보게될 것입니다. QGIS환경의 인터페이스에서 ``iface 변수를 사용해야만 합니다. QGIS에서 현재 활성화된 레이어에 접근하기 위해서 다음과 같이 타이핑하고 엔터 Enter`를 누릅니다. 명령어는 레퍼런스를 현재 활성화된 레이어로 가져오고 ``layer` 변수에 저장합니다.

layer = iface.activeLayer()
../_images/551.png
  1. 파이썬에는 ``dir()``라고 하는 편리한 기능이 있는데 어떤 객체에 대한 모든 가용한 방법을 보여줍니다. 이것은 어떤 함수가 객체에 사용가능한 지 확실하지 않을 때 유용합니다. ``layer``변수에 대해 어떤 것을 할 수 있는지 알아보기위해 다음의 명령어를 실행합니다.

dir(layer)
../_images/649.png
  1. 긴 목록의 사용가능한 함수를 보게될 것입니다. 이제 레이어의 모든 객체의 레퍼런스를 보여주는 ``getFeatures()``라는 함수를 사용할 것입니다. 이 경우 각 객체는 공항을 나타내는 점이 될 것입니다. 현재의 레이어에서 각 객체를 통해 반복하는 다음의 명령을 입력할 수 있습니다. 두번째 줄에 입력을 하기 전에 두칸의 스페이스를 추가하는 것을 잊지마십시오.

for f in layer.getFeatures():
  print f
../_images/749.png
  1. 결과에서 보게되는 것 처럼 각 입력줄은 레이어 내의 객체의 레퍼런스를 포함하고 있습니다. 객체의 레퍼런스는 ``f``변수에 저장됩니다. 각 객체의 속성에 접근하기 위해 ``f``변수를 사용할 수 있습니다. 각 공항 객체에 대한 ``name``과 ``iata_code``를 출력하기 위해 다음과 같이 입력합니다.

for f in layer.getFeatures():
  print f['name'], f['iata_code']
../_images/848.png
  1. 그러면 이제 레이어에서 각 객체의 속성에 어떻게 체계적으로 접근하는 지 알게됩니다. 이제 객체의 좌표에 어떻게 접근할 수 있는지 알아보겠습니다. 벡터 객체의 좌표는 geometry()``함수를 불러서 접근할 있습니다. 함수는 지오메트리 객체를 되돌리는데  ``geom``변수에 저장할 있습니다. 점의 x, y좌표를 얻기 위해 지오메트리 객체에 대해 ``asPoint()``함수를 실행할 있습니다. 만약 객체가 혹은 폴리곤이면 ``asPolyline() 혹은 asPolygon() 함수를 사용할 수 있습니다. 각 객체의 x, y좌표를 보기 위해 프롬프트에 다음의 코드를 입력하고 엔터 :kbd:`Enter`를 누릅니다.

for f in layer.getFeatures():
  geom = f.geometry()
  print geom.asPoint()
../_images/948.png
  1. 객체의 x 좌표만 얻고자 한다면 어떨까요? 점 객체에 대해 ``x()``함수를 불러 x좌표을 얻을 수 있습니다.

for f in layer.getFeatures():
  geom = f.geometry()
  print geom.asPoint().x()
../_images/1055.png
  1. 이제 원하는 결과를 만들어 내기 위해 함께 조합을 할 수 있는 모든 명령어 조각을 확보했습니다. 각 공항 객체의 이름, 공항코드, 위도 그리고 경도를 출력하려면 다음의 코드를 입력하십시오. ``%s``와 ``%f``표시는 문자와 숫자변수를 포맷하는 방법입니다.

for f in layer.getFeatures():
  geom = f.geometry()
  print '%s, %s, %f, %f' % (f['name'], f['iata_code'],
         geom.asPoint().y(), geom.asPoint().x())
../_images/1186.png
  1. 콘솔에 출력된 결과를 볼 수 있을 것입니다. 결과를 저장하는 보다 유용한 방법은 파일에 담는 것입니다. 파일을 만들고 그 파일에 결과를 쓰기 위해서 다음과 같은 코드를 입력하십시오. 각자의 시스템 경로에 맞게 파일 경로를 교체하십시오. 줄을 만들기 위해 끝에 \n``을 추가하는 것에 유의하십시오. 이것은 객체에 대해 데이터를 추가한 후에 새로운 줄을 추가합니다. 또한 ``unicode_line = line.encode('utf-8') 줄에 유의하십시오. 레이어가 유니코드를 가진 객체를 포함하고 있으므로 단순하게 텍스트 파일에 그것을 기록할 수 없습니다. UTF-8 엔코딩을 사용해서 텍스트를 부호화한 다음 텍스트파일에 기록합니다.

output_file = open('c:/Users/Ujaval/Desktop/airports.txt', 'w')
for f in layer.getFeatures():
  geom = f.geometry()
  line = '%s, %s, %f, %f\n' % (f['name'], f['iata_code'],
          geom.asPoint().y(), geom.asPoint().x())
  unicode_line = line.encode('utf-8')
  output_file.write(unicode_line)
output_file.close()
../_images/1257.png
  1. 명시한 위치의 결과 파일로 가서 텍스트 파일을 열 수 있습니다. 파이썬 스크립팅을 이용해서 공항 shapefile에서 추출한 데이터를 볼 수 있을 것입니다.

../_images/1355.png

If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)