FingerEyes-Xr for HTML5와 GeoService-Xr를 활용한 설비 공간정보시스템

특화된 GIS 시스템 개발을 견고하고 빠르게 개발할 수 있는 GIS 엔진으로써, FingerEyes-Xr과 GeoService-Xr을 활용해 설비를 관리하는 GIS 시스템을 개발하고 있습니다.

다양한 기능 중 웹에서 공간 데이터를 SHP 파일로 바로 내보내기하여 저장할 수 있는 기능에 대해 소개합니다.

공간서버인 GeoService-Xr이 접근(Access)하는 공간 데이터가 저장된 DBMS로부터 SHP 파일을 다운로드할 수 있는 방법은 단지 URL의 호출만으로 이루어집니다. 즉, 공간 데이터에 대한 레이어의 고유 식별자가 ecl_alts_main이라고 하고, SHP 파일로 저장할 영역의 범위를 MBR로써, 각각 MinX, MinY, MaxX, Max라고 한다면 아래의 URL을 호출하면 SHP 파일을 압축 파일로 바로 다운로드 받을 수 있습니다.

http://localhost/Xr?gdownload|ecl_alts_main|MinX|MinY|MaxX|MaxY

아래의 화면은 SHP 파일을 저장하는 기능에 대한 실제 화면입니다. 레이어를 관리하는 UI에서 바로 원하는 레이어를 SHP 파일이나 KML로 저장할 수 있도록 하였습니다.

위의 UI 중 SHP 파일로 저장하기 원하는 레이어 명 옆의 SHP 버튼을 클릭하면 아래와 같이 웹브라우저에서 흔히 볼 수 있는 다운로드가 시작됩니다.

다운로드를 위한 URL 호출을 통해 클라이언트 측에 다운로드를 받기 위해 JavaScript 코드를 간단히 설명하겠습니다. 먼저 주요 줄기를 언급하면 iframe의 src 속성에 url을 지정하면 되는데요. 이를 위해서 해당 웹 페이지에 다음과 같이 숨겨진 iframe을 추가합니다.

var iframe = $('');
iframe.appendTo(this._containerDiv);

그리고 SHP 파일을 저장하는 버튼에 대한 클릭 이벤트에 다음과 같은 코드가 필요합니다.

