DuraMap-Xr에서 고정값으로 라벨 회전

라벨을 일정한 값으로 회전하는 API에 대한 내용을 정리합니다. 아래는 해당 코드입니다.

if(axXr1.Layers.AddShapeMapLayer("lyr", "d:/_/ecl_cadastral.shp"))
{
    axXr1.WaitForAllConnections();

    axXr1.Labels.AddLabel("lyr", "{label}");
    
    var label = axXr1.Labels.GetLabel("lyr", "{label}");

    label.Rotate.Enable = true; // <회전을 위해 반드시 지정해야 함>
    label.Rotate.Angle = 90; // <회전값, 단위: Degree>
    label.Effect.Enable = true; // <회전을 위해 반드시 지정해야 함>
    label.Effect.OutlineEnable = true;
    label.Effect.OutlineColor = RGB(255, 255, 255);
    label.Effect.OutlineWidth = 3;
    label.Font.Bold = true;
    label.Font.Color = RGB(0, 0, 0);
    label.Font.Size = 16;

    axXr1.ZoomFullExtent();
    axXr1.MapScale = 2500;
    axXr1.MouseMode = XrMapLib.XrMapViewModeEnum.XrPanMode;
    axXr1.Update();
}

위의 코드는 모든 라벨의 텍스트를 일정하게 90도로 회전하는 코드인데요. 아래는 위의 코드에 대한 실행 결과입니다.

위의 코드가 지원되는 DuraMap-Xr의 버전은 3.9.8.4입니다. 듀라맵의 최선 버전은 http://www.gisdeveloper.co.kr/?p=4760 에서 다운로드 받을 수 있는 설치관리자 프로그램을 이용해 간단히 설치할 수 있습니다.

pl/pgsql을 이용한 테이블 업데이트(Update)

기존의 테이블에 새로운 필드를 추가하고, 이 필드에 값을 넣어야 할 필요가 있습니다. 상황은 지적도가 저장된 테이블의 PNU 필드를 파싱해서 번지값을 만들어 저장해야 합니다. 예를 들어서 PNU가 ‘2911011200200470001’라면 ’47-1산’으로 만들어야 한다는 것입니다.

사용하는 데이터베이스가 PostgreSQL이므로 pl/pgsql을 이용하였는데요. cursor를 이용하는 방식과 cursor를 이용하지 않는 방식이 있는데.. 먼저 cursor를 이용하지 않는 방식은 아래와 같습니다.

DO $$
DECLARE
    r RECORD;
    n1 INTEGER;
    n2 INTEGER;
    s TEXT;
    v TEXT;
BEGIN
    FOR r IN SELECT * FROM ecl_cadastral LOOP
        n1 = substr(r.pnu, 12, 4)::INTEGER;
        n2 = substr(r.pnu, 16, 4)::INTEGER;
        s = substr(r.pnu, 11, 1);
        
        IF n2 = 0 THEN
            v = n1;
        ELSE
            v = n1 || '-' || n2;
        END IF;

        IF s = '2' THEN
            v = v || '산';
        END IF;

        UPDATE ecl_cadastral SET label = v WHERE fid = r.fid;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

동일한 기능으로 cursor를 이용하는 방식은 아래와 같습니다.

DO $$
DECLARE
    c CURSOR FOR SELECT * FROM ecl_cadastral;
    r RECORD;
    n1 INTEGER;
    n2 INTEGER;
    s TEXT;
    v TEXT;
BEGIN
    FOR r IN c LOOP
        n1 = substr(r.pnu, 12, 4)::INTEGER;
        n2 = substr(r.pnu, 16, 4)::INTEGER;
        s = substr(r.pnu, 11, 1);
        
        IF n2 = 0 THEN
            v = n1;
        ELSE
            v = n1 || '-' || n2;
        END IF;

        IF s = '2' THEN
            v = v || '산';
        END IF;

        UPDATE ecl_cadastral SET label = v WHERE CURRENT OF c;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

속도는 cursor를 이용하는 방식이 약 20% 정도 빨랐습니다.