LoadMap 에서 geojson 을 이용하여 feature 를 생성할 때, 지역별로 스타일 속성(Fill, Line) 을 추가할 수 있습니다. 사용 예제▶ 메인 보고서 Script데이터 테이블을 매개변수로 전달합니다. loadMap 함수를 아래와 같이 수정합니다. /* geoJson 레이어 추가 */
this.loadMap = function(level){
if(!level){
var gidValue = [];
if(Matrix.getObject('CheckBox').Checked){
gidValue.push(Matrix.getObject('CheckBox').CheckedValue);
}
if(Matrix.getObject('CheckBox1').Checked){
gidValue.push(Matrix.getObject('CheckBox1').CheckedValue);
}
Matrix.SetGlobalParams("VS_GID_1" ,gidValue.toString());
}else {
Matrix.SetGlobalParams("VS_GID_1" ,'');
}
Matrix.SetGlobalParams("VS_GID_0" ,'KOR');
addGeoJsonWithStyle();
// 스타일 속성을 가진 데이터소스를 실행한 뒤에 addDomesticGeoJson 호출
function addGeoJsonWithStyle(){
Matrix.Execute('DS_COLOR', function(p){
if(p.Success == false){
Matrix.Alert(p.Message);
return;
}
var ds = p.DataSet;
var dt = p.DataTable;
closure.map.addDomesticGeoJson(Matrix.getObject('CheckBox2').Checked, dt);
});
}
} |
▶ 스타일 데이터 구조 데이터 테이블은 아래의 구조를 가집니다. Column 명 | Data Type | Default Value | Description |
---|
GID_CODE | string |
| 스타일을 적용할 지역 코드 | FILL_COLOR | string | '#b1c3f9' | feature 의 배경색상 | FILL_OPACITY | number (between 0 and 1) | 0.4 | feature 의 배경 투명도 | LINE_COLOR | string | '#7e9bf6' | feature 의 border 색상 | LINE_OPACITY | number (between 0 and 1) | 0.8 | feature 의 border 투명도 | LINE_WIDTH | number | 1 | feature 의 border 두께 | 
-- DataSource 명 : DS_COLOR
SELECT GID_1 AS GID_CODE
, LABEL AS GEO_NAME
, '#FF8FAB' AS FILL_COLOR
, 0.6 AS FILL_OPACITY
, '#FB6F92' AS LINE_COLOR
, 1 AS LINE_WIDTH
, 0.8 AS LINE_OPACITY
FROM MAP_GEO_1
WHERE 1=1
AND LABEL IN ('서울특별시', '충청북도', '부산광역시') |
▶ UserComponent 보고서 ScriptaddProperty() 함수에서 geojson 의 feature에 스타일 속성을 추가합니다. 아래의 예제 코드는 GID_1 과 매핑하고 있습니다. 필요에 따라 수정해서 사용하실 수 있습니다. addDomesticGeoJson: function(isFit, options){
Matrix.RunScript("" ,"MAP_SERVICE" ,function(p){
if(p.Success == false){
Matrix.Alert(p.Message);
Matrix.DebugWrite('GeoMap', 'refreshMap::'+ p.Message);
return;
}
var geoJson = p.DataSet;
var lastLevel = Matrix.GetGlobalParamValue('VS_G_LAST_FEATURE_LEVEL');
Matrix.RemoveGlobalParams('VS_G_LAST_FEATURE_LEVEL');
if(geoJson.features.length > 0) {
if(options) geoJson = addProperty(geoJson, options); // geoJson 에 속성을 추가해서 전달합니다
IGeoMapComponent.LoadMap(geoJson, isFit);
Matrix.DebugWrite('GeoMap', 'LoadMap::');
}else {
alert('마지막 Level입니다.');
return;
}
});
/*
geoJson 의 Property 에 overlay style 속성을 추가하고 geoJson 을 반환합니다.
@params property DataTable 의 형태로 GID_CODE, FILL_COLOR, FILL_OPACITY, LINE_COLOR, LINE_WIDTH, LINE_OPACITY 의 Column 을 가진다
*/
function addProperty(geoJson, property){
property.Rows.map(function(row){
// geoJson 을 돌면서 속성을 추가합니다.
geoJson.features.forEach(function(feature){
if (feature.properties.GID_1 === row.GetValue('GID_CODE')) { // GID_1 과 매핑
feature.properties.GID_CODE = row.GetValue('GID_CODE');
feature.properties.FILL_COLOR = row.GetValue('FILL_COLOR');
feature.properties.FILL_OPACITY = row.GetValue('FILL_OPACITY');
feature.properties.LINE_COLOR = row.GetValue('LINE_COLOR');
feature.properties.LINE_WIDTH = row.GetValue('LINE_WIDTH');
feature.properties.LINE_OPACITY = row.GetValue('LINE_OPACITY');
}
});
});
return geoJson;
}
}, |
▶ 최종 화면 예시아래의 예시 화면은 KakaoMap 을 이용하였으며, 현재 지원하는 기타 상용 지도(MapboxMap, VWorldMap) 에서도 동일한 결과를 확인할 수 있습니다. |
|
getProjUtil()은 GeoMap Component 의 util 객체에 정의되어 있습니다. Proj 라이브러리를 이용한 Util을 반환합니다.
사용 예제 var projUtil = map.util.getProjUtil();
// 기존 Proj 라이브러리에서 제공하는 좌표계를 반환합니다. 변경을 원하는 좌표계가 아래에 있을 경우 defineNewProjection를 이용해 좌표계를 정의하실 필요가 없습니다.
var predefinedProjections = projUtil.getPreDefinedProjections() // return ['EPSG:4326', 'EPSG:4269', 'EPSG:3857'];
// 예시) EPSG:5181 좌표계의 [37.528, 126.9207]를 변환하고 싶은 경우
// 1. 좌표계 정의
// proj4 문자열 좌표계 정의는 https://epsg.io/5181 를 참고하세요.
projUtil.defineNewProjection("EPSG:5181", "+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +units=m +no_defs")
// 2. 포인트 좌표 변환
var transformedCoordinate = projUtil.transformCoordinate("EPSG:5181", [37.528, 126.9207]); // return [124.84886361842304, 33.47611942468759] |
|
|

