2014년 1월 28일 화요일

공간정보거점대학교육 - PyQGIS 및 Plugin 개발

1월 20 ~ 24일간 진행했던 국토교통부 공간정보 거점대학 [오픈 소스 GIS 심화 과정] 중  [QGIS 고급 & PyQGIS(QGIS 분석도구, PyQGIS 스크립트 & 플러그인)] 교재입니다.


2014년 1월 20일 월요일

[PostGIS] Custom Function for Reprojecting Geometry Table

PostGIS를 사용하면서 약 300여개의 레이어(Geometry Table)의 좌표계를 한꺼번에 변환할 일이 생겨서 하나씩 작업하려다 좌표를 변환하는 함수(UpdateGeometrySRID 함수처럼 단순히 좌표를 정의하는 함수가 아니고 물리적으로 좌표변환를 수행)를 하나 만들어 봤습니다.

PostGIS 2.0 이상부터는 다음과 같은 DDL 함수를 이용하여 좌표를 변환할 수 있으나 아래 붉은색으로 표시된 부분을 각각의 레이어마다 지정해야 주어야 하는 번거로움이 있습니다.


   ALTER TABLE roads
      ALTER COLUMN geom TYPE geometry(MultiLineString, 3857)
         USING ST_Transform(geom, 3857);

아래 과정을 따라 하면 데이터베이스 내의 모든 레이어에 대한 좌표변환을 수행할 수 있습니다.

▣ Download
 - PostGIS_TransformGeometryTable.sql
 - PostGIS_TransformGeometryTable_All.sql

▣ Install Functions
 - pgAdmin을 실행한 후 적용할 Database에 연결
 - Query Tool(Ctrl-E) 실행 후 다운로드한 SQL(2개 파일)을 각각 실행하여 함수 등록
 - 등록된 함수 화면


▣ Usages
 ⊙  TransformGeometryTable
 - 하나의 레이어에 대해서 좌표변환 수행
 - 아래 예에서 public은 스키마, roads는 테이블, 3857(구글 좌표계)은 변환할 EPSG 코드이며, 스키마를 생략하면 현재 활성화된 스키마를 사용함
 - SELECT TransformGeometryTable('public', 'roads', 3857)

 ⊙ TransformGeometryTable_All
 - 연결된 데이터베이스의 좌표가 정의된 모든 레이어에 대해서 EPSG:3857 좌표계로 변환
 - SELECT TransformGeometryTable_All(3857)

▣ 주의사항
 - 원본 레이어는 반드시 좌표체계를 가져야 하며, UpdateGeometrySRID 함수를 이용해서 등록이 가능
 - 원본 레이어(Geometry Table)의 Geometry를 모두 변환하며, 투영의 특성상 다시 복원하더라도 원본 좌표값과 동일하지 않으므로 주의

2014년 1월 3일 금요일

[QGIS] Create Ring Maps using PyQGIS Script

공간정보 거점대학 오픈 소스 GIS 고급 과정 교재 작성 중  PyQGIS 샘플 스크립트를 작성하면서 좋은 예제가 없을까 살펴보다  Looking at Temporal Changes 블로그를 보게 되었습니다. 기존 샘플의 단계를 좀 더 줄이고, 하나의 폼에 여러 옵션을 생각해 봤습니다.

Python 및 PyQGIS를 배우고 있으며, 오류가 있을 수 있으므로 잘못된 코드가 있으면 알려 주시기 바랍니다.

▣ Reference
 - http://gis.stackexchange.com/questions/6682/how-to-implement-ringmaps-in-arcgis
 - http://www.esri.com/esri-news/arcuser/fall-2013/looking-at-temporal-changes 
 - http://www.esri.com/news/arcuser/0408/files/ringmaps.pdf
 - http://mapmaker.rutgers.edu/356/battersby_ringMaps.pdf
 
▣ Download Script & Sample Dataset
 - Script &  Dataset : https://www.dropbox.com/sh/hi892sh9usn9p8u/-xjo2yuHHy

▣ Usage
▶ 스크립트 생성
 - 우선 QGIS 실행 후 [Processing] -> [Toolbox] 실행 후 [Scripts] -> [Tools] -> Create new script를 실행
- 다운로드한 샘플 스크립트를 불러온 후 저장하고 닫음
- 다음 그림과 같이 새로운 스크립트가 생성
 - 첨부된 샘플 데이터셋을 불러온 후 스크립트 실행

 ▶ Comma Separated Fields
 - 아래 그림(샘플 데이터셋에 다음과 같이 구성되어 있음)과 같이 레이어의 각 피처에 시계열 속성이 필드로 포함되어 있는 경우
 - 스크립트 실행 후 다음 그림과 같이 콤마로 분리된 시간순의 필드 목록을 입력합
 - Ring Gap 은 각 링 사이의 간격으로 링 하나 크기의 (1 / 10) 크기의 공백을 생성 가능
 - 실행 결과는 2개의 레이어(ring map 및 ring anchor)가 생성되며 ring_val 필드값을 이용해서 시각화 가능



▶ Ring Number
 - 만약 ESRI 샘플처럼 속성 테이블이 따로 있는 경우 ring map template 만 생성하는 과정
 - ring 갯수를 속성으로 입력
 - 실행 결과는 2개의 레이어(ring map 및 ring anchor)가 생성되며 ring_val 필드값은 0값을 기본으로 가짐
 - 이후 속성 테이블과 적절하게 키 필드를 구성(Field Calculator 등 사용)하여 조인(Join)해서 시각화

▶ Ring Anchor
 - 지시선 라인 데이터에 원본 데이터셋의 속성을 포함하여 지시선에 레이블링 할 수 있도록 함
▣ Examples

[Lifelog] Foursquare 2013년 메모

2013년 Foursquare 결산
 - Badges: 109
 - Mayorships: 126
 - Friends: 498
 - Pictures: 98
 - Tips: 42
 - 2014년 1월 1일 수퍼유저 레벨업

▣ 약 5300번의 체크인

▣ Profile (https://ko.foursquare.com/mapplus)