GeoService-Xr에서 동적으로 GeoData 추가 및 삭제하기

GeoService-Xr은 공간 데이터를 GeoData라는 단위로 처리합니다. 정확하게 일치하지는 않으나 GeoData는 GIS의 Layer와 매우 유사합니다. GeoData를 새롭게 추가하거나 삭제하기 위해서는 일단 GeoService-Xr의 실행을 중지시키고 geodata.xml 파일을 통해 GeoData를 수정한 후 다시 GeoService-Xr을 재기동시킵니다. 그러나 간혹 geodata.xml 파일의 수정이 아닌 GeoService-Xr의 실행 중에 GeoData를 추가 도는 삭제가 가능합니다.

아래는 추가되어진 GeoData를 삭제하는 RestAPI 명령의 한가지 예 입니다.

http://localhost/Xr?rmGD|muan_parc_a

위의 rmGD가 ‘remove GeoData’ 명령이고 muan_parc_a가 제거하고자 하는 GeoData 식별자입니다.

아래는 새로운 GeoData를 추가하는 RestAPI 명령의 한가지 예 입니다.

http://localhost/Xr?addGD|muan_parc_a|muan_db://public."parc_a"|5186

addGD가 ‘add GeoData’ 명령이고, muan_parc_a가 GeoData의 식별자이며 muan_db://public.”parc_a”가 DBMS의 식별자(muan_db)와 테이블명(public.”parc_a”)로 지정되는 추가하고자 하는 공간 데이터 Table입니다.

이처럼 동적으로 GeoData를 추가하고 삭제하는 기능을 통해 웹 기반에서, GIS 시스템에서 유연하게 공간데이터를 핸들링할 수 있는 기반을 제공하게 됩니다.

MySQL, MariaDB의 INSERT INTO … ON DUPLICATE KEY UPDATE …

MySQL(MariaDB)에서 동일한 Key 값이 이미 존재한다면 UPDATE 문을 호출하여 기존의 Row의 값을 변경하고, 동일한 Key 값을 가진 Row가 없다면 INSERT를 호출하는 SQL 문의 예입니다.

INSERT INTO 
    current_load_powerfactor 
    (ref_mRID, update_timeStamp, value) 
VALUES
    ("_1e1ccab5-250a-44a3-89d8-177e2d53e071", NOW(), 99) 
ON DUPLICATE KEY UPDATE 
    update_timeStamp=NOW(), value=99

위의 SQL은 current_load_powerfactor라는 테이블에 대해서, Primary Key로 잡힌 ref_mRID가 중복된 이미 존재하는 Row가 있다면, 중복된 Row의 값을 변경(UPDATE 문 실행)하고, 중복된 Row가 없다면 새로운 Row를 추가(INSERT)하라는 내용입니다.

NexGen으로 출력한 PDF 결과물

공개소프트웨어인 웹 기반의 GIS 시스템인 NexGen에서 출력한 PDF 파일입니다.

넥스젠은 웹 기반의 여타 다른 웹 GIS 시스템과 다르게 수치지도에 대한 출력은 Vector 기반으로 출력함으로써 아무리 확대를 해도 도형 데이터가 깔끔하게 표시됩니다. 이러한 장점을 십분 활용하여 플로터 등과 같은 지도 출력 장비를 활용하여 고품질의 지도를 출력할 수 있습니다.

아래의 파일은 넥스젠에서 출력한 PDF 파일 원본입니다.

NexGen 지리정보 공개소프트웨어 – 경사도, 단면도 측정 기능

넥스젠(NexGen) 지리정보 시스템은 GIS의 가장 기반이 되는 기능을 기본적으로 갖추고 있는 공개소프트웨어입니다. 넥스젠이 활용하는 공간 데이터는 이미 국가차원에서 공개하고 있는 DB로써 누구나 쉽게 획득할 수 있는 영상과 지형도, 지적도, 표고 데이터인 DEM을 활용하고 있습니다.

넥스젠은 (주)지오서비스에서 개발하고 공개한 웹 GIS 엔진인 FingerEyes-Xr for HTML5을 활용하여 (주)내가시스템과 함께 개발하였습니다. 참고로 (주)내가시스템은 GIS를 활용한 하수설비관리시스템과 하천관리시스템 분야에서 독보적인 기술력은 갖춘 회사입니다.

넥스젠이 제공하는 GIS의 기본기능은 지적주소 기반의 주소검색, 도로명주소 기반의 주소검색, 지오코딩, 레이어 관리, 그래픽 요소 매쉬업, 거리측정, 면적측정, 레이어 관리, 각 레이어에 대한 SHP 파일 내보내기, 경사도와 단면도 측정 기능 등입니다. 이 글은 넥스젠의 기본 기능 중 경사도와 단면도를 측정하는 기능을 소개합니다.

먼저 아래의 실행화면은 지형의 단면도를 측정한 화면입니다.

시스템 화면에 대한 아이콘은 실제 적용 사이트의 특색에 맞게 디자인 하도록 유도하기 위해 확정되지 않았습니다. 지형의 단면도를 측정하기 위해서는 표고 데이터인 DEM 이 필요합니다. 빠른 기능 실행을 위해 서비스에 최적화된 포맷으로 재가공되어 수십, 수백 km 거리의 지형 단면도에 대한 측정에도 빠르게 그 결과를 사용자에게 제공합니다.

다음은 평균경사도를 측정하는 화면입니다.

평균경사도는 인허가 업무에 매우 중요한 변수인데요. 관련 법률에 따라 특정 경사도 이하에서만 인허가 승인이 결정되기 때문입니다.

이번 글에서는 넥스젠의 기본기능 중 2가지에 대해서만 소개했는데요. 추후 기회가 있다면 다른 기능도 소개하도록 하겠습니다.

공개소스트웨어인 넥스젠은 이미 개발되어진 기본 기능 위에 사용자가 필요로 하는 기능을 추가할 수 있도록 설계된 웹 기반의 GIS 소프트웨어입니다.

넥스젠에 대한 다른 기능에 대한 실제 시연을 보고자 하시는 분은 메일(hjkim@geoservice.co.kr)을 통해 문의해 주시면 됩니다.

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 에서 다운로드 받을 수 있는 설치관리자 프로그램을 이용해 간단히 설치할 수 있습니다.