Hacker Dojo Street View


Description

This is a demo of custom StreetView.
Here is Hacker Dojo.

How to create is here.

Code

<script type='text/javascript'>

var streetView = null;
var panoID_cache = {};
var tilesData = new google.maps.MVCObject();
var streetviewService = new google.maps.StreetViewService();
var infoWnd = new google.maps.InfoWindow();

function makePanoIdCache(id, latLng) {
  streetviewService.getPanoramaByLocation(latLng, 10, function(result, status) {
    if (status == google.maps.StreetViewStatus.OK) {
      panoID_cache[id] = result.location.pano;
    }
  });
}

function initialize() {
  /*
   * Get panoramaIDs
   */
  for (var id in tiles_map) {
    if (id.match(/^[0-9\.\-]+,[0-9\.\-]+$/) != null) {
      makePanoIdCache(id, tiles_map[id].location.latLng);
    }
  }
  
  /*
   * Create a streetview panorama
   */

  var initPos = new google.maps.LatLng(37.387017,-122.063443);
  
  var stDiv = document.getElementById("streetview_canvas");
  var stOpts = {
    position : initPos,
    pov : {
      zoom : 1,
      heading : 270,
      pitch : 0
    },
    panoProvider:  getCustomPanorama
  };
  streetView = new google.maps.StreetViewPanorama(stDiv, stOpts);
  
  
  /*
   * Add custom links
   */
  google.maps.event.addListener(streetView, 'links_changed', function() {
    //Load tile data
    var panoID = this.getPano();
    var position = this.getPosition();
    var tileData = getTileData(panoID);
    var readablePanoID = position.toUrlValue();
    if (tileData == null) {
      tileData = getTileData(readablePanoID);
      if (tileData != null) {
        panoID_cache[readablePanoID] = panoID;
      }
    }
    if (tileData == null || "links" in tileData == false) 
      return;
    
    //Compute heading between current and next positions.
    var links = this.getLinks();
    var tData;
    var j = tileData.links.length;
    for (var i = 0; i < j; i++) {
      tData = getTileData(tileData.links[i].pano);
      if (tData != null) {
        tileData.links[i].heading = computeAngle(tData.location.latLng, position);
        if (tileData.links[i].pano in panoID_cache) {
          tileData.links[i].pano  = panoID_cache[tileData.links[i].pano];
        }
        links.push(tileData.links[i]);
      }
    }
  });
}
function getTileData(id) {
  if (id in tiles_map) {
    return tiles_map[id];
  } else {
    return null;
  }
}
/*
 * This function is called when the viewer has clicked a link.
 */
function getCustomPanorama(panoID) {
  var tileData = getTileData(panoID);
  if (tileData == null) {
    return;
  }
  var streetViewPanoramaData = {
    copyright: "Masashi Katsumata",
    
    //google.maps.StreetViewTileData
    tiles : {
      getTileUrl : getPanoramaTileUrl,
      centerHeading : 0,
      tileSize : new google.maps.Size(256, 256),
      worldSize : new google.maps.Size(2048, 1024)   //Definitely 2:1
    }
  };
  if ("tiles" in tileData) {
    for (var key in streetViewPanoramaData.tiles) {
      if (key in tileData.tiles) {
        streetViewPanoramaData.tiles[key] = tileData.tiles[key];
      }
    }
  }
  streetViewPanoramaData.location = tileData.location;
  streetViewPanoramaData.location.description = tileData.location.description;
  streetViewPanoramaData.links = tileData.links;
  return streetViewPanoramaData;
}

function getPanoramaTileUrl(panoID, zoom, tileX, tileY) {
  // Return a pano image given the panoID.
  return "hackerdojo/" + panoID + '/'  + tileX + '-' +tileY + '_s1.jpg';
}

function computeAngle(endLatLng, startLatLng) {
  // http://gmaps-samples.googlecode.com/svn/trunk/streetview/angletowardsbuilding.html
  var DEGREE_PER_RADIAN = 57.2957795;
  var RADIAN_PER_DEGREE = 0.017453;
  var dlat = endLatLng.lat() - startLatLng.lat();
  var dlng = endLatLng.lng() - startLatLng.lng();
  // We multiply dlng with cos(endLat), since the two points are very closeby,
  // so we assume their cos values are approximately equal.
  var yaw = Math.atan2(dlng * Math.cos(endLatLng.lat() * RADIAN_PER_DEGREE), dlat) * DEGREE_PER_RADIAN;
  if (yaw >= 360) {
    yaw -= 360;
  } else if (yaw < 0) {
    yaw += 360;
  }
  return yaw;
}

google.maps.event.addDomListener(window, 'load', initialize);
    </script>




Search
Google Maps API Programming Guide

Four Google Maps API Experts wrote this book. Introducing useful examples for developers!
See more details
Books