이 글은 대표적인 BIM, GIS 표준 형식인 IFC(Industry Foundation Classes), CityGML 포맷을 해석하고, 정보를 추출하는 방법에 대한 내용을 간략히 정리한다. IFC나 CityGML은 3차원 도시 및 건물 객체 모델 정보를 좀 더 정확히 저장하거나 교환하기 위해서 사용된다. 그러므로, 범용적인 목적으로 3차원 도시 및 건물 모델을 가시화, 해석할 때 가장 기본이 되는 모듈이 IFC, CityGML 파일 포맷 입출력과 정보 추출이다(상업용 파일 포맷을 해킹해 역설계하지 않은 한).
CityGML 예시(www.3dcitydb.org/3dcitydb)
파일 포맷을 해석하기 위해서는 파서(Parser)가 필요하다. 이 글에서는 대표적인 파서를 이용해 파일을 읽고, 정보를 확인하는 방법을 간단히 알아본다.
IFC 파서 사용 방법
변환을 위해서는 파일포맷을 읽고 쓸 수 있는 파서가 필요하다. 아래 링크에서 소스를 다운로드한 후 빌드, 설치한다.
소스코드 빌드가 성공하면, IfcPlusPlus 예제 중 CreateWallAndWriteFile 프로젝트를 열어, 빌드한 후 실행해 본다.
CreateWallAndWriteFile예제는 간단한 벽체 하나를 생성하는 코드가 구현되어 있다.
설치방법을 참고해, 다음과 같이 관련 패키지와 소스코드를 빌드한다.
빌드 과정
빌드한 후 citygmltest 예제를 실행하면, 주어진 CityGML을 파싱하는 것을 확인할 수 있다.
파싱된 객체 속성을 확인하기 위해, load() 실행 후 다음 코드를 추가해 실행한다.
std::cout << "Analyzing the city objects..." << std::endl;
int count = city->getNumRootCityObjects();
for (int i = 0; i < count; i++)
{
const citygml::CityObject& obj = city->getRootCityObject(i);
const citygml::AttributesMap& map = obj.getAttributes();
citygml::AttributesMap::const_iterator it = map.begin();
for (; it != city->getRootCityObject(i).getAttributes().end(); it++)
{
std::cout << "" << it->first;
std::cout << " = " << it->first;
std::cout << std::endl;
}
}
실행해보면, CityObject의 루트 속성 정보를 다음과 같이 확인할 수 있다. 디버깅을 통해, 하위 Child Object를 탐색해보면, Building (2), Room (4), Door (32), Window (64), Ground, Roof 등이 파싱되어 있는 것을 확인할 수 있다.
이 중 Building의 속성을 확인하면, 다음과 같다.
CityGML 구조처럼 객체들은 Root 아래 Child Object로 추가되어 있고, 계층적으로 구성되어 있다. 그러므로, 모든 정보를 파싱하려면, 재귀적으로 계층구조를 방문해야 한다는 것을 알 수 있다.
참고
- ifcquery.com
- CityGML2IFC
- IfcOpenShell
- Ifc2CityGML (github)
- citygml tools
- citygml4j
- extract data from IFC files
추신.
BIM principle 블로그도 정리할 겸, 2013년에 BIM도구에 대해 쓴 글을 확인해보면서, 자료를 업데이트하다보니, IFC, CityGML 파서까지 다시 살펴보게 되었다. 그 당시에는 오픈소스였던 도구들이 많이 비지니스화되어 스타트업 등에서 관리되고 있는 것을 보니, 여러가지 생각이 든다. 역시, 비전을 보고 끈질기게 준비하는 사람이 시장에서 가치를 만들어 나가는 것 같다.
댓글 없음:
댓글 쓰기