getCenterPoint(callback) 은 GeoMap Component 의 util 객체에 정의되어 있습니다. 파라미터 callback 은 각 지역의 정보를 가져온 뒤 실행되는 함수입니다. 자체 알고리즘에 의해 계산한 값이 아닌 SGIS 의 주소경계 API를 이용하여 SGIS에서 제공하는 지리 데이터를 가져오고 있습니다. 현재는 시/도 범위의 중심 좌표만 지원합니다. |
사용 예제 function getCenter(){
map.util.getCenterPoint(function(datas){
// callback function (datas 의 내용은 아래의 결과값을 참고하세요)
var markerInfo = datas.map(function(data){
return {
name: data.name,
lonLat: data.lonLat
}
});
map.addMarker(markerInfo); // 마커로 표시합니다
});
} |
결과값 lonLat: 좌표값 code: SGIS 의 지역 코드 name: 지역 이름 (MAP_GEO_1 테이블의 LABEL 에 해당하는 값과 같습니다) [
{
"lonLat": [
126.97834782835902,
37.56669009036455
],
"code": "11",
"name": "서울특별시"
},
{
"lonLat": [
129.09175563706935,
35.24125634125668
],
"code": "21",
"name": "부산광역시"
},
{
"lonLat": [
128.6226425399308,
35.97347538476608
],
"code": "22",
"name": "대구광역시"
},
{
"lonLat": [
126.70523602351949,
37.45604185708162
],
"code": "23",
"name": "인천광역시"
},
{
"lonLat": [
126.8354459164671,
35.15573674234789
],
"code": "24",
"name": "광주광역시"
},
{
"lonLat": [
127.39405991650911,
36.33980451022681
],
"code": "25",
"name": "대전광역시"
},
{
"lonLat": [
129.23840258289323,
35.55370705798613
],
"code": "26",
"name": "울산광역시"
},
{
"lonLat": [
127.25881030360377,
36.560535581441435
],
"code": "29",
"name": "세종특별자치시"
},
{
"lonLat": [
127.25204502645134,
37.2865873659788
],
"code": "31",
"name": "경기도"
},
{
"lonLat": [
128.17336172923484,
37.8836272925393
],
"code": "32",
"name": "강원특별자치도"
},
{
"lonLat": [
127.53924730130387,
36.73834076972116
],
"code": "33",
"name": "충청북도"
},
{
"lonLat": [
126.71839045797792,
36.67835738574175
],
"code": "34",
"name": "충청남도"
},
{
"lonLat": [
127.10867588676484,
35.820389942968816
],
"code": "35",
"name": "전라북도"
},
{
"lonLat": [
126.67198974055624,
34.814882947753354
],
"code": "36",
"name": "전라남도"
},
{
"lonLat": [
128.75109173106813,
36.4649263768976
],
"code": "37",
"name": "경상북도"
},
{
"lonLat": [
128.16437996516694,
35.42913615877326
],
"code": "38",
"name": "경상남도"
},
{
"lonLat": [
126.48382513785216,
33.40104880413814
],
"code": "39",
"name": "제주특별자치도"
}
] |
|
|
getTurfUtil()은 GeoMap Component 의 util 객체에 정의되어 있습니다. Turf 라이브러리를 이용한 Util을 반환합니다.
사용 예제 var turfUtil = map.util.getTurfUtil();
// 시작점과 끝점을 잇는 곡선을 그립니다. 중간지점을 지정하지 않는 경우 turf 라이브러리의 midpoint 함수를 이용하여 중간지점을 정합니다.
var curveLine = turfUtil.addCurveLine([37.683105,55.751849], [129.078369,35.169318], undefined); // 모스크바와 부산을 잇는 "LineString"인 type의 feature 반환 |
|
|
shp 파일의 형식을 geoJson 으로 바꾸고 AUD 에서 제공하는 지도의 좌표계(WGS84)와 다른 경우에는 좌표계의 변환을 수행합니다. 더욱 자세한 코드를 확인하시려면 geoTools service 불러오기.mtsz를 참고해주세요. (샘플 보고서에서는 mapbox 지도를 사용하고 있습니다.)
- 패치 필요 : 해당 서비스를 이용하기 위해서는 서버에 패치가 필요합니다.
- JDK 11 환경에서 서비스 : 해당 서비스는 JDK 11 환경에서 서비스됩니다. JDK 11 이상의 버전이 아닌 다른 버전에서는 서비스가 제대로 작동하지 않을 수 있습니다.
|
패치 방법 - geomap-1.0.jar을 [CONTEXT_ROOT]/WEB-INF/lib/ 에 위치시켜 주세요.
- 샘플 보고서의 server script 에서 환경에 맞는 경로로 filePath를 수정해 주세요.
사용 예제 /* 서버에서 shp 파일을 geoJson 형식으로 변환하고 좌표계를 WGS84 로 변경하는 함수 */
function convertSHPfile(){
Matrix.RunScript('', 'CONVERT_COORDS', function(p){
if(p.Success == false){
Matrix.Alert(p.Message);
return;
}
var ds = p.DataSet;
closure.map.LoadMap(ds, true); // 변환된 geoJson을 지도에 표시합니다.
});
} |
/* 서버에서 jar 파일을 실행 */
var req = Matrix.getRequest(); /* request */
var res = Matrix.getResponse(); /* response */
var session = Matrix.getSession(); /* session */
var util = Matrix.getUtility(); /* utility */
var fso = Matrix.getFileSystemObject(); /* file access */
try{
Matrix.WriteCustomLog('geoTools', '===== shell command [시작] =====');
// shp file path
var inputFilePath = req.getParam('VS_SHP_PATH');
// geoJson file path
var filePath = 'C:/AUDPlatform_7/matrix/reports/_TEMP_/';
var fileName = util.getUniqueKey('GEO') + '.json';
var outputFilePath = fso.PathCombine(filePath, fileName);
// target 좌표계
var epsgCode = req.getParam('VS_EPSG_CODE');
Matrix.WriteCustomLog('geoTools', '===== shell command [inputFilePath] ===== ' + inputFilePath);
Matrix.WriteCustomLog('geoTools', '===== shell command [outputFilePath] ===== ' + outputFilePath);
/* jar 실행시 필요한 파라미터 */
var cmdArray = [
"C:\\Program Files\\Java\\jdk-11\\bin\\java.exe", // jdk 11 실행 경로
"-jar", // jar 파일 실행 명령어
"C:\\AUDPlatform_7\\matrix\\WEB-INF\\lib\\geomap-1.0.jar", // geomap-1.0.jar 파일 위치
inputFilePath, // .shp 파일의 위치
outputFilePath, // .json 파일의 위치
epsgCode // target 좌표계
];
var result = util.ShellExecute(cmdArray, true);
Matrix.WriteCustomLog('geoTools', '===== shell command [완료] =====');
if(fso.Exists(outputFilePath)){
Matrix.WriteCustomLog('geoTools', '===== read geoJson [시작] =====');
res.WriteResponseTextFile(outputFilePath)
fso.DeleteFile(outputFilePath);
Matrix.WriteCustomLog('geoTools', '===== read geoJson [완료] =====');
}
}catch(e){
Matrix.WriteCustomLog('geoTools', '===== CONVERT_COORDS Error ===== ' + e);
} |
화면 예시 |
|
|