Backend/JAVA

[Tibero/Geometry 에러 처리] Data is too long for the column 에러/ tbClob/tbBlob 처리 방법(feat. GIS)

keepbang 2021. 5. 13. 17:34

GIS 데이터를 처리하다 보면 polygon 데이터가 기하학적으로 늘어나는 경우가 있다

tibero에 있는 내장함수 TO_CHAR로 String 형태로 가져오면 60000byte?까지밖에 가지고 못한다.

나 같은 경우에는 아래와 같은 sql 문으로 geometry 정보를 가져오는 부분에서 에러가 나왔다.

SELECT ID,TO_CHAR(ST_ASTEXT(GEOM)) FROM GEOMETRYTABLE

여기서 ST_ASTEXTgeometry 정보를 tbClob으로 가져오는 함수이다.

자바에서 ST_ASTEXT로만 가져오면

com.tmax.tibero.jdbc.TbClob 형태로 가져오게 된다.

그걸 TO_CHAR로 감싸게 되면 WKT 형태로 geometry 값을 받아올 수 있다.

clobblob의 정보는 아래 tibero 문서를 참조하였다.

 

 

제8장 LOB 데이터 처리

본 장에서는 tbJDBC에서 LOB 데이터를 처리하는 방법을 설명한다. JDBC 표준에서는 LOB 데이터를 처리하기 위해 두 가지 타입을 제공한다. BLOB(바이너리 데이터)와 CLOB(문자열 데이터)가 이에 해당한

technet.tmaxsoft.com

 

하지만 앞서 말한 대로 60000바이트의 값밖에 가져오지 못하므로 geometry 값이 커지면 아래와 같은 에러가 나오게된다.

 

Data is too long for the column

따라서 geometry 정보를 WKT으로 쓰고 싶다면 spring에 있는 geotools를 사용해서 쓰면 된다.

import java.io.Reader;
import java.io.StringWriter;
import org.geotools.geojson.geom.GeometryJSON;
import org.geotools.geometry.jts.WKTReader2;
import org.locationtech.jts.geom.Geometry;
import com.tmax.tibero.jdbc.TbClob

.....

try{
    ResultSet rs = stmt.executeQuery("SELECT ID,ST_ASTEXT(GEOM) FROM GEOMETRYTABLE");
    TbClob tbClob = (TbClob)rs.getObject(1) //1
    Reader reader = tbClob.getCharacterStream(); //2

    WKTReader2 wktReader = new WKTReader2(); //3

    Geometry geom = wktReader.read(reader); //4

    GeometryJSON geoJson = new GeometryJSON(15);
    StringWriter sw = new StringWriter();

    geoJson.write(geom,sw); //5

    sw.toString()//wkt데이터
}catch(Exception e){
    System.out.println(e.getMessage());
}

st_astext로 가져온 데이터를 TbClob으로 받아준다

  1. Reader 클래스로 tbClob 데이터를 읽는다
  2. WKT로 변환하기 위해 WKTReader2를 생성한다
  3. Reader로 읽은 데이터를 Geometry 정보로 만들어준다
  4. GeometryJSON으로 geometry 정보를 StringWriter에 저장한다.

sw.toString()부분에서 나온 값으로 사용하면된다.