CruisersWiki:Ol3chartlet.js

From CruisersWiki

(Difference between revisions)
Jump to: navigation, search
Line 7: Line 7:
addOnloadHook(function() {
addOnloadHook(function() {
-
   
+
 
     var $chartlets = $('.ol3-chartlet');
     var $chartlets = $('.ol3-chartlet');
     if ($chartlets.length === 0) {
     if ($chartlets.length === 0) {
Line 27: Line 27:
         disclaimer_msg: '&copy; Navionics <a href="http://www.navionics.com/en/acknowledgements" target="_new" class="navionics-acknowledgements">Acknowledgements</a> | Not to be used for navigation',
         disclaimer_msg: '&copy; Navionics <a href="http://www.navionics.com/en/acknowledgements" target="_new" class="navionics-acknowledgements">Acknowledgements</a> | Not to be used for navigation',
     };
     };
-
   
+
 
     nx.init = function(callback) {
     nx.init = function(callback) {
         // set location for Navionics images
         // set location for Navionics images
Line 49: Line 49:
         });
         });
     };
     };
-
   
+
 
     nx.formatTileUrl = function (options) { // sonar, overlay, depthUnit, safeDepth, showUGC
     nx.formatTileUrl = function (options) { // sonar, overlay, depthUnit, safeDepth, showUGC
         options = options || {};
         options = options || {};
Line 70: Line 70:
         return nx.BASE_TILE_SERVER + nx.TILE_SUFFIX + '?' + params;
         return nx.BASE_TILE_SERVER + nx.TILE_SUFFIX + '?' + params;
     };
     };
-
   
+
 
     nx.new_source = function (options) {
     nx.new_source = function (options) {
         return new ol.source.XYZ({
         return new ol.source.XYZ({
Line 79: Line 79:
                 })
                 })
             ],
             ],
-
             url: nx.formatTileUrl(options),  
+
             url: nx.formatTileUrl(options),
             maxResolution: nx.MAX_RESOLUTION,
             maxResolution: nx.MAX_RESOLUTION,
             minResolution: nx.MIN_RESOLUTION
             minResolution: nx.MIN_RESOLUTION
         });
         });
     };
     };
-
   
+
 
     var esri = {};
     var esri = {};
     esri.uris = {
     esri.uris = {
Line 96: Line 96:
         'national-geographic': "http://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer",
         'national-geographic': "http://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer",
     };
     };
-
   
+
 
     function ol3Chartlet() {
     function ol3Chartlet() {
         console.log('ol3Chartlet');
         console.log('ol3Chartlet');
         var $chartlet = $(this);
         var $chartlet = $(this);
         var params = parseParams(standalone ? location.hash.slice(1) : $chartlet.text());
         var params = parseParams(standalone ? location.hash.slice(1) : $chartlet.text());
-
       
+
 
         var iconFeature = new ol.Feature({
         var iconFeature = new ol.Feature({
             geometry: new ol.geom.Point(ol.proj.transform([params.lon, params.lat], 'EPSG:4326', 'EPSG:3857')),
             geometry: new ol.geom.Point(ol.proj.transform([params.lon, params.lat], 'EPSG:4326', 'EPSG:3857')),
             name: 'Test marker',
             name: 'Test marker',
         });
         });
-
   
+
 
         iconFeature.setStyle(
         iconFeature.setStyle(
             new ol.style.Style({
             new ol.style.Style({
Line 119: Line 119:
             })
             })
         );
         );
-
   
+
 
         // var vectorLayer = new ol.layer.Vector({
         // var vectorLayer = new ol.layer.Vector({
         //    title: 'POI',
         //    title: 'POI',
Line 132: Line 132:
             })
             })
         });
         });
-
   
+
 
         var nx_layer = new ol.layer.Tile({
         var nx_layer = new ol.layer.Tile({
             title: 'Navionics',
             title: 'Navionics',
Line 138: Line 138:
             source: nx.new_source()
             source: nx.new_source()
         });
         });
