Search code examples
javascripthtmlopenlayers

Javascript code for Geolocation with openlayer example


I would like to practice Geolocation examples from openlayers.org. In this example, the position of the user is shown on the map. Map is OSM. In this example, the OpenLayer library is imported. But I want to use the script tag. And do it without adding libraries. I changed the codes. But the user's position is not shown.What is the problem with the code I changed? The following codes are shown in the example and the code that I have changed. The results are in the pictures.

Open Layer Code:

<!DOCTYPE html>
<html>
  <head>
    <title>Geolocation</title>
    <link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" type="text/css">
    <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>

  </head>
  <body>
    <div id="map" class="map"></div>
    <div id="info" style="display: none;"></div>
    <label for="track">
      track position
      <input id="track" type="checkbox"/>
    </label>
    <p>
      position accuracy : <code id="accuracy"></code>&nbsp;&nbsp;
      altitude : <code id="altitude"></code>&nbsp;&nbsp;
      altitude accuracy : <code id="altitudeAccuracy"></code>&nbsp;&nbsp;
      heading : <code id="heading"></code>&nbsp;&nbsp;
      speed : <code id="speed"></code>
    </p>
    <script>
      import Feature from 'ol/Feature.js';
      import Geolocation from 'ol/Geolocation.js';
      import Map from 'ol/Map.js';
      import View from 'ol/View.js';
      import Point from 'ol/geom/Point.js';
      import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer.js';
      import {OSM, Vector as VectorSource} from 'ol/source.js';
      import {Circle as CircleStyle, Fill, Stroke, Style} from 'ol/style.js';

      var view = new View({
        center: [0, 0],
        zoom: 2
      });

      var map = new Map({
        layers: [
          new TileLayer({
            source: new OSM()
          })
        ],
        target: 'map',
        view: view
      });

      var geolocation = new Geolocation({
        // enableHighAccuracy must be set to true to have the heading value.
        trackingOptions: {
          enableHighAccuracy: true
        },
        projection: view.getProjection()
      });

      function el(id) {
        return document.getElementById(id);
      }

      el('track').addEventListener('change', function() {
        geolocation.setTracking(this.checked);
      });

      // update the HTML page when the position changes.
      geolocation.on('change', function() {
        el('accuracy').innerText = geolocation.getAccuracy() + ' [m]';
        el('altitude').innerText = geolocation.getAltitude() + ' [m]';
        el('altitudeAccuracy').innerText = geolocation.getAltitudeAccuracy() + ' [m]';
        el('heading').innerText = geolocation.getHeading() + ' [rad]';
        el('speed').innerText = geolocation.getSpeed() + ' [m/s]';
      });

      // handle geolocation error.
      geolocation.on('error', function(error) {
        var info = document.getElementById('info');
        info.innerHTML = error.message;
        info.style.display = '';
      });

      var accuracyFeature = new Feature();
      geolocation.on('change:accuracyGeometry', function() {
        accuracyFeature.setGeometry(geolocation.getAccuracyGeometry());
      });

      var positionFeature = new Feature();
      positionFeature.setStyle(new Style({
        image: new CircleStyle({
          radius: 6,
          fill: new Fill({
            color: '#3399CC'
          }),
          stroke: new Stroke({
            color: '#fff',
            width: 2
          })
        })
      }));

      geolocation.on('change:position', function() {
        var coordinates = geolocation.getPosition();
        positionFeature.setGeometry(coordinates ?
          new Point(coordinates) : null);
      });

      new VectorLayer({
        map: map,
        source: new VectorSource({
          features: [accuracyFeature, positionFeature]
        })
      });
    </script>
  </body>
</html>

Result enter image description here

my code:

<!DOCTYPE html>
<html>
  <head>
    <title>Geolocation</title>
    <link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" type="text/css">
    <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
    
    <script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
  </head>
  <body>
    <div id="map" class="map"></div>
    <div id="info" style="display: none;"></div>
    <label for="track">
      track position
      <input id="track" type="checkbox"/>
    </label>
    <p>
	positionshowingtouser: <code id="positionshowingtouser1"></code>&nbsp;&nbsp;
      position accuracy : <code id="accuracy"></code>&nbsp;&nbsp;
      altitude : <code id="altitude"></code>&nbsp;&nbsp;
      altitude accuracy : <code id="altitudeAccuracy"></code>&nbsp;&nbsp;
      heading : <code id="heading"></code>&nbsp;&nbsp;
      speed : <code id="speed"></code>
    </p>
	<button onclick="showPosition1()">Try It</button>

    <p id="demo"></p>
    <script>
      /*import Feature from 'ol/Feature.js';
      import Geolocation from 'ol/Geolocation.js';
      import Map from 'ol/Map.js';
      import View from 'ol/View.js';
      import Point from 'ol/geom/Point.js';
      import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer.js';
      import {OSM, Vector as VectorSource} from 'ol/source.js';
      import {Circle as CircleStyle, Fill, Stroke, Style} from 'ol/style.js';*/

      var view = new ol.View({
        center: ol.proj.fromLonLat([51.3, 35.6]),
          zoom: 10
      });

      var map = new ol.Map({
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          })
        ],
        target: 'map',
        view: view
      });

      var geolocation = new ol.Geolocation({
        // enableHighAccuracy must be set to true to have the heading value.
        trackingOptions: {
          enableHighAccuracy: true
        },
        projection: view.getProjection()
      });

      function el(id) {
        return document.getElementById(id);
      }

      el('track').addEventListener('change', function() {
        geolocation.setTracking(this.checked);
      });

      // update the HTML page when the position changes.
      geolocation.on('change', function() {
	    el('positionshowingtouser1').innerText = geolocation.getPosition();
        el('accuracy').innerText = geolocation.getAccuracy() + ' [m]';
        el('altitude').innerText = geolocation.getAltitude() + ' [m]';
        el('altitudeAccuracy').innerText = geolocation.getAltitudeAccuracy() + ' [m]';
        el('heading').innerText = geolocation.getHeading() + ' [rad]';
        el('speed').innerText = geolocation.getSpeed() + ' [m/s]';
      });

      // handle geolocation error.
      geolocation.on('error', function(error) {
        var info = document.getElementById('info');
        info.innerHTML = error.message;
        info.style.display = '';
      });

      var accuracyFeature = new ol.Feature();
      geolocation.on('change:accuracyGeometry', function() {
        accuracyFeature.setGeometry(geolocation.getAccuracyGeometry());
      });

      var positionFeature = new ol.Feature();
      positionFeature.setStyle(new Style({
        image: new ol.style.Circle({
          radius: 6,
          fill: new ol.style.Fill({
            color: '#3399CC'
          }),
          stroke: new ol.style.Stroke({
            color: '#fff',
            width: 2
          })
        })
      }));

      geolocation.on('change:position', function() {
        var coordinates = geolocation.getPosition();
        positionFeature.setGeometry(coordinates ?
          new ol.geom.Point(coordinates) : null);
      });

      new ol.layer.Vector({
        map: map,
        source: new ol.source.VectorSource({
          features: [accuracyFeature, positionFeature]
        })
      });
	 
    </script>
  </body>
