GDAL에서 제공하는 Command 정리

GDAL은 geotif 등과 같은 Raster 데이터에 대해 수행할 수 있는 다양한 Command를 제공합니다. Raster 파일에 대한 Extent와 좌표계 정보를 얻을 수 있는 gdalinfo.exe에서부터 영상에서 특정 영역만을 뽑아내 또 다른 영상 파일로 저장할 수도 있고, 좌표계에 대한 투영변환도 가능하며 GCP를 지정해 Georeferencing도 가능합니다. GIS 개발자에게 Raster 데이터를 저수준에서 처리하기 위해 GDAL는 매우 활용도가 높고 중요한 오픈소스 라이브러리입니다. (GDAL 라이브러리만 있다면 어떠한 GIS 데이터 포맷이든 모두 내 손 안에 있다규 !!)

GDAL에서 제공하는 Command 명령 중 실제 작업 중에 사용했던 것을 정리해 둡니다.

1. Raster 데이터의 정보 보기

Z:\> gdalinfo A.tif

위의 명령은 A.tif 파일에 대한 좌표계 및 Extents 등에 대한 정보를 얻기 위한 명령입니다.

2. geotif 영상에서 원하는 부분만을 잘라내 또다른 파일로 저장하기

Z:\> gdalwarp -te 197789.97 552829.04 199789.97 554829.04 G:\img\geotif\Seoul_10cm_GRS80.tif g:\a.tif

위의 명령은 Seoul_10cm_GRS80.tif 영상 파일에서 MBR(197789.97 552829.04 199789.97 554829.04)에 대한 부분을 a.tif 파일로 저장하기 위한 명령입니다.

3. GCP를 지정한 Georeferencing 하기

Z:\> gdal_translate -of GTiff -gcp 48.954 1298.304 219084 362071 -gcp 1174.042 348.95 219261 362144 -gcp 2610.376 5.8401 219418 362116 A.jpg B.tif
Z:\> gdalwarp -r lanczos B.tif C.tif

위의 연속적으로 실행되는 2개의 명령 중 첫번째는 GCP를 3개 사용해 입력 파일인 A.jpg 파일에 대해 Georeferencing 하여 B.tif 파일로 저장하라는 명령이고, 두번째는 저장된 B.tif를 Resizing 알고리즘 중 lanczos를 사용해 c.tif 파일로 저장하라는 명령입니다.

[Java] 오픈소스 KML 문서 생성 라이브러리 – kmlwriter v0.1

공간 서버 단에서 kml 문서를 생성해 주는 기능을 개발하면서 Point, Polyline, Polygon 요소에 대한 kml 문서를 생성해 주는 Java 라이브러리를 만들어 사용했는데요. 이에 대해 공개합니다. 단순히 좌표에 대한 형상 정보만을 생성해 주는 라이브러리이고 style과 같은 내용은 아직 지원하지 않습니다. 이 라이브러리의 클래스 구조도는 다음과 같습니다.

이 라이브러리를 이용해 Point에 대한 kml 문서를 생성해 주는 코드의 예는 다음과 같습니다.

import java.util.LinkedList;

import geoservice.kmlwriter.Coordinate;
import geoservice.kmlwriter.Document;
import geoservice.kmlwriter.IGeometry;
import geoservice.kmlwriter.LineString;
import geoservice.kmlwriter.LinearRing;
import geoservice.kmlwriter.Placemark;
import geoservice.kmlwriter.Point;
import geoservice.kmlwriter.Polygon;

public class MainEntry {

    private static String testPointPlaceMarkKML() {
        Document kmlDoc = new Document();

        Coordinate coord = new Coordinate(128, 38); //(경도, 위도)
        IGeometry geom = new Point(coord);
        Placemark placemark = new Placemark(geom, "My Point Placemark");
        kmlDoc.addPlacemark(placemark);

        String kml = kmlDoc.build();
		
        return kml;
    }

    ....

Polyline에 대한 kml 문서를 생성해 주는 코드는 아래와 같습니다.

import java.util.LinkedList;

import geoservice.kmlwriter.Coordinate;
import geoservice.kmlwriter.Document;
import geoservice.kmlwriter.IGeometry;
import geoservice.kmlwriter.LineString;
import geoservice.kmlwriter.LinearRing;
import geoservice.kmlwriter.Placemark;
import geoservice.kmlwriter.Point;
import geoservice.kmlwriter.Polygon;

public class MainEntry {

    private static String testPolylinePlaceMarkKML() {
        Document kmlDoc = new Document();
		
        LinkedList<Coordinate> coords = new LinkedList<Coordinate>();
        coords.add(new Coordinate(128, 38));
        coords.add(new Coordinate(129, 38));
        coords.add(new Coordinate(129, 39));

        IGeometry kmlGeom = new LineString(coords);
        Placemark placemark = new Placemark(kmlGeom, "My Polyline Placemark");
        kmlDoc.addPlacemark(placemark);
		
        String kml = kmlDoc.build();
		
        return kml;
    }

    ....

Polygon에 대한 kml 문서를 생성해 주는 코드입니다.

import java.util.LinkedList;

import geoservice.kmlwriter.Coordinate;
import geoservice.kmlwriter.Document;
import geoservice.kmlwriter.IGeometry;
import geoservice.kmlwriter.LineString;
import geoservice.kmlwriter.LinearRing;
import geoservice.kmlwriter.Placemark;
import geoservice.kmlwriter.Point;
import geoservice.kmlwriter.Polygon;

public class MainEntry {
	
    private static String testPolygonPlaceMarkKML() {
        Document kmlDoc = new Document();
        LinkedList<LinearRing> rings = new LinkedList<LinearRing>();

        LinkedList<Coordinate> outer_coords = new LinkedList<Coordinate>();
        outer_coords.add(new Coordinate(128, 38));
        outer_coords.add(new Coordinate(129, 38));
        outer_coords.add(new Coordinate(129, 39));
        outer_coords.add(new Coordinate(128, 39));
        outer_coords.add(new Coordinate(128, 38));

        LinkedList<Coordinate> inner_coords = new LinkedList<Coordinate>();
        inner_coords.add(new Coordinate(128.25, 38.25));
        inner_coords.add(new Coordinate(128.75, 38.25));
        inner_coords.add(new Coordinate(128.75, 38.75));
        inner_coords.add(new Coordinate(128.25, 38.75));
        inner_coords.add(new Coordinate(128.25, 38.25));

        rings.add(new LinearRing(outer_coords, true));
        rings.add(new LinearRing(inner_coords, false));

        IGeometry kmlGeom = new Polygon(rings);
        Placemark placemark = new Placemark(kmlGeom, "My Polygon Placemark");
        kmlDoc.addPlacemark(placemark);

        String kml = kmlDoc.build();

        return kml;
    }

    ....

폴리곤의 외부와 내부에 대한 부분은 35번과 36번처럼 LinearRing 클래스의 생성자의 두번째 인자에서 지정할 수 있습니다. 위의 Polygon에 대한 kml 생성 예제 코드를 통해 생성된 kml 문서를 구글어스에서 살펴보면 아래 화면에 같습니다.

이 라이브러리의 소스코드는 아래의 링크를 통해 다운로드 받을 수 있습니다.