[GIS] 정규표현식(regex)를 이용한 WKT 파싱

또 다시 지오메트리에 대한 WKT 형식을 파싱해야할 상황이 생겼습니다. 예전엔 한땀.. 한땀.. -_-; 문자값 하나 하나를 파싱해서 좌표값을 뽑아 냈더랬습니다. 그런데.. 또 이짓을 해야한다고 생각하니.. 손과 뇌에 마비가 와 죽어도 못하겠더군요..

해서.. 뭔가 그럴듯한.. 세련된 방법이 없나.. 궁리를 하다가.. 정규표현식(Regular Expressions)를 이용해 보자라는 생각이 들었습니다. 예전에 정규표현식에 대해 살펴봤던 적이 있었는데.. 이런게 있구나 싶을 정도로만 봐두었던지라.. 떠올랐나봅니다.

실무에서 필요한 기술이라 생각되니.. 정규표현식을 사용하는 방법을 제법 집중해서 살펴보게 되었습니다.. 결국 원하는 결과를 얻어 냈습니다… 해서 정규표현식을 이용해 WKT 형식의 지오메트리의 좌표를 뽑아 내는 코드를 잠시 살펴보겠습니다.

대상이 되는 WKT는 다음과 같다고 하겠습니다.

POLYGON ((100 200, -200 300, -400 500), (10 20, -20 -30, 40 50), (1 2, 2 3, 4 5) )

예이므로 올바른 폴리곤은 아닙니다. 단지 WKT 형식이라는 점에만 유념해 주시면 됩니다. 이 WKT을 보면 폴리곤이 3개의 파트로 구성됩니다.  정규표현식을 이용해 3개의 파트에 대해 각 파트를 구성하는 좌표를 쭉… 뽑아내 보는 코드는 아래와 같습니다.

var wkt:String = 
    "POLYGON ((100 200, -200 300, -400 500), " + 
    "(10 20, -20 -30, 40 50), (1 2, 2 3, 4 5)) ";

var removePrefix:String = wkt.replace(/\bpolygon\b\s*\(/i, "");
var removePostfix:String = removePrefix.replace(/\s*\)\s*$/, "");
var parts:Array = removePostfix.match(/\(.*?\)/g);

for each(var part:String in parts)
{
    var vertices:Array = part.match(/[+-]?\d*(\.?\d+)/g);
    var cntVertices:uint = vertices.length;
    trace("\nPOLYGON VERTICES LIST");
    for(var iVertex:uint=0; iVertex    {
        var x:Number = vertices[iVertex];
        var y:Number = vertices[iVertex+1];
        trace("\tVERTEX: (" + x + "," + y + ")");
    }
}

실제 결과는 다음과 같습니다.

POLYGON VERTICES LIST
    VERTEX: (100,200)
    VERTEX: (-200,300)
    VERTEX: (-400,500)

POLYGON VERTICES LIST
    VERTEX: (10,20)
    VERTEX: (-20,-30)
    VERTEX: (40,50)

POLYGON VERTICES LIST
    VERTEX: (1,2)
    VERTEX: (2,3)
    VERTEX: (4,5)

정규표현식을 이제 막 익힌 제가 머리를 쥐어짜가며 구성한 코드입니다. 4개나 되는 정규표현식을 사용했습니다.. 정규표현식에 숙련된 자라면 휠씬 빠르고 적은 수의 표현식으로 동일한 결과를 얻어 낼 수 있을거라.. 생각해 봅니다.

아! 위의 코드는 예는 ActionScript입니다. 물론.. 정규표현식은 C#, JavaScript, C, PHP 등등 매우 많은 언어에서 사용할 수 있는 기능입니다. 각 언어에 따라 정규표현식에 대한 API가 다르지만 정규표현식 자체는 거의 동일합니다.

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

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

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

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

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


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