[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가 다르지만 정규표현식 자체는 거의 동일합니다.