[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] 정규표현식(regex)를 이용한 WKT 파싱”에 대한 6개의 댓글

  1. 정말 좋은 정보 감사합니다.
    wkb값을 클라이언트로 받아와 좌표,type으로 컨버팅하는것이 목적이었는데 도무지 방법을 찾지 못하던 찬라였습니다.
    wkb값을 wkt로 받아와 위방식으로 처리하면 될듯합니다. 너무 감사합니다…
    혹시나 wkb값을 굳이 wkt로 바꾸지않고도 좌표,type을 가져올수 있는 방법도 블로깅해주실수 있을련지요.. 즐거운 설연휴 되세요 ^^

    1. wkb는 바이너리인지라.. 굳이 wkt 타입으로 변환하지 않고 바로 읽는게 편하지 않을까요? ^^ wkt는 사람이 눈으로 쉽게 읽는 텍스트 형식인지라.. 컴퓨터로 읽으려면 위와 같이 하나 하나 해석해 줘야 하는 번거로움이 있지만.. wkb는 바이너리인지라… 그냥 곧바로 읽어버리면 더 빠르고 편리한 포맷이라고 생각합니다..

      코봉히님두 구정 잘 지내세요~ ^^ 늘 열심히 하는 모습이 보기 좋습니다~

  2. wkb의 구조가 shp파일의 구조와 같은가요?? byte개념으로 접근을 해본적이 없어서인지 해매고 있습니다. shp를 읽어들이는 flex소스를 구해서 wkb로 받은 데이터를 그대로 적용시켜보니 영딴데이터가 나옵니다. wkb 구조를 알수있는 링크나 도움말좀 부탁해도 될까요..;;
    늘 열심히는 한다고 생각하는데 그 열심히 하고 있는 방향에 대해서는 늘 고민입니다. ㄷㄷ

    1. wkb는 http://www.gisdeveloper.co.kr/519에서도 살펴볼 수 있고 구글링을 통해서도 찾아볼수 있어요. wkb는 shp처럼 바이너리 형식의 데이터를 사용하지만 구조는 다르지요. 플렉스에서 바이너리를 해석하는 것은 ByteArray를 통해 쉽게 읽을 수 있는데 주의할점은 빅엔디안이냐 리틀엔디안이냐를 잘맞춰줘야 합니다..

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다