FingerEyes-Xr을 이용한 HeatMap 시각화

웹 GIS 엔진인 FingerEyes-Xr은 밀도도를 시각화하기 위한 방법 중의 하나인 HeatMap 기능을 제공합니다. 바로 Xr.layers.HeatMapLayer 클래스를 통해 수행이 가능합니다. HeatMap이 아닌 또 다른 밀도도에 대한 시각화 방법은 Xr.layers.GridLayer 클래스를 사용하는 것인데, Xr.layers.GridLayer는 셀 기반의 연산을 이용해 밀도도 분석을 수행합니다. 좀더 정밀한 밀도도 분석은 Xr.layers.GridLayer이 Xr.layers.HeatMapLayer보다 우수하지만 연산 시간은 Xr.layers.HeatMapLayer가 훨씬 빨라 실시간으로 밀도도를 시각화할 수 있다는 장점을 갖습니다.

아래의 영상은 FingerEyes-Xr의 Xr.layers.HeatMapLayer를 사용하여 생성된 밀도도입니다.

이에 대한 코드는 다음처럼 간단 명료합니다.

let heatMapLayer = map.layers('heatmap');
if (!heatMapLayer) {
    heatMapLayer = new Xr.layers.HeatMapLayer('heatmap');
    map.layers().add(heatMapLayer);
}
            
heatMapLayer.generateByLayer(lyr);

밀도도 분석을 위한 입력 데이터로 공간상에 분포된 포인트 좌표들이 필요하며, 이 포인트 좌표는 7번 코드의 lyr 변수명의 레이어를 통해 입력됩니다.

Xr.layers.HeatMapLayer는 밀도도 분석이 매우 빨라 실시간으로 밀도도를 생성할 수 있습니다. 아래의 코드는 입력 데이터가 변경되는 즉시 밀도도를 새롭게 생성해 표시합니다.

map.addEventListener(Xr.Events.LayerUpdateCompleted, function (e) {
    if (e.layerName === lyr.name()) {
        let heatMapLayer = map.layers('heatmap');
        if (heatMapLayer) {
            heatMapLayer.generateByLayer(lyr); 
        }
    }
});

끝으로 보다 정밀한 밀도도를 생성하기 위한 또다른 방식인 Xr.layers.GridLayer에 대한 실제 활용예는 아래의 글을 참고하기 바랍니다.

NexGen, 공간 데이터의 분포경향 분석을 위한 밀도맵 기능

GIS 서버, GeoService-Xr이 티맥스의 티베로 DBMS를 지원합니다.

티베로는 티맥스소프트의 자회사인 티맥스데이터(TmaxData)에서 개발한 국산 DBMS로 오라클과 견줄 수 있는 소프트웨어입니다. 오라클과의 호환성이 높아 최소한의 변경으로도 DBMS 전환이 가능하며 오라클의 RAC 기능으로 그간 독점해온 DB 클러스터 기술을 성공시킨 세계에서 두번째 제품이라고 합니다.

이러한 티베로(Tibero)를 GeoService-Xr에서 지원합니다. 티베로에 저장된 공간 데이터에 대한 시각화, 공간 데이터 편집, 다양한 공간 조회 기능 등을 기본으로 제공하며 아래 그림에서의 기능을 티베로와 연계하여 제공할 수 있습니다. GeoService-Xr은 GIS 서버로써의 기본 기능 이외에도 GIS 시스템 및 서비스 구축을 위해 필요한 지오코딩, 10 Parameters 기반의 좌표 변환, 지도 기반 사용자 대화 기능, 대용량 공간 데이터 업로드 등과 같은 기능을 제공하는 미들웨어 서버로 GS인증 1등급 제품입니다.

FingerEyes-Xr에서 SHP 파일 자원을 외부 URL로 접근해 사용하기

예를 들어, http://www.gisdeveloper.co.kr:8080/SHP/seoul.zip와 같은 URL 경로로 접근할 수 있는 SHP 파일 자원을 웹 지도 컴포넌트인 FingerEyes-Xr에서 어떻게 가져와 지도를 구성하는 레이어로 사용하기 위한 코드를 정리합니다. zip 파일에는 반드시 .shp, .dbf, .shx 파일이 있어야 합니다.

