One of my recent work projects requires plotting a point on a map. Of course, OpenLayers immediately came to mind. The coordinates for the point were coming out of a database, but it wasn’t a spatial database, so using WFS would have been difficult. Instead of WFS, I wanted a simple solution where I could just generate a URL with X and Y positions for the marker, and have the X,Y plotted in a map on a web page.
OpenLayers has a Markers layer that would do the trick, but I read that it’s deprecated, and it wasn’t immediately obvious what to replace it with. Plenty of tutorials show how to use Marker to put a point on the map, but I couldn’t find any tutorials showing how to do it in a non-Markers way. Eventually I came across the right OpenLayers example which shows how to do it using a Vector layer, and it’s super-easy.
Here’s the OpenLayers code that reads the X and Y position of a marker off the URL, and puts a red X at that point:
var map;
function init() {
map = new OpenLayers.Map('map');
//load free WMS source for background
var wms = new OpenLayers.Layer.WMS(
"OpenLayers WMS",
"http://labs.metacarta.com/wms/vmap0",
{layers: 'basic'}
);
map.addLayer(wms);
var renderer = OpenLayers.Layer.Vector.prototype.renderers;
var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
layer_style.fillOpacity = 0.90;
layer_style.graphicOpacity = 1;
//set up style for the marker
var style_marker = OpenLayers.Util.extend({}, layer_style);
style_marker.strokeColor = "black";
style_marker.fillColor = "red";
style_marker.graphicName = "x";
style_marker.pointRadius = 10;
style_marker.strokeWidth = 1;
// get X and Y from URL
var xpos = OpenLayers.Util.getParameters(window.location.href).xpos;
var ypos = OpenLayers.Util.getParameters(window.location.href).ypos;
//create a point feature at x,y, using previous marker style
var point = new OpenLayers.Geometry.Point(xpos, ypos);
var pointFeature = new OpenLayers.Feature.Vector(point,null,style_marker);
//create a new vector layer and add the marker to it
var vectorLayer = new OpenLayers.Layer.Vector("Treasure Here", {
style: layer_style,
renderers: renderer
});
vectorLayer.addFeatures([pointFeature]);
map.addLayer(vectorLayer);
map.setCenter(new OpenLayers.LonLat(point.x, point.y), 11);
}
And here’s what the looks like for a URL like http://www.dev-garden.org/?p=476&xpos=-82.769&ypos=27.770
PS: A shout out to whiteshadow’s raw html plugin for enabling Javascript inside this post.
