[GIS] FingerEyes, Geometry로 Feature 가져오기

Geometry로 Feature를 가져온다는 의미는 임의의 지오메트리와 공간상에서 교차하는 Feature를 가져온다는 의미입니다. 임의의 지오메트리이므로 폴리곤, 폴리라인, 포인트 등 제약이 없습니다. 기준 지오메트리는 WKT 형식으로 쉽게 지정할 수 있습니다. 다음은 지정한 폴리라인과 교차하는 Feature를 서버측으로부터 가져오라는 코드 예입니다.

var pnuLyr:XrShapeMapLayer = map.layers.getLayer("JIBUN") as XrShapeMapLayer;
if(pnuLyr != null)
{
    var bOK:Boolean = pnuLyr.queryByGeometry(
        "LINESTRING(250661 54225, 250343 53233)",
        true,
        callback);

    if(!bOK)
    {
        // Error !
    }
}

대상이 되는 레이어를 1번 코드를 통해 가져옵니다. 속성과 도형에 대한 기능이므로 XrShapeMapLayer만이 가능합니다. 그리고 4번에서 queryByGeometry 매서드를 통해 쿼리 합니다. 첫번째 인자는 기준 지오메트리로써 WKT 형식으로 지정합니다. 그리고 두번째 인자는 도형 데이터 뿐만 아니라 속성 데이터까지 가져오라는 의미입니다. 그리고 세번째 인자는 공간 데이터 쿼리가 완료되었을때 발생하는 콜백함수이며 아래는 그 예입니다.

private function callback(arg:XrSpatialQueryResult):void  
{   
    if(arg != null)   
    {   
        var shp:IXrShape = null;   
        var shapes:Object = arg.shapeSet.rows;   
        for each(shp in shapes)   
        {   
            var attribute:XrAttributes =    
                arg.attributeSet.rows[shp.fid] as XrAttribute;   
            if(attribute != null)   
            {   
                trace(shp.centroid.x + " " + shp.centroid.y    
                    + " " + attribute.getValueAsString(1));   
            }   
        }   
    }   
    else  
    {   
        // 아무것도 오질 않았음..   
    }   
}  

서버 측으로 받은 결과에서 도형의 중심점과 2번째 속성값만을 확인하는 예입니다.

[GIS] FingerEyes, FID 리스트로 Feature 가져오기

FID값은 FeatureID로써 이 값에 대한 Feature를 가져오는 예제 코드입니다. 참고로 Feature는 공간 데이터 + 속성 데이터의 셋입니다.

var pnuLyr:XrShapeMapLayer = map.layers.getLayer("JIBUN") as XrShapeMapLayer;
if(pnuLyr != null) {
    var fids:Vector. = new Vector.();
    fids.push(100, 200, 300, 400, 500, 600, 700, 10000);
    if(!pnuLyr.queryByFIDs(fids, true, callback))
    {
        // Query Request Error !!
    }
}

먼저 대상 레이어를 파악해야 합니다. FID에 관련된 레이어이므로 1번 코드에서 XrShapeMapLayer가 필요하고 요청할 FID의 리스트를 3~4번에서 만들고 있습니다. 그리고 5번 코드에서 queryByFIDs 매서드를 통해 리퀘스트를 서버에 날립니다.

서버에 대한 응답은 비동기적으로 처리되므로 콜백함수가 필요하며 queryByFIDs의 세번째 인자에 지정합니다. 두번째 인자는 공간 데이터 뿐만 아니라 속성 데이터까지 가져오라는 의미입니다. 그렇다면 서버로부터 받은 Feature를 처리하기 위한 콜백함수를 살펴보면, 그 예는 다음과 같습니다.

private function callback(arg:XrSpatialQueryResult):void
{
    if(arg != null)
    {
        var shp:IXrShape = null;
        var shapes:Object = arg.shapeSet.rows;
        for each(shp in shapes)
        {
            var attribute:XrAttributes = 
                arg.attributeSet.rows[shp.fid] as XrAttribute;
            if(attribute != null)
            {
                trace(shp.centroid.x + " " + shp.centroid.y 
                    + " " + attribute.getValueAsString(1));
            }
        }
    }
    else
    {
        // 아무것도 오질 않았음..
    }
}

결과가 오면 도형의 중심점과 두번째 속성값을 표시하는 코드입니다.

[GIS] FingerEyes, UPDATE, INSERT, DELETE SQL 문 실행

핑거아이즈는 서버측의 DBMS에 UPDATE, INSERT, DELETE와 같은 SQL 문을 실행할 수 있도록 요청할 수 있습니다. 다음 코드는 그 예입니다.

var svc:XrUpdateTableService = new XrUpdateTableService(
    "127.0.0.1:8076",
    "postgis",
    __completed,
    __error
);

var sql:String = "INSERT INTO tstTbl VALUES (100, '안녕하세요!')";

svc.run({sql:sql});