let map = ...

let layerName = "레이어의 고유한 이름";
let URL = "http://www.gisdeveloper.co.kr:8080/SHP/seoul.zip";
let layer = new Xr.layers.SHPFileLayer(layerName, URL);

layer.EPSG(map.EPSG());
layer.proj4Name("EPSG:5179");

map.layers().add(layer, function () {
    map.updateLayer(layerName);
});

위의 코드에서 7번은 배경지도에 대한 좌표계의 EPSG 코드이며, 8번은 해당 shp 파일의 좌표계에 대한 EPSG 코드입니다.

아래의 글은 FingerEyes-Xr에서 사용자의 PC에 저장된 SHP 파일 자원 웹에서 활용하는 기능에 대한 설명입니다. URL을 통한 접근은 아니지면, 그 기반은 동일합니다.

NexGen, 웹 GIS에서 로컬 데이터 파일 활용

DBMS에서 ST_EXTENT 함수를 제공하지 않을 경우의 대안

PostgreSQL 등과 같은 공간 DB에서는 ST_EXTENT를 지원하지만, 오라클이나 티베로 등과 같은 DBMS에서는 이 함수를 제공하지 않습니다. 다행이 오라클은 SDO_AGGR_MBR라는 함수를 제공함으로써 ST_EXTENT 대신 사용할 수 있습니다. (최근의 오라클은 ST_EXTENT를 지원할지도 모르겠습니다) 그러나 오라클처럼 자체적인 함수 조차도 지원하지 않는 티베로와 같은 경우 사용할 수 있는 대안은 다음과 같습니다.

SELECT * 
FROM 
    (SELECT * FROM (SELECT ST_MINX(the_geom) MinX FROM TSTTABLE ORDER BY ST_MINX(the_geom) ASC) WHERE ROWNUM = 1 ), 
    (SELECT * FROM (SELECT ST_MAXX(the_geom) MaxX FROM TSTTABLE ORDER BY ST_MAXX(the_geom) DESC) WHERE ROWNUM = 1),
    (SELECT * FROM (SELECT ST_MINY(the_geom) MinY FROM TSTTABLE ORDER BY ST_MINY(the_geom) ASC) WHERE ROWNUM = 1),
    (SELECT * FROM (SELECT ST_MAXY(the_geom) MaxY FROM TSTTABLE ORDER BY ST_MAXY(the_geom) DESC) WHERE ROWNUM = 1);

대상 테이블의 이름은 TSTTABLE이고 Geometry 필드는 the_gem입니다. 결과의 예는 다음과 같습니다.

위의 쿼리는 티베로에서 실행한 결과입니다. 위처럼 하나의 Row로 결과를 얻을 수도 있지만 MinX, MaxX, MinY, MaxY 각각을 하나의 Row로 얻을 수도 있습니다. 아래처럼요.

SELECT * FROM (SELECT ST_MINX(the_geom) FROM TSTTABLE  ORDER BY ST_MINX(the_geom) ASC) WHERE ROWNUM = 1 
UNION SELECT * FROM (SELECT ST_MAXX(the_geom) FROM TSTTABLE  ORDER BY ST_MAXX(the_geom) DESC) WHERE ROWNUM = 1
UNION SELECT * FROM (SELECT ST_MINY(the_geom) FROM TSTTABLE  ORDER BY ST_MINY(the_geom) ASC) WHERE ROWNUM = 1
UNION SELECT * FROM (SELECT ST_MAXY(the_geom) FROM TSTTABLE  ORDER BY ST_MAXY(the_geom) DESC) WHERE ROWNUM = 1;

참고로 이 대안들은 속도가 느립니다. 테이블에 데이터가 개수가 많을 수록 그 속도는 더욱 느려집니다. 그러므로 해당 DBMS에서 ST_EXTENT를 제공한다면, ST_EXTENT를 사용해야 하며 ST_EXTENT를 지원하지 않는다면 해당 DBMS에서 자체적인 방법을 제공하는지 확인하여 그 방법을 사용해야 합니다. 자체적인 방법까지도 없다면 위의 대안을 사용할 수 있습니다.