33.ActiveX

33.1GoogleMap연동

넥사크로플랫폼에서 GoogleMap연동하는 방법에 대해 기술합니다.

GoogleMap을 사용하는 경우에는 라이선스가 필요합니다.

(고객사에서 서비스 하는 형태에 따라 라이선스가 필요할 수 있으므로 이 부분에 대해서는

반드시 라이선스를 확인 후 사용하시기 바랍니다.)


https://developers.google.com/maps/terms

33.1.1준비작업

Map을 사용하기 위해서는 TypeDefinition에 Map을 정의해 주서야 합니다.

그림 33-1googlemap1

33.1.2Web browser방식(기존 html5)

그림 33-2googlemap1

주요 소스 내용

//Map 좌표
this.fs_srcLatitude = "37.576683";
this.fs_srcLongitude = "127.025591";

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{   
    this.Map00.load(false, this.fs_srcLatitude, this.fs_srcLongitude);
}
//Map이 모두 Load된 후 Marker 처리       
this.Map00_onload = function(obj:Map, e:nexacro.MapEventInfo)
{
    var obj_mapmarker = new nexacro.MapMarker();
    obj_mapmarker.location.set_latitude(this.fs_srcLatitude);
    obj_mapmarker.location.set_longitude(this.fs_srcLongitude);
 
    obj_mapmarker.set_text("Current position");
    obj_mapmarker.set_visible(true);
 
     var tempMapMarker = this.Map00.addItem("MapMarker", obj_mapmarker); 
}

해당 샘플은 Web browser방식 (기존 html5) )환경에서 사용가능한 샘플입니다.

소스 위치

Sample\Application_Etc\np_GoogleMap.xfdl

Google맵을 연동할 수 있나요?

33.1.3nexacro browser/Web browser 방식(기존 runtime/html5)

그림 33-3googlemap3

nexacro browser방식에서는 Map컴포넌트를 직접 올려 사용이 어렵습니다.
C++기반의 프로그램은 구글 Map key가 있어야 사용이 가능합니다. 
따라서 nexacro browser방식과 Web browser방식(기존 runtime/html5))방식에서 함께 
사용할 수 있는 방법에 대해 알아보겠습니다.

해당 방법은 WebBrowser component를 사용하여 HTML소스를 호출하는 방식이기 때문에

MAP관련된 소스 작업은 별도의 HTML작업이 필요합니다.

여기에 넥사크로플랫폼 과 데이터를 주고 받을수 있도록 document.title = "load";

소스를 추가 하였습니다. HTML의 document.title이 변경이 되면 넥사크로플랫폼의 WebBrowser컴포넌트 이벤트 중 onusernotify 이벤트가 실행됩니다.

주요 소스 내용

넥사크로플랫폼 소스

this.fs_srcLatitude = "42.485374";
this.fs_srcLongitude = "-71.212316";
this.GoogleMap_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
 this.WebBrowser00.set_url("http://localhost:8080/nexacro/nexacro/Sample/Etc/GoogleMap.html");
}
this.WebBrowser00_onloadcompleted = function(obj:WebBrowser, e:nexacro.WebLoadCompEventInfo)
{
 this.WebBrowser00.callMethod("initialize", this.fs_srcLatitude , this.fs_srcLongitude);
}
   
this.WebBrowser00_onusernotify = function(obj:WebBrowser, e:nexacro.WebTitleChangeEventInfo)
{
 if(e.userdata == "load")
 {
  this.WebBrowser00.callMethod("set_marker", this.fs_srcLatitude , this.fs_srcLongitude);
 }
}

GoogleMap관련 HTML소스

<!-- GoogoleMap Asynchronously Loading the API ********************************************* -->
<HTML>
<HEAD>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" >
  if (! window.NEXACROHTML) {
   window.NEXACROHTML = {};
  }
  window.NEXACROHTML.FireUserNotify = function(userdata) {
   
   if (window.NEXACROWEBBROWSER) {
      window.NEXACROWEBBROWSER.on_fire_onusernotify(window.NEXACROWEBBROWSER, userdata);
   } else {
    
      window.document.title = userdata;
     }   
  }
</script>
<script type="text/javascript">
  var map ;
  function initialize(a,b) {
   
   var mapLocation = new google.maps.LatLng(a, b); // 지도에서 가운데로 위치할 위도와 경도
    var mapOptions = {
      center: mapLocation, // 지도에서 가운데로 위치할 위도와 경도(변수)
      zoom: 18, // 지도 zoom단계
     mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map-canvas"), // id: map-canvas, body에 있는 div태그의 id와 같아야 함
            mapOptions);
    window.NEXACROHTML.FireUserNotify("load");
  }
  
  function set_marker(a, b ){
   var markLocation = new google.maps.LatLng(a, b); // 마커가 위치할 위도와 경도
    var size_x = 60; // 마커로 사용할 이미지의 가로 크기
    var size_y = 60; // 마커로 사용할 이미지의 세로 크기    
    // 마커로 사용할 이미지 주소
    var image = new google.maps.MarkerImage( 'http://www.larva.re.kr/home/img/boximage3.png',
      new google.maps.Size(size_x, size_y),
        '',
        '',
        new google.maps.Size(size_x, size_y));
    
    var marker;
    marker = new google.maps.Marker({
        position: markLocation, // 마커가 위치할 위도와 경도(변수)
        map: map,
        icon: image, // 마커로 사용할 이미지(변수)
    //info: '말풍선 안에 들어갈 내용',
        title: '서대전네거리역이지롱~' // 마커에 마우스 포인트를 갖다댔을 때 뜨는 타이틀
    });
    
   var content = "투비소프트"; // 말풍선 안에 들어갈 내용
    
   // 마커를 클릭했을 때의 이벤트. 
   var infowindow = new google.maps.InfoWindow({ content: content});
  
   google.maps.event.addListener(marker, "click", function() {
    infowindow.open(map,marker);
   });         
 }  
   
</script> 
</HEAD>
<BODY >
<div id="map-canvas" style="width: 100%; height: 400px"></div>
</BODY>
</HTML>
소스 위치

Sample\Application_Etc\np_GoogleMap2.xfdl, Sample\Application_Etc\GoogleMap.html