2013년 10월 28일 월요일

FOSS4G Korea 2013

FOSS4G Korea 2013 행사 프로그램을 안내해 드립니다. FOSS4G Korea는 OSGeo 한국어 지부가 주최하고 한국오픈소스GIS포럼이 주관하는 오픈 소스 GIS 분야의 최대 축제입니다.

오픈 소스 GIS에 관심 있는 많은 분들이 본 행사를 통해 다양한 기술적, 인적 교류를 하시기를 바랍니다.

특히 올해는 행사 기간이 이틀로 늘어났을 뿐만 아니라 예년에 비해 많은 발표들이 예정되어 있습니다. 꼭 행사에 참석하시어 자리를 빛내 주시기 바랍니다.

자세한 내용은 다음을 참고해 주세요
 - http://www.osgeo.kr/135
 - http://www.osgeo.kr/136


2013년 10월 13일 일요일

QGIS에서 대용량 Raster 및 Shapefile 그리기

QGIS에서 대용량의 래스터(GeoTiff 등) 및 Shape 파일을 사용할 때 그리기 성능이 안나는 경우 해결할 수 있는 옵션입니다.

일반적으로 래스터에 대해서는 피라미드(Pyramid)를 생성하며 단일 파일로 저장(원본 파일에 피라미드 정보 포함)하거나 외부 피라미드파일(.ovr, .aux. .rrd 등)을 활용할 수 있습니다. QGIS에서는 GDAL라이브러리를 활용하며, QGIS가 아니더라도 GDAL 명령어를 통해 피라미드를 생성할 수 있습니다.

Shapefile의 경우에는 공간 인덱싱을 생성하며, 인덱스 파일(qix, idx, sbx 등 GIS 프로그램마다 자체 포맷을 가진 경우가 많음)을 생성하여 그리기 및 검색 성능을 향상할 수 있습니다.

래스터 피라미드(Pyramid)에 대한 조금 더 자세한 정보는 이 블로그의 다음 포스팅을 확인하십시오
 - Raster Pyramids에 대해서... 

▣ GeoTiff Raster 피라미드 생성하기
 ⊙ Layer Properties(레이어 정보) --> Pyramids 탭 활용
- 레이어 창에서 생성할 레이어를 더블클릭 하거나 오른쪽 마우스 눌러 등록정보(Properties) 메뉴를 실행합니다.
- Pyramids 탭의 오른쪽에서 생성할 레벨을 선택하면 [Build Pyramids] 버튼이 활성화됩니다.
- Overview format은 외부 또는 내부 저장을 선택할 수 있습니다. 내부 저장을 선택하는 경우 원본 파일에 변경을 가하므로 반드시 백업을 해 두라는 메세지가 설명에 나와 있습니다.
- 리샘플링 방법은 위 포스팅을 보고 래스터의 특성에 따라 선택하면 됩니다.


 ⊙ Raster 메뉴 기능 활용
 - [Raster] > [Miscellaneous] > [Build Overviews] 메뉴를 실행합니다.
 - 옵션은 위 레이어 등록정보와 동일합니다.

 ⊙ Save As... 메뉴 활용
 - 피라미드를 생성할 레이어를 선택하고 오른쪽 마우스를 눌러 [Save as...] 메뉴를 실행합니다.
 - 저장할 이름(GeoTiff)을 선택합니다.
 - Raster 를 내보내기 할 때는 다양한 옵션을 사용할 수 있습니다.
 - 사용 가능한 옵션은 Extent(일정 범위로 잘라내기), Resolution(래스터 해상도<셀크기> 변경), Create Options(압축 여부 및 압축 방법 등), No data values(NoData 처리) 및 우리가 여기에서 하고자 하는 Pyramids가 있습니다.
 - 피라미드 옵션을 체크하고 위에서 했던 것과 같이 적절한 레벨을 선택합니다.
 - OK 버튼을 누르면 내보내기 과정에서 피라미드를 함께 생성하며 저장합니다.
 