-
       
+
 
         var nx_layer_ovl = new ol.layer.Tile({
         var nx_layer_ovl = new ol.layer.Tile({
             title: 'Navionics',
             title: 'Navionics',
Line 145: Line 145:
             source: nx.new_source({overlay:true})
             source: nx.new_source({overlay:true})
         });
         });
-
       
+
 
         var esri_layer = new ol.layer.Tile({
         var esri_layer = new ol.layer.Tile({
             title: 'ESRI World Imagery',
             title: 'ESRI World Imagery',
Line 162: Line 162:
             }),
             }),
         });
         });
-
       
+
 
         var overlay_group = new ol.layer.Group({
         var overlay_group = new ol.layer.Group({
             title: 'Layers',
             title: 'Layers',
Line 179: Line 179:
             ]
             ]
         });
         });
-
       
+
 
         var view = new ol.View({
         var view = new ol.View({
                 center: ol.proj.transform([params.lon, params.lat], 'EPSG:4326', 'EPSG:3857'),
                 center: ol.proj.transform([params.lon, params.lat], 'EPSG:4326', 'EPSG:3857'),
Line 222: Line 222:
             })
             })
         });
         });
-
       
+
 
         map.addControl(new ol.control.ScaleLine({
         map.addControl(new ol.control.ScaleLine({
             units: 'nautical'
             units: 'nautical'
         }));
         }));
-
   
