var utils = {}; utils.groupBy = function (xs, key) { return xs.reduce(function (rv, x) { (rv[x[key]] = rv[x[key]] || []).push(x); return rv; }, {}); } // Copies a string to the clipboard. Must be called from within an // event handler such as click. May return false if it failed, but // this is not always possible. Browser support for Chrome 43+, // Firefox 42+, Safari 10+, Edge and Internet Explorer 10+. // Internet Explorer: The clipboard feature may be disabled by // an administrator. By default a prompt is shown the first // time the clipboard is used (per session). // https://stackoverflow.com/a/33928558/6419007 utils.copyToClipboard = function (text, log) { if (window.clipboardData && window.clipboardData.setData) { // Internet Explorer-specific code path to prevent textarea being shown while dialog is visible. return window.clipboardData.setData("Text", text); } else if (document.queryCommandSupported && document.queryCommandSupported("copy")) { var textarea = document.createElement("textarea"); textarea.textContent = text; textarea.style.position = "fixed"; // Prevent scrolling to bottom of page in Microsoft Edge. document.body.appendChild(textarea); textarea.select(); try { document.execCommand("copy"); // Security exception may be thrown by some browsers. log.append("

Coordinates copied to clipboard!


\n"); return; } catch (ex) { console.warn("Copy to clipboard failed.", ex); return prompt("Copy to clipboard: Ctrl+C, Enter", text); } finally { document.body.removeChild(textarea); } } } utils.read_kml = function (url) { return new ol.source.KML({ projection: ol.proj.get('EPSG:3857'), url: url, extractAttributes: false, extractStyles: false }); } utils.is_polygon = function (geom) { return ('getType' in geom) && (geom.getType() === 'Polygon'); } utils.polygon_style = function (color, alpha) { return new ol.style.Style({ fill: new ol.style.Fill({ color: 'rgba(255, 255, 255,' + alpha + ')' }), stroke: new ol.style.Stroke({ color: color, width: 2, lineDash: [5, 10] }), }); }