▣ Shapefiles 공간 인덱싱 생성하기
 ⊙ Layer Properties(레이어 정보) --> General 탭 활용
- 레이어 창에서 생성할 레이어를 더블클릭 하거나 오른쪽 마우스 눌러 등록정보(Properties) 메뉴를 실행합니다.
- General 탭의 Coordiante reference system 그룹박스의 버튼 중 [Update extent], [Create spatial index] 버튼을 차례로 누릅니다.
- Shapefile의 크기에 따라 약간의 시간이 걸릴 수 있으니 기다리면 됩니다.


▣ 참고
 - http://qgis.spatialthoughts.com/2012/02/tutorial-working-with-rasters-in-qgis.html
 - http://gis.stackexchange.com/questions/52367/best-way-to-handle-many-raster-files-in-qgis

2013년 10월 11일 금요일

uDig GeoScript 소개

uDig도 QGIS의 PyQGIS 처럼 일반적인 작업을 자동화할 수 있는 강력한 스크립팅 기능이 있습니다. HydroGISAndrea Antonello 님께 감사드립니다.

PyQGIS가 Python을 사용한다면 uDig의 GeoScript는 Groovy(그루비는 자바파이썬, 루비, 스몰토크등의 특징을 더한 동적 객체 지향 프로그래밍 언어, 출처: 위키백과)를 활용하며, GeoTools가 가진 거의 모든 기능을 사용할 수 있습니다.

uDig에서 GeoScript 편집 환경
 ⊙ 편집기에 자동완성 및 구문강조 기능 포함

▣ Geometry Plot
 - Geometry를 생성하고 연산 수행 후 보기

▣ MapWindow
 - 레이어(Shapefile 등)를 불러와서 스타일 적용 후 지도 보기 및 이미지 저장 등

▣ 기타
  - 스타일, 렌더링, Geometry, 분석, 변환 등 GeoTools가 수행하는 거의 모든 기능 사용
  - GeoTools 프로세스 및 JGrass 분석 기능 사용

▣ 참고
 ⊙ Geographic scripting in uDig, FOSS4G Nottingham 2013


 ⊙ uDig User Guide
- uDig User Guide : GeoScript Introduction

 ⊙ GeoScript
  - http://geoscript.org/
  - 더 많은 예는 https://github.com/jericks/geoscript-groovy 에서 확인

▣ Example
 - Point Shapefile을 열고 NAM 이라는 필드가 NULL이 아닌 모든 피처를 1,500 지도 단위로 버퍼링한 Shapefile 생성하고 원본과 함께 지도에 표출

import geoscript.workspace.*
import geoscript.layer.*
import geoscript.feature.*
import geoscript.filter.*
import geoscript.geom.*
import geoscript.proj.*
import geoscript.render.*
import geoscript.style.*
import geoscript.style.io.*
import geoscript.viewer.*

//==========================================================
// Simple Buffer Process
//==========================================================
// Open Shapefile workspace
path = "C:/data/seoul/"
URL url = new File(path).toURL()
Workspace workspace = new Workspace("url='${url}' 'charset'='x-windows-949'")

// Open Shapefile layer we want to process
input_layer = workspace["wardoffice"]  // or workspace.get("wardoffice")
println "input feature count = " + input_layer.count()

// Create a new Schema (based on the Shapefile) but with Polygon Geometry
Schema schema = input_layer.schema.changeGeometryType('Polygon','wardoffice_buffer_1500')
println schema

// Create a new Layer
Layer output_layer = workspace.create(schema)

// Use the Cursor to loop through each Feature in the Shapefile
def filter = new Filter("NAM IS NOT NULL")
Cursor cursor = input_layer.getCursor(filter)   // or cursor
while(cursor.hasNext()) {
    // Get the next Feature
    Feature feature = cursor.next()

    // Create a Map for the new attributes
    attributes = [:]

    // For each attribute in the shapefile
    feature.attributes.each{k,v ->
        // If it's Geometry, process geometry
        if (v instanceof Geometry) {
            attributes[k] = v.buffer(1500)
            // v.bounds.geometry
        } else {
            attributes[k] = v
        }
    }

    // Create a new Feature with the new attributes
    Feature new_feature = schema.feature(attributes, feature.id)

    // Add it to the layer
    output_layer.add(new_feature)
}

