2012-06-03 3 views
1

비영리 단체 "Friends of Knox Mountain Park"에 대한 대화식지도를 만들고 있지만 Google 어스보기에 문제가 있습니다. Google 어스 API에서 타일 레이어를 표시하는 방법은 무엇입니까?

프로젝트입니다 : http://www.virtualbc.ca/knoxmountain/

이 구글 맵의 코드에 관련된 코드 :

google.load('earth', '1'); 
var map; 
var googleEarth; 

var gmarkers = []; 

var iconShadow = new google.maps.MarkerImage('icons/shadow.png', 
     // The shadow image is larger in the horizontal dimension 
     // while the position and offset are the same as for the main image. 
new google.maps.Size(46, 42), 
new google.maps.Point(0,0), 
new google.maps.Point(13, 42)); 

var sites = [ 
['1',49.905305,-119.491191, 37, '<img src="images/parking.jpg" />','parking'], 
['2',49.905842,-119.481927, 36, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['3',49.907366,-119.490439, 35, '<img src="images/shelter.jpg" />','shelter'], 
['4',49.907878,-119.491058, 34, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['5',49.908405,-119.491083, 33, '<img src="images/parking.jpg" />','parking'], 
['6',49.910402,-119.492423, 32, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['7',49.911380,-119.480236, 31, '<img src="images/shelter.jpg" />','shelter'], 
['9',49.911389,-119.480571, 30, '<img src="images/playground.jpg" />','playground'], 
['a',49.911417,-119.485104, 29, '<img src="images/shelter.jpg" />','shelter'], 
['b',49.911578,-119.479905, 28, '<img src="images/parking.jpg" />','parking'], 
['8',49.911656,-119.480227, 27, '<img src="images/picnic.jpg" />','picnic'], 
['c',49.91174271,-119.48507050, 26, '<a href="vtours/apex_trail_shelter/index.html?iframe=true&width=88%&height=98%" rel="prettyPhoto"><img src="images/apex_point_high.jpg" /></a>','icon'], 
['d',49.911916,-119.485581, 25, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['e',49.912234,-119.485175, 24, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['f',49.912662,-119.485008, 23, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['g',49.91286999,-119.48413424, 22, '<a href="vtours/apex_trail_1/index.html?iframe=true&width=88%&height=98%" rel="prettyPhoto"><img src="images/apex_point_low.jpg" /></a>','icon'], 
['h',49.913207,-119.482843, 21, '<img src="images/parking.jpg" />','parking'], 
['i',49.914174,-119.472531, 20, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['j',49.914445,-119.482013, 19, '<img src="images/information.jpg" />','information'], 
['k',49.914687,-119.482042, 18, '<img src="images/washroom.jpg" />','washroom'], 
['l',49.914747,-119.482432, 17, '<img src="images/shelter.jpg" />','shelter'], 
['m',49.914814,-119.483070, 16, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['n',49.915162,-119.482393, 15, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['o',49.916277,-119.481530, 14, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['p2',49.919028,-119.479564, 13, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['p',49.919065,-119.478622, 12, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['q',49.91971281,-119.47954356, 11, '<a href="vtours/gordon_trail_1/index.html?iframe=true&width=88%&height=98%" rel="prettyPhoto"><img src="images/gordon_trail_1.jpg" /></a>','icon'], 
['r',49.919778,-119.479044, 10, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['s',49.920243,-119.480118, 9, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['t',49.922075,-119.481165, 8, '<img src="images/viewpoint.jpg" />','viewpoint'], 
['u',49.924514,-119.478223, 7, '<img src="images/swim.jpg" />','swimming'], 
['v',49.924599,-119.477396, 6, '<img src="images/washroom.jpg" />','washroom'], 
['w',49.924867,-119.477636, 5, '<img src="images/picnic.jpg" />','picnic'], 
['x',49.925053,-119.477334, 4, '<img src="images/picnic.jpg" />','picnic'], 
['y',49.925211,-119.476506, 3, '<img src="images/picnic.jpg" />','picnic'], 
['z',49.925446,-119.476789, 2, '<img src="images/swim.jpg" />','swimming'], 
['z2',49.92555541,-119.47710250, 1, '<a href="vtours/paul_tomb_bay_1/index.html?iframe=true&width=88%&height=98%" rel="prettyPhoto"><img src="images/tomb_bay.jpg" /></a>','icon'] 
]; 


var infowindow = null; 

var overlay; 

// Used to make Google Map quard coords to MapCruncher/BingMaps quard coords  
function TileToQuadKey (x, y, zoom) 
{ 
    var quad = ""; 
    for (var i = zoom; i > 0; i--) 
    { 
     var mask = 1 << (i - 1); 
     var cell = 0; 
     if ((x & mask) != 0) 
      cell++; 
     if ((y & mask) != 0) 
      cell += 2; 
     quad += cell; 
    } 
    return quad; 
} 

function init() { 
    var centerMap = new google.maps.LatLng(49.909671,-119.482241); 

    var myOptions = { 
     zoom: 10, 
     center: centerMap, 
     mapTypeId: google.maps.MapTypeId.SATELLITE 
    } 

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

     // Create the tile layers  

    // ASTER Tile Layer 
    myASTEROptions = { 
    getTileUrl : function (a,b) { 
return "http://www.virtualbc.ca/knoxmountain/map/" + TileToQuadKey(a.x,a.y,b) + ".png"; 
}, 
    isPng: true, 
    opacity: 1.0, 
    tileSize: new google.maps.Size(256,256), 
    name: "ASTER", 
    minZoom:13, 
    maxZoom:20 
    } 

    ASTERMapType = new google.maps.ImageMapType(myASTEROptions); 
    map.overlayMapTypes.insertAt(0, ASTERMapType); 

    // Aerial Tile Layer 
    myAerialOptions = { 
    getTileUrl : function (a,b) { 
return "http://www.virtualbc.ca/knoxmountain/map/" + TileToQuadKey(a.x,a.y,b) + ".png"; 
}, 
    isPng: true, 
    opacity: 1.0, 
    tileSize: new google.maps.Size(256,256), 
    name: "Aerial", 
    minZoom:15, 
    maxZoom:21 
    } 

    AerialMapType = new google.maps.ImageMapType(myAerialOptions); 
    map.overlayMapTypes.insertAt(1, AerialMapType); 

    var panorama = new google.maps.StreetViewPanorama(map.getDiv()); 
    panorama.setVisible(false); 
    panorama.set('enableCloseButton', true); 
    map.setStreetView(panorama); 
    panorama.setPosition(centerMap); 

    setMarkers(map, sites);  
    setZoom(map, sites); 

    infowindow = new google.maps.InfoWindow({ 
     content: "Loading..." 
    }); 

    googleEarth = new GoogleEarth(map); 

    google.maps.event.addListenerOnce(map, 'tilesloaded', addOverlays); 

} 


/* 
This functions sets the markers (array) 
*/ 
function setMarkers(map, markers) { 
    for (var i = 0; i < markers.length; i++) { 
     var site = markers[i]; 
     var siteLatLng = new google.maps.LatLng(site[1], site[2]); 

     var marker = new google.maps.Marker({ 
      position: siteLatLng, 
      map: map, 
      title: site[0], 
      zIndex: site[3], 
      html: site[4], 
      // Markers drop on the map 
      animation: google.maps.Animation.DROP, 
      icon: 'http://www.virtualbc.ca/knoxmountain/icons/'+site[5]+'.png', 
      shadow: iconShadow 
     }); 

     gmarkers.push(marker); 

     google.maps.event.addListener(marker, "click", function() { 
      infowindow.setContent(this.html); 
      infowindow.open(map, this); 
     }); 
    } 
} 

/* 
Set the zoom to fit comfortably all the markers in the map 
*/ 
function setZoom(map, markers) { 
    var boundbox = new google.maps.LatLngBounds(); 
    for (var i = 0; i < markers.length; i++) 
    { 
     boundbox.extend(new google.maps.LatLng(markers[i][1], markers[i][2])); 
    } 
    map.setCenter(boundbox.getCenter()); 
    map.fitBounds(boundbox); 
} 

// This function picks up the click and opens the corresponding info window 

function myclick(i) { 
    google.maps.event.trigger(gmarkers[i-1], "click"); 
// gmarkers[i].setAnimation(null); 
// gmarkers[i-1].setAnimation(google.maps.Animation.BOUNCE); 
// value = i-1; 
} 

google.maps.event.addDomListener(window, 'load', init); 

질문 : 구글의 타일을 볼 수 있도록하는 방법

  • Earth API?

  • 또는 KML 파일을 표시하는 방법 만 Google 어스 탭에 표시 하시겠습니까?

  • Google 어스 탭을 선택한 경우에만 코드를 실행할 수있는 방법이 있습니까?

미리 감사드립니다.

답변

1

목표로 할 수있는 몇 가지 방법이 있습니다. 원래 질문을 다소 명확히하기 위해이 페이지는 GoogleEarth part of the Google Maps v3 Utility Library을 사용하므로 내 대답은 해당 기능을 활용합니다.

먼저 Google 어스보기를 선택한 경우에만 코드를 실행할 수 있습니다. 현재 MapTypeId을 확인하여 어스 뷰에 있다면 언제든지 테스트 할 수 있습니다. 유틸리티 라이브러리는 사용자가 지구보기를 사용하고 있음을 나타내는 사용자 정의 ID를 제공합니다.

map.getMapTypeId() === GoogleEarth.MAP_TYPE_ID 

수동 테스트입니다. 사용자가 지구지도 형태로 전환 언제든지 통보하려면이 같은 이벤트 리스너를 등록 할 수 있습니다 : 당신이지도를 통해 추가 할 경우

google.maps.event.addListener(map, 'maptypeid_changed', function() { 
    if (map.getMapTypeId() === GoogleEarth.MAP_TYPE_ID) { 
    // using the Earth plugin, can run custom code 
    } else { 
    // some other map type (roadmap, satellite, etc) 
    } 
}); 

마지막으로, 유틸리티 라이브러리는지도와 지구 사이의 KML 오버레이를 동기화 API. KML을 Earth 플러그인에 직접 추가하는 경우 만 일반지도보기가 아닌 어스 플러그인에 표시됩니다. 이렇게하려면, 당신은 당신이

var ge = googleEarth.getInstance(); 

하여 유틸리티 라이브러리에서 얻을 수있는 실제 플러그인 인스턴스에 대한 참조를 (이에서 GoogleEarth 당신이 유틸리티 라이브러리로 생성 된 인스턴스의 이름입니다 코드를 사용하고 필요). 이 시점에서 평소대로 Earth API으로 플러그인을 사용할 수 있습니다. KML로드에 대한 예는 다음을 참조하십시오. Fetch Good KML

관련 문제