// ==UserScript== // @name WME Geometries (Beta) // @version 0.8 // @description Import geometry files into Waze Map Editor. Supports GeoJSON, GML, WKT, KML, GPX and TXT. // @match https://editor-beta.waze.com/*editor/* // @match https://www.waze.com/*editor/* // @grant none // @author Timbones // @contributor wlodek76 // @namespace https://greasyfork.org/users/3339 // @downloadURL none // ==/UserScript== /* Blah Blah Blah */ (function() { var geolist; var formathelp = 'GeoJSON, GML, WKT'; var formats = { 'GEOJSON':new OpenLayers.Format.GeoJSON(), 'GML':new OpenLayers.Format.GML(), 'WKT':new OpenLayers.Format.WKT() }; patchOpenLayers(); // patch adds KML, GPX and TXT formats var EPSG_4326 = new OpenLayers.Projection("EPSG:4326"); // lat,lon var EPSG_3857 = new OpenLayers.Projection("EPSG:3857"); // WGS 84 var EPSG_4269 = new OpenLayers.Projection("EPSG:4269"); // NAD 83 var colorlist = [ "navy", "purple", "darkgreen", "darkred", "teal", "darkslategray" ]; var layerindex = 0; // delayed initialisation setTimeout(init, 654); Waze.loginManager.events.register("login", null, init); // add interface to Settings tab function init() { var geobox = document.createElement('div'); geobox.style.paddingTop = '6px'; $("#sidepanel-areas").append(geobox); var geotitle = document.createElement('h4'); geotitle.innerHTML = 'Import Geometry File'; geobox.appendChild(geotitle); geolist = document.createElement('ul'); geobox.appendChild(geolist); var geoform = document.createElement('form'); geobox.appendChild(geoform); var inputfile = document.createElement('input'); inputfile.type = 'file'; inputfile.id = 'GeometryFile'; inputfile.title = '.geojson, .gml or .wkt'; inputfile.addEventListener('change', addGeometryLayer, false); geoform.appendChild(inputfile); var notes = document.createElement('p'); notes.innerHTML = 'Formats: ' + formathelp + '
' + 'Coordinates: EPSG:4326, EPSG:3857'; geoform.appendChild(notes); var inputadd = document.createElement('input'); inputadd.type = 'button'; inputadd.value = 'Clear All'; inputadd.onclick = removeGeometryLayers; geoform.appendChild(inputadd); console.log("WME Geometries initialised"); } // import selected file as a vector layer function addGeometryLayer() { // get the selected file from user var fileList = document.getElementById('GeometryFile'); file = fileList.files[0]; fileList.value = ''; var fileext = file.name.split('.').pop(); var filename = file.name.replace('.' + fileext, ''); fileext = fileext.toUpperCase(); // add list item color = colorlist[(layerindex++) % colorlist.length]; var fileitem = document.createElement('li'); fileitem.id = file.name; fileitem.style.color = color; fileitem.innerHTML = 'Loading...'; geolist.appendChild(fileitem); // check if format is supported var parser = formats[fileext]; if (typeof parser == 'undefined') { fileitem.innerHTML = fileext.toUpperCase() + ' format not supported :('; fileitem.style.color = 'red'; return; } // add a new layer for the geometry var layerid = 'wme_geometry_'+layerindex; var WME_Geometry = new OL.Layer.Vector("Geometry: " + filename, { rendererOptions: { zIndexing: true }, uniqueName: layerid, shortcutKey: "S+" + layerindex, layerGroup: 'wme_geometry' } ); WME_Geometry.style = { strokeColor: color, strokeOpacity: 0.5, strokeWidth: 3, fillColor: color, fillOpacity: 0.02, pointRadius: 6 }; WME_Geometry.setZIndex(-9999); WME_Geometry.displayInLayerSwitcher = true; Waze.map.addLayer(WME_Geometry); Waze.map.addControl(new OL.Control.DrawFeature(WME_Geometry, OL.Handler.Path)); // hack in translation: I18n.translations[I18n.locale].layers.name[layerid] = "WME Geometries: " + filename; parser.internalProjection = Waze.map.getProjectionObject(); parser.externalProjection = EPSG_4326; //parser.extractTracks = true; // for KML and GPX //parser.extractRoutes = true; // for GPX // read the file into the new layer var reader = new FileReader(); reader.onload = (function(theFile) { return function(e) { if (/"EPSG:3857"|:EPSG::3857"/.test(e.target.result)) { parser.externalProjection = EPSG_3857; } if (/"EPSG:4269"|:EPSG::4269"/.test(e.target.result)) { parser.externalProjection = EPSG_4269; } var features = parser.read(e.target.result); WME_Geometry.addFeatures(features); fileitem.innerHTML = filename; fileitem.title = fileext.toUpperCase() + " " + parser.externalProjection.projCode + ": " + features.length + " features loaded"; if (features.length == 0) { fileitem.innerHTML += ' - no features loaded :('; fileitem.style.color = 'red'; WME_Geometry.destroy(); } console.log("WME Geometries: Loaded " + fileitem.title); }; })(file); reader.readAsText(file); } // clear all function removeGeometryLayers() { var layers = Waze.map.getLayersBy("layerGroup","wme_geometry"); for (i = 0; i < layers.length; i++) { layers[i].destroy(); } geolist.innerHTML = ''; layerindex = 0; return false; } // ------------------------------------------------------------------------------------ // replace missing functions in OpenLayers 2.12 function patchOpenLayers() { if (OpenLayers.VERSION_NUMBER != 'Release 2.12') { console.log("WME Geometries: OpenLayers version mismatch - cannot apply patch"); return; } OpenLayers.Format.KML=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{kml:"http://www.opengis.net/kml/2.2",gx:"http://www.google.com/kml/ext/2.2"},kmlns:"http://earth.google.com/kml/2.0",placemarksDesc:"No description available",foldersName:"OpenLayers export",foldersDesc:"Exported on "+new Date,extractAttributes:!0,kvpAttributes:!1,extractStyles:!1,extractTracks:!1,trackAttributes:null,internalns:null,features:null,styles:null,styleBaseUrl:"",fetched:null,maxDepth:0,initialize:function(a){this.regExes= {trimSpace:/^\s*|\s*$/g,removeSpace:/\s*/g,splitSpace:/\s+/,trimComma:/\s*,\s*/g,kmlColor:/(\w{2})(\w{2})(\w{2})(\w{2})/,kmlIconPalette:/root:\/\/icons\/palette-(\d+)(\.\w+)/,straightBracket:/\$\[(.*?)\]/g};this.externalProjection=new OpenLayers.Projection("EPSG:4326");OpenLayers.Format.XML.prototype.initialize.apply(this,[a])},read:function(a){this.features=[];this.styles={};this.fetched={};return this.parseData(a,{depth:0,styleBaseUrl:this.styleBaseUrl})},parseData:function(a,b){"string"==typeof a&& (a=OpenLayers.Format.XML.prototype.read.apply(this,[a]));for(var c=["Link","NetworkLink","Style","StyleMap","Placemark"],d=0,e=c.length;d=this.maxDepth)return!1;var c=OpenLayers.Util.extend({},b);c.depth++;for(var d=0,e=a.length;d=e.length)){switch(e.length){case 1:f=e[0];break;case 2:f=e[0];e=e[1];f=3==f.nodeType||4==f.nodeType?f:e;break;default:f=e[1]}if(3==f.nodeType||4==f.nodeType)if(d=d.prefix?d.nodeName.split(":")[1]:d.nodeName,f=OpenLayers.Util.getXmlNodeValue(f))f=f.replace(this.regExes.trimSpace,""),b[d]=f}return b},parseExtendedData:function(a){var b={},c,d,e,f,g=a.getElementsByTagName("Data");c=0;for(d=g.length;c