// ==UserScript==
// @name WME Geometries
// @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;cTXT';
formats['KML'] = new OpenLayers.Format.KML();
formats['GPX'] = new OpenLayers.Format.GPX();
formats['TXT'] = new OpenLayers.Format.Text();
};
})();
// ------------------------------------------------------------------------------------