// Always remember to close the cursor
cursor.close()

println "output feature count = " + output_layer.count()

// Apply layer's styles
output_layer.style = new Fill("#00ffff", 0.5) + new Stroke("silver", 0.1)

input_layer.style = new Shape("red", 4, "circle")
input_layer.style += new Label("NAM").font(family: "나눔고딕", size:12).point(anchor:[-0.25,0.5])
input_layer.style += new Halo(new Fill("white"), 1.0)

// Show map window
def map = new Map(width:900, height:600)
map.bounds = output_layer.bounds
map.addLayer(output_layer)
map.addLayer(input_layer)

new MapWindow(map)

2013년 10월 9일 수요일

Tips for the PostGIS

▣ PostGIS Version: SELECT PostGIS_Full_Version();
 - "POSTGIS="2.0.1 r9979" GEOS="3.3.3-CAPI-1.7.4" PROJ="Rel. 4.7.1, 23 September 2009" LIBXML="2.7.8""

▣ View 레이어 생성하기
⊙ PostGIS 2.0에서 기존 레이어로 뷰를 생성했을 때, geometry_columns에 srid 및 type이 제대로 표시되지 않을 경우에 해결책입니다.

⊙ 우선 View가 이미 있는 경우 뷰를 삭제합니다.
DROP VIEW view_name;

⊙ 기존 building 레이어에서 도형의 면적이 300을 넘는 building을  building_view 뷰로 생성하는 예입니다.
 - 다음과 같이 geometry 컬럼에 정확한 Geometry 타입 및 SRID를 정의해 주면 됩니다.
CREATE VIEW building_view AS
 SELECT gid AS gid, the_geom::geometry(MultiPolygon, 5174) AS the_geom
 FROM building 
 WHERE ST_Area(the_geom) > 300;

⊙ 기존 building 레이어를 WGS84 경위도 좌표계로 변환한 포인트 building_point_4326 뷰로 생성
 - 다음은 building 폴리곤의 중심점을 추출하고 좌표계를 변환하는 예를 포함합니다.
CREATE VIEW building_point_4326 AS
 SELECT building.gid AS gid, ST_Transform(ST_Centroid(building.the_geom), 4326)::geometry(Point, 4326) AS the_geom
 FROM building;

▣ 기존 레이어의 SRID 정의
PostGIS 공간테이블(레이어)의 좌표체계를 정의하는 방법은 UpdateGeometrySRID 함수를 이용하면 됩니다. 2.0 버전부터는 DDL을 이용하여 기존 레이어의 좌표체계 정의 및 변환까지 가능하게 되었습니다.

⊙ UpdateGeometrySRID 함수를 이용하는 방법
 - 기존 Unknown 좌표계를 WGS84 경위도 좌표계로 정의
SELECT UpdateGeometrySRID('roads', 'geom', 4326);

⊙ DDL을 이용하는 방법 - 2.0 버전부터 적용
 - 기존 Unknown 좌표계를 WGS84 경위도 좌표계로 정의
ALTER TABLE roads
  ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 4326)
    USING ST_SetSRID(geom,4326);

▣ 테이블 생성 없이 기존 레이어의 Geometry 좌표 변환후 업데이트
⊙ DDL을 이용하는 방법 - 2.0 버전부터 적용
 - 기존 WGS84 경위도 좌표계의 레이어를 구글 좌표계(일반적으로 900913을 많이 사용하지만 EPSG 공식 코드는 3857임)로 변환
ALTER TABLE roads
 ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 3857)
    USING ST_Transform(ST_SetSRID(geom, 4326), 3857) ;

