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에서 자체적인 방법을 제공하는지 확인하여 그 방법을 사용해야 합니다. 자체적인 방법까지도 없다면 위의 대안을 사용할 수 있습니다.