Revisions

  • 4eed0e howtheb... Thu Oct 22 08:43:25 -0700 2009
  • d37568 howtheb... Thu Oct 22 08:38:36 -0700 2009
  • 4269dc howtheb... Thu Oct 22 08:33:51 -0700 2009
  • 3ebe47 howtheb... Thu Oct 22 08:24:42 -0700 2009
  • 0577ab howtheb... Thu Oct 22 00:30:00 -0700 2009
gist: 215809 Download_button fork
public
Description:
netcultures walk through of beautifying google's horrible javascript spreadsheet mapper
Public Clone URL: git://gist.github.com/215809.git
Embed All Files: show embed
index.html #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
<!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>
  <script src="http://www.google.com/jsapi"></script>
  <script>
     google.load("jquery", "1.3");
  </script>
  <script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAArYqxP8iD7yfYTxrLYQmwehT2yXp_ZAY8_ufC3CFXhHIE1NvwkxT6VZV_KCSABr9_i4BGpMSXan7nig"
    type="text/javascript">
  </script>
  <script type="text/javascript">
  //<![CDATA[
  var cm_map;
  var cm_mapMarkers = [];
  var cm_mapHTMLS = [];
 
  // Create a base icon for all of our markers that specifies the
  // shadow, icon dimensions, etc.
  var cm_baseIcon = new GIcon();
  cm_baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
  cm_baseIcon.iconSize = new GSize(20, 34);
  cm_baseIcon.shadowSize = new GSize(37, 34);
  cm_baseIcon.iconAnchor = new GPoint(9, 34);
  cm_baseIcon.infoWindowAnchor = new GPoint(9, 2);
  cm_baseIcon.infoShadowAnchor = new GPoint(18, 25);
 
  // Change these parameters to customize map
  var param_wsId = 'od6';
  var param_ssKey = 'tQA10qo0HRWIKqH5VxC1e2w';
  var param_useSidebar = false;
  var param_titleColumn = 'lga';
  var param_descriptionColumn = 'income';
  var param_latColumn = 'latitude';
  var param_lngColumn = 'longitude';
  var param_rankColumn = null;
  var param_iconType = 'green';
  var param_iconOverType = 'orange';
 
  /**
* Loads map and calls function to load in worksheet data.
*/
  google.setOnLoadCallback(
    function() {
      if (GBrowserIsCompatible()) {
        // create the map
        cm_map = new GMap2(document.getElementById("cm_map"));
        cm_map.addControl(new GLargeMapControl());
        cm_map.addControl(new GMapTypeControl());
        cm_map.setCenter(new GLatLng( 43.907787,-79.359741), 2);
        $.getJSON('http://spreadsheets.google.com/feeds/list' + '/' + param_ssKey + '/' + param_wsId + '/public/values' + '?alt=json-in-script&callback=?',
        cm_loadMapJSON);
      } else {
        alert("Sorry, the Google Maps API is not compatible with this browser");
      }
    }
  )
  /**
* Function called when marker on the map is clicked.
* Opens an info window (bubble) above the marker.
* @param {Number} markerNum Number of marker in global array
*/
  function cm_markerClicked(markerNum) {
    cm_mapMarkers[markerNum].openInfoWindowHtml(cm_mapHTMLS[markerNum]);
  }
 
  /**
* Function that sorts 2 worksheet rows from JSON feed
* based on their rank column. Only called if column is defined.
* @param {rowA} Object Represents row in JSON feed
* @param {rowB} Object Represents row in JSON feed
* @return {Number} Difference between row values
*/
  function cm_sortRows(rowA, rowB) {
    var rowAValue = parseFloat(rowA["gsx$" + param_rankColumn].$t);
    var rowBValue = parseFloat(rowB["gsx$" + param_rankColumn].$t);
 
    return rowAValue - rowBValue;
  }
 
  /**
* Called when JSON is loaded. Creates sidebar if param_sideBar is true.
* Sorts rows if param_rankColumn is valid column. Iterates through worksheet rows,
* creating marker and sidebar entries for each row.
* @param {JSON} json Worksheet feed
*/
  function cm_loadMapJSON(json) {
    var usingRank = false;
 
    if(param_useSidebar == true) {
      var sidebarTD = document.createElement("td");
      sidebarTD.setAttribute("width","150");
      sidebarTD.setAttribute("valign","top");
      var sidebarDIV = document.createElement("div");
      sidebarDIV.id = "cm_sidebarDIV";
      sidebarDIV.style.overflow = "auto";
      sidebarDIV.style.height = "400px";
      sidebarDIV.style.fontSize = "11px";
      sidebarDIV.style.color = "#000000";
      sidebarTD.appendChild(sidebarDIV);
      document.getElementById("cm_mapTR").appendChild(sidebarTD);
    }
 
    var bounds = new GLatLngBounds();
 
    if(json.feed.entry[0]["gsx$" + param_rankColumn]) {
      usingRank = true;
      json.feed.entry.sort(cm_sortRows);
    }
 
    for (var i = 0; i < json.feed.entry.length; i++) {
      var entry = json.feed.entry[i];
      if(entry["gsx$" + param_latColumn]) {
        var lat = parseFloat(entry["gsx$" + param_latColumn].$t);
        var lng = parseFloat(entry["gsx$" + param_lngColumn].$t);
        var point = new GLatLng(lat,lng);
        var html = "<div style='font-size:12px'>";
        html += "<strong>" + entry["gsx$"+param_titleColumn].$t
                + "</strong>";
        var label = entry["gsx$"+param_titleColumn].$t;
        var rank = 0;
        if(usingRank && entry["gsx$" + param_rankColumn]) {
          rank = parseInt(entry["gsx$"+param_rankColumn].$t);
        }
        if(entry["gsx$" + param_descriptionColumn]) {
          html += "<br/>" + entry["gsx$"+param_descriptionColumn].$t;
        }
        html += "</div>";
 
        // create the marker
        var marker = cm_createMarker(point,label,html,rank);
        cm_map.addOverlay(marker);
        cm_mapMarkers.push(marker);
        cm_mapHTMLS.push(html);
        bounds.extend(point);
 
        if(param_useSidebar == true) {
          var markerA = document.createElement("a");
          markerA.setAttribute("href","javascript:cm_markerClicked('" + i +"')");
          markerA.style.color = "#000000";
          var sidebarText= "";
          if(usingRank) {
            sidebarText += rank + ") ";
          }
          sidebarText += label;
          markerA.appendChild(document.createTextNode(sidebarText));
          sidebarDIV.appendChild(markerA);
          sidebarDIV.appendChild(document.createElement("br"));
          sidebarDIV.appendChild(document.createElement("br"));
        }
      }
    }
 
    cm_map.setZoom(cm_map.getBoundsZoomLevel(bounds));
    cm_map.setCenter(bounds.getCenter());
  }
 
  /**
* Creates marker with ranked Icon or blank icon,
* depending if rank is defined. Assigns onclick function.
* @param {GLatLng} point Point to create marker at
* @param {String} title Tooltip title to display for marker
* @param {String} html HTML to display in InfoWindow
* @param {Number} rank Number rank of marker, used in creating icon
* @return {GMarker} Marker created
*/
  function cm_createMarker(point, title, html, rank) {
    var markerOpts = {};
    var nIcon = new GIcon(cm_baseIcon);
 
    if(rank > 0 && rank < 100) {
      nIcon.imageOut = "http://gmaps-samples.googlecode.com/svn/trunk/" +
          "markers/" + param_iconType + "/marker" + rank + ".png";
      nIcon.imageOver = "http://gmaps-samples.googlecode.com/svn/trunk/" +
          "markers/" + param_iconOverType + "/marker" + rank + ".png";
      nIcon.image = nIcon.imageOut;
    } else {
      nIcon.imageOut = "http://gmaps-samples.googlecode.com/svn/trunk/" +
          "markers/" + param_iconType + "/blank.png";
      nIcon.imageOver = "http://gmaps-samples.googlecode.com/svn/trunk/" +
          "markers/" + param_iconOverType + "/blank.png";
      nIcon.image = nIcon.imageOut;
    }
 
    markerOpts.icon = nIcon;
    markerOpts.title = title;
    var marker = new GMarker(point, markerOpts);
 
    GEvent.addListener(marker, "click", function() {
      marker.openInfoWindowHtml(html);
    });
    GEvent.addListener(marker, "mouseover", function() {
      marker.setImage(marker.getIcon().imageOver);
    });
    GEvent.addListener(marker, "mouseout", function() {
      marker.setImage(marker.getIcon().imageOut);
    });
    GEvent.addListener(marker, "infowindowopen", function() {
      marker.setImage(marker.getIcon().imageOver);
    });
    GEvent.addListener(marker, "infowindowclose", function() {
      marker.setImage(marker.getIcon().imageOut);
    });
    return marker;
  }
  //]]>
 
  </script>
</head><body>
 
<!-- ++Begin GSpreadsheets Map Wizard Generated Code++ -->
 
<div style="width:px; font-family:Arial,
sans-serif; font-size:11px; border:1px solid black">
  <table id="cm_mapTABLE"> <tbody> <tr id="cm_mapTR">
 
    <td> <div id="cm_map" style="width:400px; height:400px"></div> </td>
  </tr> </tbody></table>
</div>
</body> </html>