▣  참고
 - http://postgis.net/docs/using_postgis_dbmanagement.html
 - http://postgis.org/docs/UpdateGeometrySRID.html

uDig에서 Web Map Tiles Services 레이어를 Zoom Level에 맞게 보기

uDig에서 Web Map Tiles Service(WMTS) 레이어를 uDig에 추가하고 줌 레벨로 보는 방법입니다.
uDig은 이를 위해 Zoom Level Switcher 뷰를 제공합니다.

▣ 우선 WMTS 레이어를 추가합니다.
 - uDig은 [Layer] --> [Add...] --> [Web Map Tiles (OpenStreetMap, MapQuest Maps ...] 기능을 통해 다양한 타일맵 지도를 배경 지도로 활용할 수 있습니다.
 - 이 블로그의 다음 포스팅을 참고하세요: MapBox Maps in uDig GIS

 - uDig은 사용자가 임의로 자유롭게 축척을 설정할 수 있으므로 이미 만들어진 타일 지도의 축척과 정확하게 일치하지 않으면 다음과 같이 이미지가 왜곡되어 표시됩니다.

▣  Zoom Level Switcher 뷰 활성화
 - 아래 그림과 같이 [Window] --> [Show View] --> [Other...] 메뉴를 실행합니다.
 - Show View 다이얼로그에서 마지막의 [Zoom Level Switcher] 뷰를 선택하고 [OK] 버튼을 누릅니다.

▣  MapBox 지도를 줌 레벨 11로 선택한 모습
 - 이제 아래 그림과 같이  [Zoom Level Switcher] 뷰가 표시됩니다.
 - 여기에서는 MapBox Streets 레이어를 WMTS 레이어로 사용하고 있으므로 MapBox Streets 레이어를 선택하고 + 또는 - 버튼을 눌러 지도를 확대 또는 축소해 봅니다.
 - 그러면 앞의 지도에 비해 텍스트가 깔끔하게 표시된다는 것을 확인할 수 있다. 즉 타일 크기와 일치하는 지도 축척이 설정된 것입니다.


▣  기타 WMTS 레이어 확인
 - 공간정보 오픈 플랫폼의 VWorld 배경지도를 WMTS 레이어로 추가하고 [Zoom Level Switcher]를 이용하여 줌 레벨을 적용해 본 화면입니다.

2013년 10월 6일 일요일

[GeoServer] GeoServer에서 국내 공간 DBMS 드라이버 사용하기

GeoServer에서 국내 공간 DBMS 드라이버를 사용하여 서비스하는 방법을소개합니다.

지원하는 공간 DBMS는 다음과 같습니다.
 - Altibase Spatial: http://support.altibase.com/kr
 - Tibero Spatial: http://technet.tmax.co.kr
 - Kairos Spatial: http://www.realtimetech.co.kr

▣ 국내 공간 DBMS 지원 프로젝트 소개
 - [GeoTools Data Store] 국내 공간 DBMS 및 파일 포맷 지원 

▣ GeoServer 다운로드
 - SourceForge: http://sourceforge.net/projects/geoserver/
 - 2013년 10월 6일 현재 2.4.0 버전이 릴리스되었습니다.

▣ 국내 공간 DBMS 드라이버 다운로드
 - SourceForge: http://sourceforge.net/projects/gt-jdbc-korean/
 - GeoServer 버전에 따라 드라이버 버전을 모두 지원하므로 GeoServer 버전에 맞게 다운로드 합니다(예, GeoServer 2.4.0의 경우 GeoServer 설치 폴더의 WEB-INF\lib 폴더에 보면 GeoTools 10.0을 사용)

▣ 설치 방법 (GeoServer 2.4.0 + GeoTools 10.0 기준)
 ① Altibase
  - GeoServer 설치 폴더의 WEB-INF\lib 폴더에 다운로드한 gt-jdbc-altibase-10.0.jar 및 Altibase가 제공하는 Altibase5.1.4.jar JDBC 드라이버를 복사

 ② Tibero
  - GeoServer 설치 폴더의 WEB-INF\lib 폴더에 다운로드한 gt-jdbc-tibero-10.0.jar 및 Tibero가 제공하는 tibero5-jdbc.jar JDBC 드라이버를 복사

 ③ Kairos
 - GeoServer 설치 폴더의 WEB-INF\lib 폴더에 다운로드한 gt-jdbc-kairos-10.0.jar 및 Kairos가 제공하는 kairosjdbc.jar JDBC 드라이버를 복사

▣ 저장소 등록 확인
이제 GeoServer 서비스를 다시 시작합니다.
GeoServer의 [데이터] -> [저장소] -> [새로운 저장소 생성하기] 메뉴를 실행하면 다음과 같습니다.

 ▣ 레이어 등록 및 발행
이후 과정은 PostGIS에서 레이어를 등록하고 활용하는 과정과 동일합니다.
단, Altibase, Tibero, Kairos에서 WKT 크기 제한이 있으므로 반드시 preparedStatements 사용에 체크하시기 바랍니다.

 ▣ 참고 사항
위에서 제공하는 Altibase, Tibero, Kairos 드라이버는 레이어 읽기 및 쓰기 모두 지원합니다. 따라서 GeoTools를 사용하는 개발자라면 간단한 프로그램을 이용하여 DBMS에 레이어를 추가하는 작업도 가능합니다.

다음은 망고시스템에서 uDig GIS 및 위 드라이버를 활용하여 데이터 변환 도구를 작성한 예입니다.

2013년 10월 1일 화요일

[Ubuntu] uDig에서 GXT Toolbox가 실행되지 않을 경우

OS : Ubuntu 12.04.2
uDig : 1.4.0b

▣ 증상
 uDig에서 추가/설치를 통해 [GXT Toolbox]를 성공적으로 설치하여, Toolbox의 트리목록은 생성되나 개별 기능을 더블클릭했을 경우 아무런 반응이 없을 경우.

▣ 원인
> 참조 URL
http://udig.refractions.net/files/docs/latest/user/Running%20uDig.html#info-and-help-require-a-pure-mozilla-browser-udig-698-linux-mozilla-five-home-required-for-information-tool

> Internal or Embedded Browser
uDig 에서는 Info View, Web Catalog, 도구상자의 help와 같은 페이지를 팝업창에 보여줄때 "Web Browser"를 사용하여 보여줍니다. Window 에서는 해당 페이지를 Explorer를 통해 보여주는 것과 같이 Linux 에서는 기본적으로 Mozilla Browser를 사용하게 되어 있습니다.

> Linux 플랫폼의 Eclipse는 기본적으로 Mozilla 브라우저를 사용하게끔 되어 있지만 최근 Linux 배포판(Ubuntu 12.04 포함)에서는 Firefox 처럼 Custom된 브라우저를 탑재하여 배포되기 때문에 uDig 에서는 이러한 Browser를 인식하지 못합니다.

> 결론적으로.. uDig이 Linux의 Internal or Embedded Browser를 인식하지 못해서 정보 페이지를 보여줄수 있는 Browser를 찾지 못해 Java의 SWT에서 오류가 발생하여 툴박스의 창이 열리지 않는 것입니다.

▣ 해결방법
> 1. http://udig.refractions.net 에서는 "Mozilla"를 설치.

> 2. 다음과 같이 "libwebkitgtk-1.0-0"을 설치합니다.
   sudo apt-get install libwebkitgtk-1.0-0

> 3. "xulrunner"를 설치하고, uDig 폴더의 스트립트파일(udig.sh)에 다음내용을 추가합니다.
   [xulrunner] 설치 : sudo apt-get install xulrunner
   [udig.sh] 스크립트에 추가 : export MOZILLA_FIVE_HOME="/usr/lib/xulrunner/"

위 세가지 방법중 한가지로 문제를 해결할 수 있습니다.
참고로 저는 두번째 방법을 통해 문제를 해결했습니다.