30 October 2010

Custom Street View panorama using Google Maps v3

Notes and command line script to run when create custom Street View.
Demo

Create initial panorama
* using point and shoot camera take enough pictures to cover all around (8-12 is good enough)
* use stitching software to create equirectangular projection of the panorama
* panorama must be aspect ratio 2:1

Streetview tiles
* if initial panorama size 8192x4096, then for tile size 512x512, we need to create:
convert ${FN}_5.jpg -resize 8192x4096  ${FN}_4.jpg
convert ${FN}_4.jpg -resize 4096x2048  ${FN}_3.jpg
convert ${FN}_3.jpg -resize 2048x1024  ${FN}_2.jpg
convert ${FN}_2.jpg -resize 1024x512   ${FN}_1.jpg
convert ${FN}_1.jpg -resize 512x256    ${FN}_0.jpg

* The panorama with a single tile is zoom = 0, then 1,2,3,4
* Name each tile according to its zoom level and position.
* The top left tile is always tile (0,0).
* tile name format = "panorama_z_x_y.jpg".
 
convert ${FN}_5.jpg -crop ${SIZE}x${SIZE} -set filename:tile "%[fx:page.x/${SIZE}]_%[fx:page.y/${SIZE}]" +repage +adjoin "${FN}_5_%[filename:tile].jpg"
convert ${FN}_4.jpg -crop ${SIZE}x${SIZE} -set filename:tile "%[fx:page.x/${SIZE}]_%[fx:page.y/${SIZE}]" +repage +adjoin "${FN}_4_%[filename:tile].jpg"
convert ${FN}_3.jpg -crop ${SIZE}x${SIZE} -set filename:tile "%[fx:page.x/${SIZE}]_%[fx:page.y/${SIZE}]" +repage +adjoin "${FN}_3_%[filename:tile].jpg"
convert ${FN}_2.jpg -crop ${SIZE}x${SIZE} -set filename:tile "%[fx:page.x/${SIZE}]_%[fx:page.y/${SIZE}]" +repage +adjoin "${FN}_2_%[filename:tile].jpg"
convert ${FN}_1.jpg -crop ${SIZE}x${SIZE} -set filename:tile "%[fx:page.x/${SIZE}]_%[fx:page.y/${SIZE}]" +repage +adjoin "${FN}_1_%[filename:tile].jpg"
# resize to tile size and fill neutral color
convert ${FN}_0.jpg -resize 512x512\> -size 512x512 xc:black +swap -composite ${FN}_0_0_0.jpg 


Javascript code for streetview
function initialize() {
  var panorama = new google.maps.StreetViewPanorama(
    document.getElementById('streetview'),
    {
      panoProvider: function(pano) {
        return {
          location: {
            pano: pano
          },
          copyright: 'helmi03',
          links: [],
          tiles: {
            tileSize: new google.maps.Size(512, 512),
            worldSize: new google.maps.Size(8192, 4096),
            originHeading: 0,
            getTileUrl: function(room, zoom, x, y) {
              return 'tt_' +
                  zoom + '_' + x + '_' + y + '.jpg';
            }
          }
        };
      },
      pano: 'tt'
    }
  );
}

Demo
Panorama view of playground at Tasik Titiwangsa, Kuala Lumpur

Note that Google Maps v3 use html5 canvas instead of flash in v2.

Credits
Other blogger already give great explanation to create custom streetview and Google Maps had excellent documentation about this feature. Credits to them.
Before this, I display panorama view using java plugin.