Putting your Professional Group on the Map
By Sarah Maddox, Google Developer
Relations team
People love to
know what's happening in their area of expertise around the world. What better way to show it,
than on a map? Tech Comm on a Map puts technical communication tidbits onto an interactive map,
together with the data and functionality provided by Google Maps.
I'm a technical
writer at Google. In this post I share a project that uses the new Data layer in the Google
Maps JavaScript API, with a Google Sheets spreadsheet as a data source and a location search
provided by Google Places Autocomplete.
Although this
project is about technical communication, you can easily adapt it for other special interest
groups too. The code is on GitHub.
The map in
action
Visit
Tech Comm on
a Map to see it
in action. Here's a screenshot:
The colored
circles indicate the location of technical communication conferences, societies, groups and
businesses. The 'other' category is for bits and pieces that don't fit into any of the
categories. You can select and deselect the checkboxes at top left of the map, to choose the
item types you're interested in.
When you hover over a circle, an info window pops up with
information about the item you chose. If you click a circle, the map zooms in so that you can
see where the event or group is located. You can also search for a specific location, to see
what's happening there.
Let's look at the building blocks of
Tech Comm on a
Map.
Getting
hold of a map
Where does
the data come from?
When planning this
project, I decided I want technical communicators to be able to add data (conferences, groups,
businesses, and so on) themselves, and the data must be immediately visible on the
map.
I needed a data entry and storage tool
that provided a data entry UI, user management and authorization, so that I didn't have to
code all that myself. In addition, contributors shouldn't need to learn a new UI or a new
syntax in order to add data items to the map. I needed a data entry mechanism that is familiar
to most people - a spreadsheet, for example.
In an episode of Google Maps Developer
Shortcuts,
Paul
Saxman shows how
to pull data from Google Drive into your JavaScript app. That's just what I needed. Here's how
it works.
The data for Tech Comm on a
Map is in a Google Sheets spreadsheet. It looks something like this:
var SPREADSHEET_ID
= '[MY-SPREADSHEET-ID]';
var SHEET_NAME =
'Data';
function
doGet(request) {
var
callback = request.parameters.jsonp;
var
range = SpreadsheetApp
.openById(SPREADSHEET_ID)
.getSheetByName(SHEET_NAME)
.getDataRange();
var
json = callback + '(' +
Utilities.jsonStringify(range.getValues()) +
')';
return
ContentService
.createTextOutput(json)
.setMimeType(ContentService.MimeType.JAVASCRIPT);
}
Follow these steps
to add the script to the spreadsheet and make it available as a web
service:
In Google Sheets,
choose 'Tools' > 'Script Editor'.
Add a new script as a blank
project.
Insert the above
code.
Choose 'File' > 'Manage Versions',
and name the latest version of the script.
Choose 'Publish' >
'Deploy as web app'. Make it executable by 'anyone, even anonymous'. Note: This
means anyone will be able to access the data in this spreadsheet via a
script.
Choose 'Deploy'.
Copy the URL of the web service. You'll
need to paste it into the JavaScript on your web page.
In your
JavaScript, define a variable to contain the URL of the Google Apps script, and add the JSONP
callback parameter:
var
DATA_SERVICE_URL =
"https://script.google.com/macros/s/[MY-SCRIPT-ID]/exec?jsonp=?";
Then use jQuery's
Ajax function to fetch and process the rows of data from the spreadsheet. Each row contains
the information for an item: type, item name, description, website, start and end dates,
address, latitude and longitude.
$.ajax({
url:
DATA_SERVICE_URL,
dataType: 'jsonp',
success: function(data) {
// Get the spreadsheet rows one by
one.
// First row contains headings, so start the index at 1 not
0.
for (var i = 1; i < data.length; i++)
{
map.data.add({
properties:
{
type:
data[i][0],
name:
data[i][1],
description:
data[i][2],
website:
data[i][3],
startdate:
data[i][4],
enddate:
data[i][5],
address:
data[i][6]
},
geometry:
{
lat:
data[i][7],
lng:
data[i][8]
}
});
}
}
});
The new
Data layer in the Maps JavaScript API
Now that I could
pull the tech comm information from the spreadsheet into my web page, I needed a way to
visualize the data on the map. The new Data layer in the Google Maps JavaScript API is designed for just such a purpose. Notice
the method map.data.add() in the above code. This is an instruction to add a feature in the Data layer.
With the basic
JavaScript API you can add separate objects to the map, such as a polygon, a marker, or a
line. But by using the Data layer, you can define a collection of objects and then manipulate
and style them as a group. (The Data layer is also designed to play well with GeoJSON, but we
don't need that aspect of it for this project.)
The tech comm data
is represented as a series of features in the Data layer, each with a set of
properties (type, name, address, etc) and a geometry (latitude and longitude).
Style the markers
on the map, with different colors depending on the data type (conference, society, group,
etc):
function
techCommItemStyle(feature) {
var
type = feature.getProperty('type');
var
style = {
icon: {
path:
google.maps.SymbolPath.CIRCLE,
fillOpacity:
1,
strokeWeight:
3,
scale: 10
},
// Show the markers for this type
if
// the user has selected the corresponding
checkbox.
visible: (checkboxes[type] !=
false)
};
// Set
the marker colour based on type of tech comm item.
switch
(type) {
case 'Conference':
style.icon.fillColor =
'#c077f1';
style.icon.strokeColor =
'#a347e1';
break;
case 'Society':
style.icon.fillColor =
'#f6bb2e';
style.icon.strokeColor =
'#ee7b0c';
break;
. . . SNIPPED SOME
DATA TYPES FOR BREVITY
default:
style.icon.fillColor =
'#017cff';
style.icon.strokeColor =
'#0000ff';
}
return
style;
}
Set listeners to respond when the user
hovers over or clicks a marker. For example, this listener opens an info window on hover,
showing information about the relevant data item:
map.data.addListener('mouseover', function(event) {
createInfoWindow(event.feature);
infoWindow.open(map);
});
The Place
Autocomplete search
The last piece of the puzzle is to let
users search for a specific location on the map, so that they can zoom in and see the events
in that location. The location search box on the map is provided by the Place Autocomplete widget from the Google Places API.
What's
next?
Tech Comm on a Map is an ongoing project.
We technical communicators are using a map to document our presence in the
world!
Would you like to contribute? The code is
on GitHub.
Posted by Louis Gray,
Googler