+
 
         loadWikiCss('MediaWiki:Ol3-layerswitcher.css');
         loadWikiCss('MediaWiki:Ol3-layerswitcher.css');
         loadWikiScript("MediaWiki:Ol3-layerswitcher.js", function () {
         loadWikiScript("MediaWiki:Ol3-layerswitcher.js", function () {
Line 236: Line 236:
         if (standalone) {
         if (standalone) {
-
             // initStandalone (webapi, params);
+
             initStandalone (map, params);
 +
        }
 +
    };
-
            // load kml
+
    function initStandalone (map, params) {
-
           
+
 
-
            function add_kml_layer (kml) {
+
        var doNotTrackHash = false;
-
                if (!kml)
+
        var setHashTimeoutID = null;
-
                    return;
+
 
-
                // kml_uri='http://openlayers.org/en/v3.13.1/examples/data/kml/2012-02-10.kml';
+
        var view = map.getView();
-
                var format = new ol.format.KML({
+
 
-
                    showPointNames: false,
+
        var onChangeCenterZoom = function () {
-
                });
+
            var setHashDelay = 1000;
-
                var loader = function(extent, resolution, projection) {
+
 
-
                    /**
+
            var setHash = function () {
-
                    * @param {ol.Extent} extent Extent.
+
                var centre = view.getCenter();
-
                    * @param {number} resolution Resolution.
+
                var lonlat = ol.proj.transform(centre, view.getProjection(), 'EPSG:4326')
-
                    * @param {ol.proj.Projection} projection Projection.
+
 
-
                    * @this {ol.source.Vector|ol.VectorTile}
+
                params.lon = lonlat[0];
-
                    */
+
                params.lat = lonlat[1];
-
                    var source = ol.xml.parse(kml);
+
                params.zoom = view.getZoom();
-
   
+
                //console.log(center, zoom);
-
                    var features = format.readFeatures(
+
                 //~ var layer_parm = params.layer ? '|layer=' + params.layer : '';
-
                        source,
+
                 //~ var page_parm = params.page ? '|page=' + params.page : '';
-
                        {featureProjection: projection}
+
 
-
                    );
+
                doNotTrackHash = true;
-
                    // , format.readProjection(source)) {
+
 
-
                   
+
                location.hash= 'lat=' + round(params.lat) + '|lon=' + round(params.lon) + '|zoom=' + params.zoom;
-
                    this.addFeatures(features);
+
                    //~ + layer_parm + page_parm;
-
   
+
 
-
                    //  function(features, dataProjection) {
+
                setHashTimeoutID = null;
-
                    //     this.addFeatures(features);
+
            };
-
                 };
+
 
-
                 var kml_layer = new ol.layer.Vector({
+
            if (setHashTimeoutID) {
-
                    title: 'POI',
+
                 window.clearTimeout(setHashTimeoutID);
-
                    visible:true,
+
-
                    source: new ol.source.Vector({
+
-
                        loader: loader,
+
-
                        // url: kml_uri,
+
-
                        // format: new ol.format.KML({
+
-
                        //     showPointNames: false,
+
-
                        // })
+
-
                    })
+
-
                });          
+
-
       
+
-
                overlay_group.getLayers().push(kml_layer);
+
-
                 loadWikiCss('MediaWiki:Ol3-popup.css');
+
-
                loadWikiScript("MediaWiki:Ol3-popup.js", init_popups);
+
             }
             }
-
         }
+
            setHashTimeoutID = window.setTimeout(setHash, setHashDelay);
 +
         };
-
         function initStandalone (map, params) {
+
         view.on('change:center', onChangeCenterZoom);
 +
        view.on('change:resolution', onChangeCenterZoom);
-
            var doNotTrackHash = false;
+
        var trackHash = function trackHash() {
-
            var setHashTimeoutID = null;
+
            if (!location.hash || doNotTrackHash) {
-
   
+
                doNotTrackHash = false;
-
            var onChangeCenterZoom = function () {
+
                return;
-
                var setHashDelay = 1000;
+
            }
-
   
+
            params = parseParams(location.hash.slice(1));
-
                var setHash = function () {
+
            if (params.lat != null && params.lon != null) {
-
                    var bounds = webapi.getBoundsArea();
+
                var centre = [params.lon, params.lat];
-
                    params.lon = (bounds[2] + bounds[0]) / 2;
+
                view.setCenter(ol.proj.transform(centre, 'EPSG:4326', view.getProjection()))
-
                    params.lat = (bounds[3] + bounds[1]) / 2;
+
                view.setZoom(params.zoom);
-
                    params.zoom = webapi.getZoom() - zoomDelta;
+
            }
-
                    //console.log(center, zoom);
+
        };
-
                    var layer_parm = params.layer ? '|layer=' + params.layer : '';
+
 
-
                    var page_parm = params.page ? '|page=' + params.page : '';
+
        window.onhashchange = trackHash;
-
           
+
 
-
                    doNotTrackHash = true;
+
        // load kml
-
   
+
 
-
                    location.hash= 'lat=' + round(params.lat) + '|lon=' + round(params.lon) + '|zoom=' + params.zoom  
+
        function add_kml_layer (kml) {
-
                        + layer_parm + page_parm;
+
            if (!kml)
-
   
+
                 return;
-
                    setHashTimeoutID = null;
+
            // kml_uri='http://openlayers.org/en/v3.13.1/examples/data/kml/2012-02-10.kml';
-
                };
+
             var format = new ol.format.KML({
-
   
+
                showPointNames: false,
-
                if (setHashTimeoutID) {
+
             });
-
                    window.clearTimeout(setHashTimeoutID);
+
             var loader = function(extent, resolution, projection) {
-
                 }
+
                 /**
-
                setHashTimeoutID = window.setTimeout(setHash, setHashDelay);
+
                * @param {ol.Extent} extent Extent.
-
             };
+
                * @param {number} resolution Resolution.
-
           
+
                * @param {ol.proj.Projection} projection Projection.
-
            JNC.Events.on("map:centerchange", onChangeCenterZoom);
+
                 * @this {ol.source.Vector|ol.VectorTile}
-
             JNC.Events.on("map:zoomchange", onChangeCenterZoom);
+
                 */
-
   
+
                var source = ol.xml.parse(kml);
-
             var trackHash = function trackHash() {
+
 
-
                 if (!location.hash || doNotTrackHash) {
+
                 var features = format.readFeatures(
-
                    doNotTrackHash = false;
+
                     source,
-
                    return;
+
                    {featureProjection: projection}
-
                 }
+
                );
-
                 params = parseParams(location.hash.slice(1));
+
 
-
                 if (params.lat != null && params.lon != null) {
+
                 this.addFeatures(features);
-
                     webapi.goToCoord(params.lon, params.lat, params.zoom);
+
-
                 }
+
             };
             };
-
   
+
            var kml_layer = new ol.layer.Vector({
-
             window.onhashchange = trackHash;
+
                title: 'POI',
 +
                visible:true,
 +
                source: new ol.source.Vector({
 +
                    loader: loader,
 +
                })
 +
             });
 +
 
 +
            overlay_group.getLayers().push(kml_layer);
         }
         }
Line 336: Line 332:
             var popup = new ol.Overlay.Popup();
             var popup = new ol.Overlay.Popup();
             map.addOverlay(popup);
             map.addOverlay(popup);
-
           
 
-
            // map.on('singleclick', function(evt) {
 
-
            //    var prettyCoord = ol.coordinate.toStringHDMS(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'), 2);
 
-
            //    popup.show(evt.coordinate, '<div><h2>Coordinates</h2><p>' + prettyCoord + '</p></div>');
 
-
            // });
 
-
          // display popup on click
+
            // display popup on click
-
          map.on('click', function(evt) {
+
            map.on('click', function(evt) {
-
            var feature = map.forEachFeatureAtPixel(evt.pixel,
+
                var feature = map.forEachFeatureAtPixel(evt.pixel,
-
                function(feature) {
+
                    function(feature) {
-
                  return feature;
+
                      return feature;
-
                });
+
                    });
-
            if (feature) {
+
                if (feature) {
-
                popup.show(evt.coordinate,  
+
                    popup.show(evt.coordinate,
-
                    '<div class="cw-popup-name">' + feature.get("name") + '</div>' +
+
                        '<div class="cw-popup-name">' + feature.get("name") + '</div>' +
-
                    '<div class="cw-popup-category">' + feature.get("styleUrl").split('#')[1] + '</div>' +
+
                        '<div class="cw-popup-category">' + feature.get("styleUrl").split('#')[1] + '</div>' +
-
                    '<div class="cw-popup-content">' + feature.get("description") + '<div>'
+
                        '<div class="cw-popup-content">' + feature.get("description") + '<div>'
-
                );
+
                    );
-
            //  popup.setPosition(evt.coordinate);
+
                } else {
-
            //  $(element).popover({
+
                    popup.hide();
-
            //    'placement': 'top',
+
                }
-
            //    'html': true,
+
            });
-
            //    'content': feature.get('name')
+
 
-
            //  });
+
            // change mouse cursor when over marker
-
            //  $(element).popover('show');
+
            map.on('pointermove', function(e) {
-
            } else {
+
                if (e.dragging) {
-
            //  $(element).popover('destroy');
+
                  $(element).popover('destroy');
-
                popup.hide();
+
                  return;
-
            }
+
                }
-
          });
+
                var pixel = map.getEventPixel(e.originalEvent);
-
   
+
                var hit = map.hasFeatureAtPixel(pixel);
-
          // change mouse cursor when over marker
+
                map.getTarget().style.cursor = hit ? 'pointer' : '';
-
          map.on('pointermove', function(e) {
+
              });
-
            if (e.dragging) {
+
-
              $(element).popover('destroy');
+
-
              return;
+
-
            }
+
-
            var pixel = map.getEventPixel(e.originalEvent);
+
-
            var hit = map.hasFeatureAtPixel(pixel);
+
-
            map.getTarget().style.cursor = hit ? 'pointer' : '';
+
-
          });
+
         }
         }
-
       
+
 
         if (params.page) {
         if (params.page) {
             loadWikiScript('MediaWiki:GetKml.js', function () {
             loadWikiScript('MediaWiki:GetKml.js', function () {
-
                // getKmlUri(
 
                 getKml(
                 getKml(
-
                     {page: params.page, decorated: true},
+
                     {
 +
                        page: params.page,
 +
                        decorated: true
 +
                    },
                     add_kml_layer
                     add_kml_layer
                 );
                 );
             });
             });
 +
 +
            loadWikiCss('MediaWiki:Ol3-popup.css');
 +
            loadWikiScript("MediaWiki:Ol3-popup.js", init_popups);
         }
         }
     }
     }
