Le script (ci-dessous) position un cercle sur une carte indiquant la position de l'utilisateur.
Il est basé sur le Geolocation API et OpenLayers.
<!DOCTYPE html> <html> <head> <title>Test Geolocation</title> <!-- OpenLayers --> <script src="http://osm.osv/OpenLayers.js"></script> <script src="http://osm.osv/OpenStreetMap.js"></script> <script type="text/javascript"> var idEl = function( id ){ return document.getElementById( id );} </script> </head> <body> <h1>Geoloc API</h1> <h2>Map</h2> <input type="checkbox" id="followGPS"> Follow GPS <br> <div style="width:500px; height:500px" id="map"></div> <h2>Logs</h2> <button onclick="idEl('logs').innerHTML='';">Clear logs</button> <div id="logs"></div> <script type="text/javascript"> //--------------- Map var osmMap = function(){ var map = new OpenLayers.Map("map"), layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"), hostedTiles = new OpenLayers.Layer.OSM("Local Tiles", "/tiles/${z}/${x}/${y}.png", {numZoomLevels: 18, alpha: true, isBaseLayer: false}), defaultZoom = 15; map.addLayers( [ layerMapnik, hostedTiles] ); var switcherControl = new OpenLayers.Control.LayerSwitcher(); map.addControl(switcherControl); var vector = new OpenLayers.Layer.Vector('vector'); map.addLayer(vector); var firstGeolocation = true, convertLonLat = function( coords ){ //Convert coords.longitude and coords.latitude only if needed if( !( "isESPG" in coords && coords.isESPG === true) ){ var lonlat = new OpenLayers.LonLat( coords.longitude, coords.latitude ).transform( new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject() ); coords.longitude = lonlat.lon; coords.latitude = lonlat.lat; coords.isESPG = true; } return coords; }, getPoint = function( coords ){ //Return a geometry point from coords coords = convertLonLat( coords ); return new OpenLayers.Geometry.Point( coords.longitude, coords.latitude ); }, centerMap = function( coords, zoom ){ //zoom is optionnal coords = convertLonLat( coords ); zoom = (zoom) ? zoom : defaultZoom; if( ! map.getCenter() ){ map.setCenter( new OpenLayers.LonLat( coords.longitude, coords.latitude ), zoom ); } }, updateGPSCross = function( coords ){ vector.removeAllFeatures(); //Removing previous cross/circle var style = { fillColor: '#000', fillOpacity: 0.1, strokeWidth: 0 }; var point = getPoint( coords ); var circle = new OpenLayers.Feature.Vector( OpenLayers.Geometry.Polygon.createRegularPolygon( new OpenLayers.Geometry.Point( point.x, point.y ), coords.accuracy/2, 40, 0 ), {}, style ); vector.addFeatures([ new OpenLayers.Feature.Vector( point, {}, { graphicName: 'circle', strokeColor: '#1ac6bc', strokeWidth: 2, fillOpacity: 0, pointRadius: 6 } ), circle ]); if (firstGeolocation) { //Only zoom for the first position map.zoomToExtent(vector.getDataExtent()); firstGeolocation = false; } }; centerMap( { longitude: -4.47607356, latitude: 48.3905264 }); //We need a first position (espacially with our tile server) return{ updateGPSCross: updateGPSCross }; }(); //--------------- Geolocation var geoloc = function(){ var geolocation = navigator.geolocation; var log = function( m ){ window.console.log( m ); document.getElementById("logs").innerHTML += "<br>"+m ; }; var logPosition = function( position ){ var l = "Position"; l += " lat=" +position.coords.latitude; l += " long="+position.coords.longitude; l += " accuracy="+position.coords.accuracy; l += " timestamp="+position.timestamp; log( l ); }; var positionOptions = { enableHighAccuracy: true }, positionCallback = function( position ){ logPosition( position ); if( idEl('followGPS').checked ){ osmMap.updateGPSCross( { longitude:position.coords.longitude, latitude:position.coords.latitude } );} }, positionErrorCallback = function( positionError ){ switch(positionError){ case 1: alert("Permission Denied"); break; case 2: alert("Position unvalaible"); break; case 3: alert("Timeout"); } }; var watchID = geolocation.watchPosition( positionCallback, positionErrorCallback, positionOptions ); log("Watch ID : "+watchID); var simulationInterval = false; var debugSimulationCount = 0; }(); </script> </body> </html>