Geometry

이 프로젝트에서 기하 모델은 ISO 19107 공간 스키마를 기반으로 하고 있습니다. GeoTools에서 이 기하 모델은 OpenGIS (gt-opengis) 모듈에서 자바 인터페이스로 정의되어 있습니다. 그리고 ISO Geometry (gt-geometry) 모듈에서 이를 구현하고 있지만 Solid를 제외한 2.5D 기하까지만 지원하고 있고 3차원 질의도 마찬가지로 지원하고 있지 않습니다. 이 때문에 이 구현을 그대로 사용하는 것은 불가능합니다.

우리는 3차원 공간 데이터와 질의를 제공하기 위해서 ISO 기하 모델에서 모든 기하에 대한 정의와 3차원 공간 연산들을 직접 구현하는 방법이 있지만 이는 엄청난 노력을 필요로 하고 탄탄하고 안정적인 기능을 제공하는 것이 어렵습니다. 이 때문에 우리는 다른 오픈소스 라이브러리가 공간 연산을 담당하도록 하였습니다.

우리가 3차원 기하 연산을 위해서 사용한 기하 라이브러리는 Simple Feature CGAL (SFCGAL)입니다. 이 라이브러리는 CGAL과 Boost를 기반으로 구현되어 있으며 ISO 19107 공간 스키마와 OGC Simple Feature Access 1.2 표준을 기반으로 기하 모델을 정의하고 있기 때문에 Solid 기하도 지원하고 있습니다. 또한 여러가지 3차원 기능들을 CGAL이 제공하는 기능들을 확장하여 구현하고 있습니다.

내부 구현

3차원 기하 연산을 지원하기 위해 SFCGAL 라이브러리를 ISO 19107 공간 스키마를 구현하는 클래스에 연결했습니다. 그 구조는 다음의 그림과 같습니다.

_images/sfcgal.png

SFCGAL은 C++로 작성된 라이브러리이므로 SFCGAL 라이브러리의 함수를 호출하려면 네이티브 C++와 Java 사이의 인터페이스가 필요합니다. 이를 지원하는 라이브러리 중 우리는 JavaCPP를 사용하였습니다. JavaCPP는 오픈소스 도구이며 C++와 Java 사이를 쉽게 인터페이스 할 수 있습니다. JavaCPP를 이용하여 C++로 작성된 SFCGAL과 대응하는 Java 클래스를 생성하였고 이는 그림에서 SFCGAL Java Wrapper와 같습니다.

그리고 SFCGAL과 GeoTools 간의 연결을 위해서는 SFCGAL Java Wrapper 클래스들과 GeoTools ISO Geometry 간의 모델의 차이 때문에 일련의 변환 프로세스가 필요합니다. 이 기능은 SFCGAL Converter에서 담당하고 있으며 다음의 표를 변환 관계를 기준으로 변환 프로세스를 수행합니다.

_images/conversion.png

이제 SFCGAL Java Wrapper 클래스들은 GeoTools ISO Geometry 클래스로 부터 기하 연산이 호출될 때 SFGCAL의 해당 네이티브 메소드를 호출할 수 있습니다. SFCGAL에서 수행이 완료되면 결과는 SFCGAL Java Wrapper 클래스로 반환됩니다. 이는 다시 Java의 타입이나 GeoTools ISO Geometry로 변환되어 반환됩니다.