Line 409: Line 397:
         return deg;
         return deg;
     }
     }
-
   
+
 
     var zoomDelta = 0; // -3; // adjust zoom levels
     var zoomDelta = 0; // -3; // adjust zoom levels
Line 455: Line 443:
         // patch ol.xml as /extensions/TreeAndMenu/dtree.js overwrites Node
         // patch ol.xml as /extensions/TreeAndMenu/dtree.js overwrites Node
-
       
+
 
         ol.xml.isNode = goog.userAgent.IE ? ol.xml.isNodeIE_ : function(value) {
         ol.xml.isNode = goog.userAgent.IE ? ol.xml.isNodeIE_ : function(value) {
             //  return value instanceof Node;
             //  return value instanceof Node;
             return typeof value.nodeName === "string";
             return typeof value.nodeName === "string";
-
         };  
+
         };
         nx.init(function() {
         nx.init(function() {

Revision as of 10:50, 21 February 2016

/*

  ol3Chartlet.js
  Copyright (c) 2016 Vadim Shlyakhov
  Licensed MIT
  • /

addOnloadHook(function() {

   var $chartlets = $('.ol3-chartlet');
   if ($chartlets.length === 0) {
       return;
   }
   var standalone_div = $('#ol3-chartlet-standalone')[0];
   var standalone = !! standalone_div;
   var nx = {
       navKey: 'Navionics_webapi_00572',
       domain: 'www.cruiserswiki.org',
       navToken: null,
       BASE_TILE_SERVER: '//backend.navionics.io',
       TILE_SUFFIX: '/tile/{z}/{x}/{y}',
       KEY_REQ_SUFFIX: '/tile/get_key',
       MAX_RESOLUTION: 20480,
       MIN_RESOLUTION: 0.625,
       disclaimer_msg: '© Navionics <a href="http://www.navionics.com/en/acknowledgements" target="_new" class="navionics-acknowledgements">Acknowledgements</a> | Not to be used for navigation',
   };
   nx.init = function(callback) {
       // set location for Navionics images
       $('body').attr('data-root', 'http://webapiv2.navionics.com/dist/webapi/images');
       // requestNavToken
       var targetUrl = nx.BASE_TILE_SERVER + nx.KEY_REQ_SUFFIX;
       $.ajax({
           url: targetUrl + '/' + nx.navKey + '/' + nx.domain,
           async: !!callback,
           crossDomain: true,
           dataType: 'text',
           cache: false,
           error: function() {
             return console.log(arguments);
           },
           success: function(data, textStatus, jqXHR) {
               nx.navToken = data;
               callback();
           }
       });
   };
   nx.formatTileUrl = function (options) { // sonar, overlay, depthUnit, safeDepth, showUGC
       options = options || {};
       sType = options.sonar ? 1 : 0;
       sAlpha = options.overlay ? 'TRUE' : 'FALSE';
       sUgc = options.showUGC ? 'TRUE' : 'FALSE';
       sDepthUnit = {
           'm': 1, 'metre': 1, 'meter': 1,
           'ft': 2, 'feet': 2,
           'fathom': 3,
       } [options.depthUnit] || 1;
       // sDepthLevel = (options.safeDepth || 10).toFixed(2);
       sDepthLevel = (options.safeDepth || 20).toFixed(0);
       params = $.param({
           LAYERS: 'config_' + sDepthUnit + '_' + sDepthLevel + '_' + sType,
           TRANSPARENT: sAlpha,
           UGC: sUgc,
           navtoken: nx.navToken
       });
       return nx.BASE_TILE_SERVER + nx.TILE_SUFFIX + '?' + params;
   };
   nx.new_source = function (options) {
       return new ol.source.XYZ({
           crossOrigin: 'anonymous',
           attributions: [
               new ol.Attribution({
                   html: nx.disclaimer_msg
               })
           ],
           url: nx.formatTileUrl(options),
           maxResolution: nx.MAX_RESOLUTION,
           minResolution: nx.MIN_RESOLUTION
       });
   };
   var esri = {};
   esri.uris = {
       'satellite': "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer",
       'topo': "http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer",
       'light-gray': "http://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer",
       'dark-gray': "http://services.arcgisonline.com/arcgis/rest/services/Canvas/World_Dark_Gray_Base/MapServer",
       'streets': "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer",
       'hybrid': "http://services.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer",
       'oceans': "http://server.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer",
       'national-geographic': "http://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer",
   };
   function ol3Chartlet() {
       console.log('ol3Chartlet');
       var $chartlet = $(this);
       var params = parseParams(standalone ? location.hash.slice(1) : $chartlet.text());
       var iconFeature = new ol.Feature({
           geometry: new ol.geom.Point(ol.proj.transform([params.lon, params.lat], 'EPSG:4326', 'EPSG:3857')),
           name: 'Test marker',
       });
       iconFeature.setStyle(
           new ol.style.Style({
               image: new ol.style.Icon({
                   anchor: [0, 1],
                   anchorXUnits: 'fraction',
                   anchorYUnits: 'fraction',
                   // anchorYUnits: 'pixels',
                   opacity: 1,
                   src: '/images/e/e7/Flag_icon.png'
               })
           })
       );
       // var vectorLayer = new ol.layer.Vector({
       //     title: 'POI',
       //     source: new ol.source.Vector({
       //         features: [iconFeature]
       //     })
       // });
       var noneLayer = new ol.layer.Vector({
           title: 'Yellow',
           type: 'base',
           source: new ol.source.Vector({
           })
       });
       var nx_layer = new ol.layer.Tile({
           title: 'Navionics',
           type: 'base',
           source: nx.new_source()
       });
       var nx_layer_ovl = new ol.layer.Tile({
           title: 'Navionics',
           // type: 'base',
           // visible: false,
           source: nx.new_source({overlay:true})
       });
       var esri_layer = new ol.layer.Tile({
           title: 'ESRI World Imagery',
           type: 'base',
           source: new ol.source.TileArcGISRest({
               url: esri.uris.satellite,
               params: {
                   FORMAT: 'JPG',
                   TRANSPARENT: false,
               },
               attributions: [
                   new ol.Attribution({
                       html: 'Powered by ESRI <a href="' + esri.uris.satellite + '">Acknowledgements</a>'
                   })
               ]
           }),
       });
       var overlay_group = new ol.layer.Group({
           title: 'Layers',
           layers: [
               nx_layer_ovl,
               // new ol.layer.Tile({
               //     title: 'Countries',
               //     visible: false,
               //     source: new ol.source.TileWMS({
               //         url: 'http://demo.opengeo.org/geoserver/wms',
               //         params: {'LAYERS': 'ne:ne_10m_admin_1_states_provinces_lines_shp'},
               //         serverType: 'geoserver'
               //     })
               // }),
               // vectorLayer
           ]
       });
       var view = new ol.View({
               center: ol.proj.transform([params.lon, params.lat], 'EPSG:4326', 'EPSG:3857'),
               zoom: params.zoom
           });
       var map = new ol.Map({
           target: this,
           layers: [
               new ol.layer.Group({
                   'title': 'Base',
                   layers: [
                       new ol.layer.Tile({
                           title: 'OSM',
                           type: 'base',
                           source: new ol.source.OSM()
                       }),
                       // new ol.layer.Tile({
                       //     title: 'MapQuest Satellite',
                       //     type: 'base',
                       //     source: new ol.source.MapQuest({layer: 'sat'})
                       // }),
                       esri_layer,
                       new ol.layer.Tile({
                           title: 'Water color',
                           type: 'base',
                           source: new ol.source.Stamen({
                               layer: 'watercolor'
                           })
                       }),
                       noneLayer,
                       // nx_layer
                   ]
               }),
               overlay_group
           ],
           view: view,
           controls: ol.control.defaults({
               attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
                   collapsible: false
               })
           })
       });
       map.addControl(new ol.control.ScaleLine({
           units: 'nautical'
       }));
       loadWikiCss('MediaWiki:Ol3-layerswitcher.css');
       loadWikiScript("MediaWiki:Ol3-layerswitcher.js", function () {
           var layerSwitcher = new ol.control.LayerSwitcher({
               // tipLabel: 'Légende' // Optional label for button
           });
           map.addControl(layerSwitcher);
       });
       if (standalone) {
           initStandalone (map, params);
       }
   };
   function initStandalone (map, params) {
       var doNotTrackHash = false;
       var setHashTimeoutID = null;
       var view = map.getView();
       var onChangeCenterZoom = function () {
           var setHashDelay = 1000;
           var setHash = function () {
               var centre = view.getCenter();
               var lonlat = ol.proj.transform(centre, view.getProjection(), 'EPSG:4326')
               params.lon = lonlat[0];
               params.lat = lonlat[1];
               params.zoom = view.getZoom();
               //console.log(center, zoom);
               //~ var layer_parm = params.layer ? '|layer=' + params.layer : ;
               //~ var page_parm = params.page ? '|page=' + params.page : ;
               doNotTrackHash = true;
               location.hash= 'lat=' + round(params.lat) + '|lon=' + round(params.lon) + '|zoom=' + params.zoom;
                   //~ + layer_parm + page_parm;
               setHashTimeoutID = null;
           };
           if (setHashTimeoutID) {
               window.clearTimeout(setHashTimeoutID);
           }
           setHashTimeoutID = window.setTimeout(setHash, setHashDelay);
       };
       view.on('change:center', onChangeCenterZoom);
       view.on('change:resolution', onChangeCenterZoom);
       var trackHash = function trackHash() {
           if (!location.hash || doNotTrackHash) {
               doNotTrackHash = false;
               return;
           }
           params = parseParams(location.hash.slice(1));
           if (params.lat != null && params.lon != null) {
               var centre = [params.lon, params.lat];
               view.setCenter(ol.proj.transform(centre, 'EPSG:4326', view.getProjection()))
               view.setZoom(params.zoom);
           }
       };
       window.onhashchange = trackHash;
       // load kml
       function add_kml_layer (kml) {
           if (!kml)
               return;
           // kml_uri='http://openlayers.org/en/v3.13.1/examples/data/kml/2012-02-10.kml';
           var format = new ol.format.KML({
               showPointNames: false,
           });
           var loader = function(extent, resolution, projection) {
               /**
               * @param {ol.Extent} extent Extent.
               * @param {number} resolution Resolution.
               * @param {ol.proj.Projection} projection Projection.
               * @this {ol.source.Vector|ol.VectorTile}
               */
               var source = ol.xml.parse(kml);
               var features = format.readFeatures(
                   source,
                   {featureProjection: projection}
               );
               this.addFeatures(features);
           };
           var kml_layer = new ol.layer.Vector({
               title: 'POI',
               visible:true,
               source: new ol.source.Vector({
                   loader: loader,
               })
           });
           overlay_group.getLayers().push(kml_layer);
       }
       function init_popups() {
           var popup = new ol.Overlay.Popup();
           map.addOverlay(popup);
           // display popup on click
           map.on('click', function(evt) {
               var feature = map.forEachFeatureAtPixel(evt.pixel,
                   function(feature) {
                     return feature;
                   });
               if (feature) {
                   popup.show(evt.coordinate,
'
' + feature.get("name") + '
' + '
' + feature.get("styleUrl").split('#')[1] + '
' + '
' + feature.get("description") + '
'
                   );
               } else {
                   popup.hide();
               }
           });
           // change mouse cursor when over marker
           map.on('pointermove', function(e) {
               if (e.dragging) {
                 $(element).popover('destroy');
                 return;
               }
               var pixel = map.getEventPixel(e.originalEvent);
               var hit = map.hasFeatureAtPixel(pixel);
               map.getTarget().style.cursor = hit ? 'pointer' : ;
             });
       }
       if (params.page) {
           loadWikiScript('MediaWiki:GetKml.js', function () {
               getKml(
                   {
                       page: params.page,
                       decorated: true
                   },
                   add_kml_layer
               );
           });
           loadWikiCss('MediaWiki:Ol3-popup.css');
           loadWikiScript("MediaWiki:Ol3-popup.js", init_popups);
       }
   }
   function dmsh2deg(dmsh) {
       var dmsFactors = [1, 60, 3600];
       var deg = 0;
       if (!dmsh)
           return deg;
       var parts = dmsh.split('_');
       for (var i=0, li = parts.length; i < li; i++) {
           var p = parts[i];
           if (isNaN(+ p)) {
               if (p == 'S' || p == 's' || p == 'W' || p == 'w')
                   deg = -deg;
               break;
           } else {
               deg += p / dmsFactors[i];
           }
       }
       return deg;
   }
   var zoomDelta = 0; // -3; // adjust zoom levels
   function parseParams(param_str) {
       var out = {};
       var params = param_str.split('|');
       for (var i=0, li = params.length; i < li; i++) {
           var keyVal = params[i].split('=', 2);
           var key = keyVal[0].replace(/^\s+|\s+$/g, ).toLowerCase();
           var val = keyVal[1].replace(/^\s+|\s+$/g, );
           if (key == 'lon') {
               out.lon = dmsh2deg(val);
           } else if (key == 'lat') {
               out.lat = dmsh2deg(val);
           } else if (key == 'zoom') {
               out.zoom = +(val || 12) + zoomDelta;
           } else if (key == 'layer') {
               out.layer = val || 'N';
           } else if (key == 'page') {
               out.page = val;
           }
       }
       return out;
   }
   function round(val) {
       var fact = 100000;
       return Math.round(val * fact) / fact;
   }
   // if (standalone && location.hash) {
   //     $('body').empty().append(standalone_div);
   //     $('body').addClass('cw-chartlet-extend');
   // }
   loadWikiCss('CruisersWiki:Ol3chartlet.css');
   // loadCss("http://openlayers.org/en/v3.12.1/css/ol.css");
   // loadScript("http://openlayers.org/en/v3.12.1/build/ol-debug.js", function () {
   loadCss("http://cdnjs.cloudflare.com/ajax/libs/ol3/3.13.1/ol.css");
   loadScript("http://cdnjs.cloudflare.com/ajax/libs/ol3/3.13.1/ol-debug.js", function () {
       if (typeof ol === 'undefined') {
           return;
       }
       // patch ol.xml as /extensions/TreeAndMenu/dtree.js overwrites Node
       ol.xml.isNode = goog.userAgent.IE ? ol.xml.isNodeIE_ : function(value) {
           //   return value instanceof Node;
           return typeof value.nodeName === "string";
       };
       nx.init(function() {
           console.log('nx.init');
           $chartlets.each(ol3Chartlet);
           // ol3Map(41.235983333333, 9.1945166666667, 11);
       });
   });
});
Personal tools
advertisement
Friends of Cruisers Wiki