</html>

Result enter image description here


Solution

  • You have syntax errors in your update to the code:

    1. line 92: Uncaught ReferenceError: Style is not defined (should be ol.style.Style)

    2. line 113: Uncaught TypeError: ol.source.VectorSource is not a constructor (should be ol.source.Vector)

    Then it works (as long as it is on my local machine or a secure [https:] server).

    live version

    <!DOCTYPE html>
    <html>
      <head>
        <title>Geolocation</title>
        <link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" type="text/css">
        <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
        
        <script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
      </head>
      <body>
        <div id="map" class="map"></div>
        <div id="info" style="display: none;"></div>
        <label for="track">
          track position
          <input id="track" type="checkbox"/>
        </label>
        <p>
    	positionshowingtouser: <code id="positionshowingtouser1"></code>&nbsp;&nbsp;
          position accuracy : <code id="accuracy"></code>&nbsp;&nbsp;
          altitude : <code id="altitude"></code>&nbsp;&nbsp;
          altitude accuracy : <code id="altitudeAccuracy"></code>&nbsp;&nbsp;
          heading : <code id="heading"></code>&nbsp;&nbsp;
          speed : <code id="speed"></code>
        </p>
    	<button onclick="showPosition1()">Try It</button>
    
        <p id="demo"></p>
        <script>
          /*import Feature from 'ol/Feature.js';
          import Geolocation from 'ol/Geolocation.js';
          import Map from 'ol/Map.js';
          import View from 'ol/View.js';
          import Point from 'ol/geom/Point.js';
          import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer.js';
          import {OSM, Vector as VectorSource} from 'ol/source.js';
          import {Circle as CircleStyle, Fill, Stroke, Style} from 'ol/style.js';*/
    
          var view = new ol.View({
            center: ol.proj.fromLonLat([51.3, 35.6]),
              zoom: 10
          });
    
          var map = new ol.Map({
            layers: [
              new ol.layer.Tile({
                source: new ol.source.OSM()
              })
            ],
            target: 'map',
            view: view
          });
    
          var geolocation = new ol.Geolocation({
            // enableHighAccuracy must be set to true to have the heading value.
            trackingOptions: {
              enableHighAccuracy: true
            },
            projection: view.getProjection()
          });
    
          function el(id) {
            return document.getElementById(id);
          }
    
          el('track').addEventListener('change', function() {
            geolocation.setTracking(this.checked);
          });
    
          // update the HTML page when the position changes.
          geolocation.on('change', function() {
    	    el('positionshowingtouser1').innerText = geolocation.getPosition();
            el('accuracy').innerText = geolocation.getAccuracy() + ' [m]';
            el('altitude').innerText = geolocation.getAltitude() + ' [m]';
            el('altitudeAccuracy').innerText = geolocation.getAltitudeAccuracy() + ' [m]';
            el('heading').innerText = geolocation.getHeading() + ' [rad]';
            el('speed').innerText = geolocation.getSpeed() + ' [m/s]';
          });
    
          // handle geolocation error.
          geolocation.on('error', function(error) {
            var info = document.getElementById('info');
            info.innerHTML = error.message;
            info.style.display = '';
          });
    
          var accuracyFeature = new ol.Feature();
          geolocation.on('change:accuracyGeometry', function() {
            accuracyFeature.setGeometry(geolocation.getAccuracyGeometry());
          });
    
          var positionFeature = new ol.Feature();
          positionFeature.setStyle(new ol.style.Style({
            image: new ol.style.Circle({
              radius: 6,
              fill: new ol.style.Fill({
                color: '#3399CC'
              }),
              stroke: new ol.style.Stroke({
                color: '#fff',
                width: 2
              })
            })
          }));
    
          geolocation.on('change:position', function() {
            var coordinates = geolocation.getPosition();
            positionFeature.setGeometry(coordinates ?
              new ol.geom.Point(coordinates) : null);
          });
    
          new ol.layer.Vector({
            map: map,
            source: new ol.source.Vector({
              features: [accuracyFeature, positionFeature]
            })
          });
    	 
        </script>
      </body>
    </html>