Digital Geography

27. November 2012

tutorial: visualize a line with openlayers

For an upcoming project I was curious about visualizing a line layer using OpenLayers. Therefore I digitized a way with googlemaps. After creating a kml with “my places” in googlemaps I exported the coordinates to libre office calc and converted them to fit the needed code in OpenLayers:

new OpenLayers.Geometry.Point(-5.106282, 56.820473 ),

This will be the basis for our ongoing tutorial.
First off all: keep in mind that you will need a good basemap for displaying vectors especially routes/ways. Therefore I will add a googlemap basemap and as a comparison an OpenStreetMap WMS using this:

var google = new OpenLayers.Layer.Google(
                "Google Hybrid",
                {type: google.maps.MapTypeId.HYBRID, numZoomLevels: 20}
var osm = new OpenLayers.Layer.OSM();

Now we have two variables called google and osm to represent our basemap.

As you may know, a line vector is build up by so called vertices and each of them is a point for itself. So instead of adding multiple points we need to create a list of points (minimal example):

var points = new Array(
new OpenLayers.Geometry.Point(-5.094953, 56.825886),
new OpenLayers.Geometry.Point(-5.093430, 56.826069),
new OpenLayers.Geometry.Point(-5.089990, 56.827290)

That’s where the Excel-file comes into play 😉
And you need something like a container for all the points which is another variable called vector whith the label “trip”:

var vector = new OpenLayers.Layer.Vector("trip", {style: sm}); 

You may have noticed the {style: sm} which is unknown. So you need to define a style for line beforehand. The style will be blue (#0000ff) with a width of 5 and only 50% opacity:

var sm = {strokeColor: '#0000ff',
		  strokeOpacity: 0.5,
		  strokeWidth: 5 };

Now there is a another problem. The coordinates given by googlemaps are WGS 84 coordinates which corresponds to EPSG:4326. Googlemaps as well as OSM operates on the Spherical Mercator Projection EPSG:900913. Of course you can reproject your locations. We combine that with adding the points to our container:

vector.addFeatures([new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(points).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")))]);

And lets do the last steps as you have seen them already. The last step sets the zoom extent with new coordinates and the zoom level (10 in this case):

//Add the google map layers
        map.addLayers([vector, google_hybrid,ol]);
// Add a layer switcher control
	map.addControl(new OpenLayers.Control.LayerSwitcher({}));	
// Zoom the map to the max extent  
        map.setCenter(new OpenLayers.LonLat(-5.08,56.82).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")), 10);

Let us have a look:

You can download the whole html file HERE. There is a little additional text embedded in the html as it adds a workaround to get away with annoying pop-ups.