function onDownloadSHPClick(event) {
    var layerId = $(this).attr('layerId');
    var cm = g_map.coordMapper();
    var mbr = cm.viewportMBR();
    var iframe = $("#downloadFrame");
    var url = mg_MapLayers.GIS_HTTP_SERVER + '/Xr?gdownload|' + layerId + '|' + mbr.minX + '|' + mbr.minY + '|' + mbr.maxX + '|' + mbr.maxY;
    
    iframe.attr("src", url);

위의 코드 중 실제 의미 있는 부분은 5~8번 코드입니다.

이상으로 FingerEyes-Xr과 GeoService-Xr을 이용하여 GIS 시스템에서 공간 데이터를 바로 SHP 파일로 저장할 수 있는 기능과 JavaScript 코드에 대해 살펴 보았습니다.

[GIS] FingerEyes-Xr for HTML5 ㅡ Code로 GraphicLayer에 마커 추가하기

FingerEyes-Xr은 그래픽 레이어를 통해 지도 상의 원하는 위치에 다양한 그래픽 요소를 추가해 표현할 수 있는데요. 이와 관련된 API를 정리해 봅니다. 그래픽 요소를 추가하기 위해서 그래픽 레이어가 하나 필요합니다. 아래의 코드를 통해 그래픽 레이어를 추가합니다.

var gfxLyr = new Xr.layers.GraphicLayer("g");
map.layers().add(gfxLyr);

그래픽 레이어의 이름을 ‘g’로 하여 이 이름을 통해 그래픽 레이어 객체를 얻을 수 있습니다. 이 그래픽 레이어에 마커를 3개 추가할 것인데요. 아래의 코드처럼 마커를 추가하는 함수를 만들어 사용하겠습니다.

function addPoint(gl, id, x, y, imgUrl) {
    var rs = gl.rowSet();
    var p = new Xr.PointD(x, y);
    var psd = new Xr.data.PointShapeData(p);
    var pgr = new Xr.data.PointGraphicRow(id, psd);
    var ims = new Xr.symbol.ImageMarkerSymbol({
        width: 48, height: 48,
        url: imgUrl
    });

    pgr.markerSymbol(ims);

    rs.add(pgr);
}

위의 addPoint 함수는 총 5개의 인자를 받습니다. 첫번째 gl은 그래픽 레이어 객체이고, id는 추가할 마커 그래픽 요소의 id값이며, x와 y는 마커가 위치할 좌표.. 끝으로 imgUrl은 마커를 지도 상에 표시할때 어떤 이미지로 표시할지에 대한 이미지 URL에 대한 문자열입니다. 이제 다음 코드처럼 3개의 마커 그래픽 요소를 추가할 수 있습니다. 아래의 코드는 버튼의 이벤트 함수 안이나.. DB 서버로부터 어떤 조회가 완료되었을 때 호출되는 함수에 위치하면 될 것입니다.

var gl = map.layers("g");

addPoint(gl, 0, 938085, 1671020, "http://www.gisdeveloper.co.kr/images/pikachu.png");
addPoint(gl, 1, 938185, 1671020, "http://www.gisdeveloper.co.kr/images/pokeball.png");
addPoint(gl, 2, 938285, 1671020, "http://www.gisdeveloper.co.kr/images/weedle.png");

map.coordMapper().moveTo(938185, 1671020).zoomByMapScale(4000);

map.update();

이제 실행하면 다음 화면처럼 이미지 마커가 3개 표시된 것을 볼 수 있습니다.

여기서 좀더 진행해.. 이제 위의 3개의 마커를 클릭했을 때 정보창을 표시하도록 하겠습니다. 지도의 클릭 이벤트를 아래처럼 등록하는데요. 지도에 대한 map 객체를 얻어 온 코드 다음에 아래의 코드가 있으면 됩니다.

map.addEventListener(Xr.Events.MapClick, onMapClick);

이제 지도를 클릭할 때 onMapClick 함수가 호출되는데요. onMapClick 함수는 아래와 같습니다.

function onMapClick(e) {
    var gl = map.layers("g");
    var ids = gl.IdByMousePoint(e.viewX, e.viewY, true); // bOnlyOne
    var cntIds = ids.length;

    if(cntIds == 1) {
        var id = ids[0];
        var row = gl.rowSet().row(id);
        var ims = row.markerSymbol();
        var url = ims.url();

        gl.hilighting(id);

        var content = "";

        var infoWin = new Xr.ui.InfoWindowControl("iwc", map,
            new Xr.PointD(e.mapX, e.mapY), content, {  });

        map.userControls().remove("iwc");
        map.userControls().add(infoWin);
    }
}

3번 코드에서 IdByMousePoint 함수의 3번째 인자는 클릭 지점에 여러개의 그래픽 요소를 발견했다고 해도, 단 하나만을 얻겠다는 의미입니다. 이제 실행하고 지도 상에 표시된 마커 그래픽을 클릭하면 다음과 같은 결과를 볼 수 있습니다.

사용자 삽입 이미지

[FingerEyes-Xr for HTML5] 여러 개의 필드 값으로 라벨 문자열 표시하기

예를 들어, 필드 이름이 fieldNm1과 fieldNm2인 2개의 필드값을 조합하여 라벨로 표시 하고자할때에 해당 레이어의 라벨의 포맷터(Formatter)에 Custom Formatter를 만들어 지정해 주면 됩니다. 아래의 코드는 수치지도 레이어에 사용자 정의 포맷터를 지정한 코드 예입니다.

var lyr = lm.layer('layerNm'); // 이름이 layerNm인 레이어에 대해서 ...
if (lyr) {
    var label = lyr.label();

    label.enable(true); //.offsetY(20);
    label.visibility().visibleByScale(true).fromScale(0).toScale(3000);

    // 사용자 정의 포맷터 클래스 정의
    CustomLabelFormatter = Xr.Class({
        name: 'CustomLabelFormatter',
        extend: Xr.label.ProgrammableLabelFormatter,
        requires: [Xr.label.ILabelFormatter],

        construct: function (/* ShapeMapLayer */ layer) {
            this.superclass(layer);
            this._fieldIndex1 = -1;
            this._fieldIndex2 = -1;
        },

        methods: {
            /* string */ value: function (/* ShapeRow */ shapeRow,
                    /* FieldSet */ fieldSet, /* AttributeRow */ attributeRow) {
                if (this._fieldIndex1 == -1) {
                    this._fieldIndex1 = fieldSet.fieldIndex('fieldNm1');
                }

                if (this._fieldIndex2 == -1) {
                    this._fieldIndex2 = fieldSet.fieldIndex('fieldNm2');
                }

                var value1 = attributeRow.valueAsString(this._fieldIndex1);
                var value2 = attributeRow.valueAsString(this._fieldIndex2);

                return value1 + '(' + value2 + 'kW)';
            }
        }
    });

    var formatter = new CustomLabelFormatter(lyr);
    label.formatter(formatter);

    var labelTheme = label.theme();
    labelTheme.symbol().strokeColor('#ffffff').strokeWidth(3).size(10)
        .fontFamily('맑은 고딕').color('#0000ff').weight('600');
}

위의 경우 fieldNm1 필드값이 ‘아궁이’이고 fieldNm2 필드값이 ‘1000’일 경우, ‘아궁이(1000kW)’의 문자열로 라벨이 표시된다.

[GIS] FingerEyes-Xr for Flex의 편집 기능을 위한 API 설명

FingerEyes-Xr for Flex에서 DBMS에 저장되어 있는 공간 데이터를 마우스를 이용해 사용자가 편집하는 기능을 구현하기 위한 API를 설명하는 문서입니다. DBMS에 저장되어 있는 공간 데이터의 정점을 편집할 수 있도록, 기존 정점을 이동하거나 삭제하고 새로운 정점을 추가하는 기능과 새로운 공간 도형을 생성하고 기존 도형을 삭제하는 기능을 구현하는 튜토리얼 형태의 문서입니다. 또한 편집 이력에 대한 Undo와 Redo에 대한 기능도 설명합니다.

사용자 삽입 이미지

위의 그림은 편집 기능에 대한 API 설명 문서 내용 전반에서 언급하고 있는 예제 화면입니다. 편집 기능에 대한 API 문서는 아래 URL을 통해 다운로드 받을 수 있습니다.

FingerEyes-Xr for Flex에서 편집이 가능한 공간 데이터는 Oracle, MSSQL Server, PostgreSQL와 같은 DBMS에 저장하여 처리될 수 있습니다.