[GIS] GeoService-Xr, PostGIS으로부터 Geometry 읽기 오류 Fix

GeoService-Xr은 DuraMap-Xr, FingerEyes-Xr, BlackPoint-Xr을 통해 공간 데이터를 서비스하는 공간 데이터 서버입니다. GeoService-Xr은 ArcSDE, MySQL 그리고 PostgreSQL을 통해 공간 데이터를 읽고 쓸 수 있습니다.

PostgreSQL은 PostGIS을 통해 공간 데이터를 질의하고 있으며 GeoService-Xr 역시 PostGIS를 사용합니다. 이러한 PostGIS을 통해 지오메트리를 읽는 GeoService-Xr의 기능 중 Multi-Polygon에 대해 옳바르게 도형을 표현하지 못하는 문제점이 있어서 이에 대한 버그를 해결하였습니다.

버그 대상이 되는 폴리곤은 Ring을 여러개 가지는 폴리곤으로써.. 예를 들어 구멍이 뚫린 폴리곤의 경우입니다. 아래의 그림은 버그가 해결된 상태에서 PostGIS를 통해 공간 데이터를 가져와 FingerEyes에서 표출한 화면입니다. 클릭하면 원본 크기로 볼 수 있습니다.


해결된 부분에 대한 GeoService-Xr의 소스 코드 부분은 다음과 같습니다. 문제의 근본적인 원인은 PostGIS에서 폴리곤에 대한 Geometry Type에 대한 제 스스로에 대한 이해 부족입니다. 혹… PostGIS를 통해 공간 데이터를 쿼리하고 결과를 받아 좌표를 뽑아 낼때 아래의 코드가 조금이나마 도움이 되시길 바랍니다.

} else if(geometryType_ == Geometry.MULTIPOLYGON) {
    while(row.next()) {
        PGgeometry geom = (PGgeometry)row.getObject(shapeFieldIndex);
        ComposedGeom shp = (ComposedGeom)geom.getGeometry();
        
        // 멀티폴리곤을 구성하는 Ring의 개수 구하기  
        short cntPart = 0; // Ring의 개수!
        int cntGeoms = shp.numGeoms();
        for(int iGeom=0; iGeom        Polygon polygon = (Polygon)shp.getSubGeometry(iGeom);
            cntPart += polygon.numRings();
        }
  
        // 각 Ring을 구성하는 정점(Vertex) 구하기
        for(int iGeom=0; iGeom            Polygon polygon = (Polygon)shp.getSubGeometry(iGeom);
            int numRings = polygon.numRings();
            for(int iRing=0; iRing                LinearRing ring = polygon.getRing(iRing);
                int numPts = ring.numPoints();
                for(int iPt=0; iPt                    Point vtx = ring.getPoint(iPt); // 정점!
                }
            }
        }
    }
}

주의 할점은 멀티폴리곤은 Polygon으로 구성되며 Polygon은 다시 LinearRing으로 구성된다는 점입니다. Polygon이 다시 LinearRing으로 구성되는 이유는 구멍이 뚫린 폴리곤 등을 나타내기 위함입니다.

[GIS] BlackPoint, 공간 데이터 편집 기능

블랙포인트는 안드로이드 기반의 범용 GIS 엔진입니다. 별도의 맵 컴포넌트를 View 형태로 제공함으로써 개발하고자 하는 시스템에 쉽게 사용할 수 있습니다. 블랙포인트는 현장에서 데이터를 취득하기 위한 앱 개발을 위해 현장에서 공간 데이터를 쉽게 편집할 수 있는 공간 데이터 편집 기능을 제공합니다.

사용자 삽입 이미지
위의 화면은 블랙포인트에서 편집 기능에 대한 데모 화면으로 공간 데이터로써 폴리곤을 그릴때 스냅핑 기능을 실행하고 있는 화면입니다. 블랙포인트의 스냅핑 대상은 정점(Vertex)와 세그먼트(Segment)입니다. 이외에도 공간 데이터 편집에 대한 Undo/Redo 기능을 제공하여 보다 정확하고 편리하게 공간 데이터를 편집할 수 있습니다.

다음은 블랙포인트(BlackPoint-Xr)의 편집에 대한 기능 목록 중 일부입니다.

  • 폴리곤/폴리라인/포인트에 대한 Simple Feature Type에 대한 편집
  • 사각형, 원, 타원, 텍스트에 대한 도형 편집
  • 정점 추가 및 삭제 편집
  • 편집 이력에 대한 Undo/Redo 지원
  • 정점과 세그먼트에 대한 스냅핑 기능

블랙포인트에 대해 보다 구체적인 기능이 궁금하시면 언제든 지오서비스(hjkim@geoservice.co.kr)에 문의 하시면 직접 방문하여 시연을 통해 소개해 드리도록 하겠습니다.

[GIS] BlackPoint-Xr, 갤럭시탭 10.1에서 테스트, 이상 무!

3주전인가.. 마침.. 갤럭시탭 10.1을 테스트할 수 있는 기회가 생겨서 기존에 블랙포인트로 개발된 데모 시스템 하나를 갤럭시탭 10.1에서 테스트해 보았습니다.

기존에 사용하는 테스트 디바이스의 경우, 화면 해상도도 작고.. 싱글 코어인 상황인지라.. 갤럭시탭 10.1의 더욱 커진 화면 해상도에 대한 메모리 사용에 대한 문제 발생 여부와 듀얼 코어에 대한 스레드 안정성에 대한 문제가 발생할 가능성이 있다고 판단되었지만.. 다행히도 두가지 문제점이 실제로 발생하지 않았습니다.

그러나 화면 해상도가 커짐에 따라 지도 표출 속도가 저하되는 문제가 발생했습니다. 몇가지 개선을 통해 속도를 향상시켜 놓았으나.. 좀 더 근본적으로 이 문제를 개선할 방안을 고민 중입니다. 현재로써는 SHP 파일을 바로 사용하는 방식인데… 이를 자체 포맷 형태로 변환해 사용하는 방식을 지원하는 것을 통해 속도를 개선시킬 계획입니다.

아래의 화면은 갤럭시탭 10.1에서 블랙포인트의 데모를 올려 실행시킨 화면에 대한 스크린샷입니다.


블랙포인트는 지오서비스(www.geoservice.co.kr)에서 개발된 안드로이드 기반의 GIS 맵 엔진입니다.