SQL문의 실행을 서버측에 요청하고 그 결과를 받아오는 일련의 과정을 사용하기 쉽게 캡슐화된 XrUpdateTableService 클래스를 이용합니다. 서버의 IP와 사용하는 DBMS의 종류 그리고 SQL 문이 서버측에서 성공적으로 실행되었을때와 실패했을때에 대한 콜백함수를 생성자의 인자로 지정합니다.

아래는 SQL문이 성공적으로 실행되었을때와 실패했을때에 대한 콜백함수의 예입니다.

protected function __completed(cntRowUpdated:uint):void
{
    // cntRowUpdated는 SQL문의 실행에 의해 영향을 받은 Row의 수
}

protected function __error():void
{
    // SQL 실행하는데 문제 있음
}

영화, “부러진 화살”

이 영화를 보고 떠오른 영화가.. “도가니”였습니다. 도가니가 특수학교 학우라는 소외된 범위에 대한 매우 안타까운 이야기였다면.. 이 영화는 그냥.. 우리의 현실을 그린 실화를 바탕으로 한 영화라고 생각합니다..

사용자 삽입 이미지
꽤 늦은 저녁.. 사은품으로 받은 티켓이 아까워 예매를 하고 홀로 본 영화입니다. 눈이라고 해봐야 별로 내리지 않는 날임에도.. 기상청 스스로의 책임 회피를 위한 대설주의보가 발령된 어제지요..

가진자들이 정한 테두리 안에서 말 잘 듣고 튀지만 않으면.. 그럭 저럭.. 살만한 세상.. 이건 우리나라나.. 다른 나라나 다 마찬가지라고 생각합니다.. 다만.. 그 정도의 차이는 분명 존재한다고 생각합니다.

가진자들이 이미.. 그렇게 하기로 결정한 것들 앞에서는 상식이나.. 정의나.. 이런것들 따위는 아무런 의미가 없어져 버리는.. 무서운 현실을 담아 내고 있습니다. 현실을 바탕으로 한 영화이기에.. 영화속의 무서운 현실이.. 영화가 끝나고 난 뒤.. 다시 현실로 돌아와서도.. 내 가슴을 떨리게 하였습니다..

그래도.. 이 영화는 이런 현실속에서 살아갈 수 있는 방향과 방법을 제시합니다.. “스스로 계속 똑똑해져라, 그리고 포기하지말고 나아가라.”.. 식상하기만한.. 뭐 이런.. 할 방향과 방법이라고 생각됩니다만.. 이게.. 방법입니다.. 현실은.. 어디까지나 현실이니까요..

어떤 영화든.. 보는 사람에게.. 그 나름대로 해석되고.. 자신이 가지고 있는 생각들과 섞여 그 사람에게 투영됩니다.. ‘부러진 화살’이 요즘 내가 생각하고 있는 것들과 섞여 만들어낸 생각.. 이 생각이 올해 내가 나아가고 내가 해야할 일들에 큰 영향을 줄것입니다..

[GIS] PostGIS, 공간데이터 테이블 생성에 대한 SQL

진행하고 있는 프로젝트에서 사용하고 있는 공간 DBMS로 PostGIS를 사용하고 있습니다. 공간 테이블을 직접 만들어어 활용해야할 필요가 있어 찾은 내용을 정리해 봅니다.

고유한 ID 값으로써 fid와 기타 필드로써 name 그리고 Geometry 값에 대한 the_geom이라는 이름의 필드를 가지는 테이블을 생성하는 SQL 문의 예는 다음과 같습니다.

CREATE TABLE "tst_table"(
    fid INTEGER PRIMARY KEY,
    name VARCHAR(64),
    the_geom geometry,

    CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2),

    CONSTRAINT enforce_geotype_the_geom CHECK 
            (geometrytype(the_geom) = 'MULTIPOLYGON'::text 
        OR 
            the_geom IS NULL),

    CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = (-1))
);

1번 줄에 생성할 테이블 명으로써 tst_Table로 지정했습니다. 2~4번 줄이 앞서 언급한 필드들이구요. 6번 줄은 Geometry에 대한 필드인 the_geom의 차원이 2차원, 즉 X와 Y의 쌍이어야 한다는 제약 조건입니다. 그리고 8번 줄의 제약 조건은 Geometry가 MULTIPOLYGON 타입이며 NULL 일 수 있다는 것 입니다. 그리고 13번 줄은 Geometry의 Spatial Reference ID에 대한 제약 조건입니다.

이제 아래는 앞서 생성한 공간 테이블에 하나의 레코도를 추가하는 SQL 문입니다.

INSERT INTO tst_Table 
 (
    fid, 
    name, 
    the_geom
) 
VALUES 
 (
    0, 
    '테스트', 
    ST_GeomFromText('MULTIPOLYGON(((0 0,1 0,1 1,0 1,0 0)))', -1)
); 

일반적인 INSERT SQL 문입니다. 단지 주목해야할 줄은 11번입니다. Geometry에 대한 WKT 형식으로 지정했으며 공간참조로 -1을 주었습니다. 이 값은 앞서 공간 테이블을 생성할때 제약 조건과 일치합니다.