오늘은 Geotools를 활용하여 정사영상(geotiff) 이미지 파일을 png로 변환하는 거에 대해 알아보자
그냥 서버에 올려서 타일 레이어로 만들 수도 있지만, 웹상에서 geotiff를 서버에 올렸을 경우 어떤 데이터인지 미리 보기 기능을 만들기 위해 시작했다.
geotiff에 관한 내용은 자세히 언급하지 않겠다.. 사실 이미지가 만들어지는 과정에 대해서는 찍은 적도 없고 어떻게 진행되는지 자세히 모른다 그냥 드론으로 여러 번 찍어서 만드는 경우만 알고 있다.
서론을 마치고 본격적으로 geotools 사용을 통해 geotiff 파일을 png 이미지 파일로 생성하는 소스를 보도록 하자
먼저 메이븐으로 geotools를 설치했다
<!--메이븐 추가-->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-referencing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-opengis</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-swing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-tile-client</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-wmts</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geotiff</artifactId>
<version>${geotools.version}</version>
</dependency>
자세한 설치 사항은 아래 링크에서 확인 할 수 있습니다.
docs.geotools.org/latest/userguide/tutorial/quickstart/index.html
Quickstart — GeoTools 26-SNAPSHOT User Guide
Quickstart Welcome to your first GeoTools project! We are going to set up a project using GeoTools to quickly display a shapefile on screen. This tutorial is available for: If you are interested in porting this tutorial to an additional IDE please contact
docs.geotools.org
새로운 바운더리를 설정하고 새로운 레스터 이미지 객체를 생성한다.
String file = "파일경로+fileName.tif";
File file = new File(file);
AbstractGridFormat format = new GeoTiffFormat();
AbstractGridCoverage2DReader reader = format.getReader(file);
try {
GeneralParameterValue[] params = new GeneralParameterValue[1];
ParameterValue<GridGeometry2D> gg = AbstractGridFormat.READ_GRIDGEOMETRY2D.createValue();
GeneralEnvelope envelope = reader.getOriginalEnvelope();
Dimension dim = new Dimension();
int width =500; //출력할 이미지 가로 길이 설정
//가로 길이에 맞게 높이 설정
int height = (int)(width*(reader.getOriginalEnvelope().getSpan(1) / reader.getOriginalEnvelope().getSpan(0)));
dim.setSize(width,height);
Rectangle rasterArea = (GridEnvelope2D)reader.getOriginalGridRange();
//새로 설정한 dimension을 다시 설정해준다.
rasterArea.setSize(dim);
GridEnvelope2D range = new GridEnvelope2D(rasterArea);
gg.setValue(new GridGeometry2D(range, envelope));
params[0]=gg;
GridCoverage2D coverage = reader.read(params);
//레스터 데이터 이미지를 버퍼 이미지에 담고 설정한 가로,세로 길이에 맞게 데이터를 담아준다.
Raster image = coverage.getRenderedImage().getData();
BufferedImage thumbImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
thumbImg.setData(image);
String outputName = fileName.split("\\.")[0];
File output = new File(fileDir+outputName+"_thumb.png");
ImageIO.write(thumbImg, "png", output);
reader.dispose();
thumbImg.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
소스코드에 사용한 클래스가 아직 익숙하지 않지만 어떻게든 구현하긴 했다.
사실 gdal에서 명령어 한줄이면 간단하게 처리할 수 있긴 했지만 geotool를 공부하기 위해 document랑 user-guide 참고하면서 파헤치니
되긴 되었다.
보통 드론으로 촬영한 Geotiff의 경우 데이터 크기가 제법 컸었다. 실제로 테스트한 정사영상 이미지의 경우 3기가 정도 되었다.
로컬에서 테스트했을 경우 3기가 정도의 파일을 컨버팅하는데 30초 정도 소요 됐던 거 같다
'java > Geotools' 카테고리의 다른 글
java Geotools shape 속성 파일 dbf 인코딩 확인 (0) | 2021.07.15 |
---|---|
Geotools Shapefile 스키마 정보를 확인해보자( CoordinateSystem, CharacterSet...) (0) | 2021.04.23 |
Geotools 지도에 csv 파일 레이어로 추가하기 (0) | 2021.04.18 |
Geotools로 shapefile dbf 파일 속성 읽기 (0) | 2021.04.12 |
Geotools shapefile PostGis 데이터로 바꾸기 (8) | 2021.04.12 |