topical media & game development

talk show tell print

mashup-gmaps-ch14-01.htm / htm



  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  <title>MCslp Maps Chapter 14, Ex 1</title>
  
    <script src="http://maps.google.com/maps?file=api&v=1&key=YOURKEY"
        type="text/javascript">
    </script>
  
  <script type="text/javascript">
  var map;
  var geopoints = [];
  var photoids = [];
  
  function onLoad() {
  
      if (GBrowserIsCompatible()) {
          map = new GMap(document.getElementById("map"));
          map.addControl(new GLargeMapControl());
          map.addControl(new GMapTypeControl());
          map.centerAndZoom(new GPoint(-79.3941593170166, 43.642659397433704),6);
      }
  }
  
  function loadPhotos() {
      photoids = [];
      geopoints = [];
      map.clearOverlays();
  
      var request = new XMLHttpRequest();
      
      request.open('GET',
                   '/examples/ch14-02flickrproxy.pl?method=flickr.photos.search&api_key=' + 
                   '4160b6e24db6bcd6193150996df98f38' + '&user_id=54256647@N00' +
                   '&tags=toronto,geotagged&tag_mode=all',true);
      request.onreadystatechange = function() {
          if (request.readyState == 4) {
              var xmlsource = request.responseXML;
              
              var photos = xmlsource.documentElement.getElementsByTagName("photo");
              for(i=0;i<photos.length;i++) {
                  var img = document.createElement('img');
                  photoids.push(photos[i].getAttribute('id'));
              }
              getphotoinfo(0);
          }
      }
      request.send(null);
  }
  
  function getphotoinfo(index) 
  {
      var request = new XMLHttpRequest();
  
      request.open('GET',
                   '/examples/ch14-02flickrproxy.pl?method=flickr.photos.getInfo&api_key=' + 
                   '4160b6e24db6bcd6193150996df98f38' + '&photo_id=' + photoids[index], true);
  
      request.onreadystatechange =  function() {
          if (request.readyState == 4) {
              var xmlsource = request.responseXML;
              var tags = xmlsource.documentElement.getElementsByTagName("tag");
              for(i=0;i<tags.length;i++) {
                  var lat;
                  var lng;
                  if (tags[i].getAttribute('raw').indexOf('geo:lon') == 0) {
                      var elems = tags[i].getAttribute('raw').split('=');
                      lng = elems[1];
                  }
                  if (tags[i].getAttribute('raw').indexOf('geo:lat') == 0) {
                      var elems = tags[i].getAttribute('raw').split('=');
                      lat = elems[1];
                  }
                  if (lat && lng) {
                      var point = new GPoint(parseFloat(lng),parseFloat(lat));
                      var marker = new GMarker(point);
                      map.addOverlay(marker);
                      GEvent.addListener(marker,
                                         'click',
                                         function() {
                          marker.openInfoWindowXslt(xmlsource,"/examples/ch14-02.xsl");
                      }
                                         );
                      geopoints.push(point);
                  }
              }
              index++;
              if (index < photoids.length) { 
                  getphotoinfo(index);
              } else {
                  recenterandzoom(geopoints);
              }
          }
      }
  
      request.send(null);
  }
  
  function recenterandzoom(points) {
      var latpoints = [];
      var lngpoints = [];
  
      var idealzoom = 1;
  
      if (points.length == 0) {
          return;
      }
  
      if (points.length == 1) {
          map.centerAndZoom(points[0],idealzoom);
          return;
      }
  
      for(var i=0;i<points.length;i++) {
          latpoints.push(points[i].y);
          lngpoints.push(points[i].x);
      }
  
      latpoints.sort();
      lngpoints.sort();
      var newlat = latpoints[0] + ((latpoints[latpoints.length-1] - latpoints[0])/2);
      var newlng = lngpoints[0] + ((lngpoints[lngpoints.length-1] - lngpoints[0])/2);
  
      var newpoint = new GPoint(parseFloat(newlng),parseFloat(newlat));
  
      var idealspan = new GSize(parseFloat(Math.abs(lngpoints[lngpoints.length-1]-lngpoints[0])),
                                parseFloat(Math.abs(latpoints[latpoints.length-1]-latpoints[0])));
  
      map.zoomTo(idealzoom);
  
      for(var i=1;i<16;i++) {
          var currentsize = map.getSpanLatLng();
                  if ((currentsize.width < idealspan.width) ||
              (currentsize.height < idealspan.height)) {
              map.zoomTo(i);
              idealzoom = i;
          }                
          else {
              break;
          }
      }
  
      map.centerAndZoom(newpoint,idealzoom);
  }
  
    </script>
    </head>
    <body onload="onLoad()">
  <a href="#" onClick="loadPhotos()">Load photos</a><br/>
      <div id="map" style="width: 800px; height: 600px"></div>
    </body>
  </html>
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.