본 페이지에서는 지도의 마우스 모드를 높이 측정 모드로 변경한 후 클릭한 지점의 측정 결과를 JSPoint로 가시화 하는 과정에 대하여 알아봅니다.
해발고도와 지면고도
높이는 기준점에 따라 해발고도, 지면고도 값이 주로 쓰입니다.
해발고도 : 해수면을 기준으로 측정한 높이
지면고도 : 지면을 기준으로 측정한 높이
본 샘플 코드에서는 지면을 클릭한 경우 해발고도 값을, 건물이나 기타 시설물을 클릭한 해발고도 값과 지면고도 값을 함께 표시하도록 구성하였습니다.
위 기능을 구현하는 전체 코드입니다.
//* 엔진 로드 후 실행할 초기화 함수(Module.postRun) */functioninit() {// 엔진 초기화 API 호출(필수)Module.Start(window.innerWidth,window.innerHeight);// 카메라 위치 설정Module.getViewCamera().setLocation(newModule.JSVector3D(126.92836647767662,37.52439503321471,1000.0));// 아이콘 관리 심볼 생성GLOBAL.Symbol =Module.getSymbol();// 분석 출력 POI 레이어 생성var layerList =newModule.JSLayerList(true);GLOBAL.Layer =layerList.createLayer("MEASURE_POI",Module.ELT_3DPOINT);GLOBAL.Layer.setMaxDistance(20000.0);GLOBAL.Layer.setSelectable(false);Module.XDEMapCreateLayer("facility_build","http://xdworld.vworld.kr:8080",8080,true,true,false,9,0,15);initEvent(Module.canvas);}varGLOBAL= { Symbol :null,// 아이콘 관리 심볼 객체 Layer :null,// POI 저장 레이어 nIndex :0// POI, Icon 생성 인덱스};/* 이벤트 설정 */functioninitEvent(canvas) {// 거리측정 이벤트 설정canvas.addEventListener("Fire_EventAddAltitudePoint",function(e){createPOI(newModule.JSVector3D(e.dLon,e.dLat,e.dAlt),"rgba(10, 10, 0, 0.5)",e.dGroundAltitude,e.dObjectAltitude ); });}/* 마우스 상태 변경 */functionsetMouseState(_option){// 마우스 모드 설정Module.XDSetMouseState(_option);}/* 분석 내용 출력 POI 생성 */functioncreatePOI(_position, _color, _value, _subValue) {// POI 아이콘 이미지를 그릴 Canvas 생성var drawCanvas =document.createElement('canvas');drawCanvas.width =200;drawCanvas.height =100;// 아이콘 이미지 데이터 반환var imageData =drawIcon(drawCanvas, _color, _value, _subValue), nIndex =GLOBAL.nIndex ;// 심볼에 아이콘 이미지 등록if (GLOBAL.Symbol.insertIcon("Icon"+nIndex, imageData,drawCanvas.width,drawCanvas.height)) {// 등록한 아이콘 객체 반환var icon =GLOBAL.Symbol.getIcon("Icon"+nIndex);// JSPoint 객체 생성var count =GLOBAL.Layer.getObjectCount(), poi =Module.createPoint("POI"+nIndex) ;poi.setPosition(_position); // 위치 설정poi.setIcon(icon); // 아이콘 설정// 레이어에 오브젝트 추가GLOBAL.Layer.addObject(poi,0);// 인덱스 값 상승GLOBAL.nIndex++; }}/* 아이콘 이미지 데이터 반환 */functiondrawIcon(_canvas, _color, _value, _subValue) {// 컨텍스트 반환 및 배경 초기화var ctx =_canvas.getContext('2d'), width =_canvas.width, height =_canvas.height ;ctx.clearRect(0,0, width, height);// 배경과 높이 값 텍스트 그리기if (_subValue ==-1) {drawRoundRect(ctx,50,20,100,20,5, _color); // 오브젝트 높이 값이 유효하지 않는 경우 } else {drawRoundRect(ctx,50,5,100,35,5, _color); // 오브젝트 높이 값이 유효한 경우setText(ctx, width*0.5, height*0.2,'지면고도 : '+setKilloUnit(_subValue,0.001,0)); }setText(ctx, width*0.5, height*0.2+15,'해발고도 : '+setKilloUnit(_value,0.001,0));// 위치 표시 점 그리기drawDot(ctx, width, height);returnctx.getImageData(0,0,_canvas.width,_canvas.height).data;}/* 위치 표시 점 그리기 */functiondrawDot(ctx, width, height) {ctx.beginPath();ctx.lineWidth =6;ctx.arc(width*0.5, height*0.5,2,0,2*Math.PI,false);ctx.closePath();ctx.fillStyle ='rgba(255, 0, 0, 0.8)';ctx.fill();ctx.lineWidth =8;ctx.strokeStyle ="rgba(255, 255, 0, 0.8)";ctx.stroke();}/* 둥근 사각형 배경 그리기 */functiondrawRoundRect(ctx, x, y, width, height, radius, color) {if (width <2* radius) { radius = width *0.5; }if (height <2* radius) { radius = height *0.5; }ctx.beginPath();ctx.moveTo(x+radius, y);ctx.arcTo(x+width, y, x+width, y+height, radius);ctx.arcTo(x+width, y+height, x, y+height, radius);ctx.arcTo(x, y+height, x, y, radius);ctx.arcTo(x, y, x+width, y, radius);ctx.closePath();// 사각형 그리기ctx.fillStyle = color;ctx.fill();return ctx;}/* 텍스트 그리기 */functionsetText(_ctx, _posX, _posY, _strText) {_ctx.font ="bold 12px sans-serif";_ctx.textAlign ="center";_ctx.fillStyle ="rgb(255, 255, 255)";_ctx.fillText(_strText, _posX, _posY);}/* m/km 텍스트 변환 */functionsetKilloUnit(_text, _meterToKilloRate, _decimalSize){if (_decimalSize <0){ _decimalSize =0; }if (typeof _text =="number") {if (_text <1.0/(_meterToKilloRate*Math.pow(10,_decimalSize))) { _text =_text.toFixed(1).toString()+'m'; } else { _text = (_text*_meterToKilloRate).toFixed(2).toString()+'㎞'; } }return _text;}/* 분석 내용 초기화 */functionclearAnalysis() {var layer =GLOBAL.Layer, symbol =GLOBAL.Symbol;if (layer ==null) {return; }// 등록된 아이콘 리스트 삭제var i, len, icon, poi;for (i=0, len=layer.getObjectCount(); i<len; i++) { poi =layer.keyAtObject("POI"+i); icon =poi.getIcon();// 아이콘을 참조 중인 POI 삭제layer.removeAtKey("POI"+i);// 아이콘을 심볼에서 삭제symbol.deleteIcon(icon.getId()); }// POI, Icon 키 지정 인덱스 초기화GLOBAL.nIndex =0;}
이어서 코드의 세부 단계에 대해 알아봅니다.
Global 변수
기능을 구현하기 전 전역으로 사용하는 변수를 선언한 부분입니다.
varGLOBAL= { Symbol :null,// 아이콘 관리 심볼 객체 Layer :null,// POI 저장 레이어 nIndex :0// POI, Icon 생성 인덱스};
var layerList =newModule.JSLayerList(true);GLOBAL.Layer =layerList.createLayer("MEASURE_POI",Module.ELT_3DPOINT);GLOBAL.Layer.setMaxDistance(20000.0);GLOBAL.Layer.setSelectable(false);
functiondrawIcon(_canvas, _color, _value, _subValue) {// 컨텍스트 반환 및 배경 초기화var ctx =_canvas.getContext('2d'), width =_canvas.width, height =_canvas.height ;ctx.clearRect(0,0, width, height);// 배경과 높이 값 텍스트 그리기if (_subValue ==-1) {drawRoundRect(ctx,50,20,100,20,5, _color); // 오브젝트 높이 값이 유효하지 않는 경우 } else {drawRoundRect(ctx,50,5,100,35,5, _color); // 오브젝트 높이 값이 유효한 경우setText(ctx, width*0.5, height*0.2,'지면고도 : '+setKilloUnit(_subValue,0.001,0)); }setText(ctx, width*0.5, height*0.2+15,'해발고도 : '+setKilloUnit(_value,0.001,0));// 위치 표시 점 그리기drawDot(ctx, width, height);returnctx.getImageData(0,0,_canvas.width,_canvas.height).data;}