您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Facilitates the standardization of segments
当前为
// ==UserScript== // @name WAZEPT Segments // @version 2020.10.15 // @description Facilitates the standardization of segments // @author J0N4S13 ([email protected]) // @include /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/ // @exclude https://www.waze.com/user/*editor/* // @exclude https://www.waze.com/*/user/*editor/* // @grant none // @namespace https://gf.qytechs.cn/users/218406 // ==/UserScript== (function() { var version = GM_info.script.version; setTimeout(function() { var myVar = setInterval(myTimer, 500); if(W.loginManager.getUserRank()>2) var split = setInterval(insertButtons, 500); }, 2000); var indexselected = ""; var valueselected = ""; var array_data = {}; var array_roads = {}; function receivedata() { return new Promise(resolve => { var url_data = "https://spreadsheets.google.com/feeds/list/1s_vcC-ENS7JdkVmVH2QceGMA058tan2UUPlQGd6AhwU/1/public/values?alt=json"; $.getJSON(url_data, function(data) { var entry = data.feed.entry; $(entry).each(function(){ var elem = [this.gsx$emoji.$t, this.gsx$descricao.$t, this.gsx$bloqueio.$t]; array_data[ this.gsx$funcionalidade.$t ] = elem; array_roads[this.gsx$funcionalidade.$t] = [this.gsx$emoji.$t, this.gsx$descricao.$t]; }); }); var timer = setInterval(check_data, 100); function check_data() { if(eval("array_data['SEG_ESTACIONAMENTO'] !== undefined")) { clearInterval(timer); resolve('true'); } } }); } function optionsUser() { var $auto_link; var $settings = $('<li><a href="#sidepanel-LAND" data-toggle="tab" aria-expanded="true">LAND</a></li>'); $("#user-tabs ul").append($settings); var $home = $('<div id="sidepanel-LAND" class="tab-pane"><b>WME Landmark</b><br><br><b><i>Definições</i></b><br><br>'); var div_sidepnale = document.createElement("div"); div_sidepnale.id = "sidepanel-LAND"; div_sidepnale.className = "tab-pane"; var label_home = document.createElement("label"); label_home.innerHTML = 'WAZEPT Landmark (Version: ' + version + ")"; label_home.style.cssText = 'font-size: 15px;color:blue;'; div_sidepnale.appendChild(label_home); $("div.tab-content")[0].prepend(div_sidepnale); } async function dataCall() { var result = await receivedata(); //optionsUser(); } setTimeout(() => { dataCall(); }, 500); function myTimer() { var n_bloqueio; var nivel; var lvl_atual; var lvl_max; var typeData = null; if(eval("W.selectionManager.getSelectedFeatures()[0] !== undefined")) typeData = W.selectionManager.getSelectedFeatures()[0].model.type; if(typeData == "segment") { if (!$("#signsroad").length) { var signsroad = document.createElement("div"); signsroad.id = 'signsroad'; $.each(array_roads, function(func , emoji) { // The sign background var addsign = document.createElement("div"); addsign.id = 'sign_' + func; // Get width/height of sign background img addsign.style.cssText = 'cursor:pointer;float:left;width:34px;height:34px;'; // Credits for some of these parts go to t0cableguy & Rickzabel addsign.onclick = function() { indexselected = func; if(indexselected == 'SEG_ESTACIONAMENTO') { defineRoadType(20); defineSpeed("30"); defineLockRankRoad(array_data['SEG_ESTACIONAMENTO'][2]); defineStreetRoad(""); } if(indexselected == 'SEG_SECUNDARIA') { defineRoadType(1); defineSpeed("50"); defineLockRankRoad(array_data['SEG_SECUNDARIA'][2]); } if(indexselected == 'SEG_PRINCIPAL') { defineRoadType(2); defineSpeed("50"); defineLockRankRoad(array_data['SEG_PRINCIPAL'][2]); } if(indexselected == 'SEG_MUNICIPAL') { defineRoadType(7); defineSpeed("90"); defineLockRankRoad(array_data['SEG_MUNICIPAL'][2]); } if(indexselected == 'SEG_NACIONAL') { defineRoadType(6); defineSpeed("90"); defineLockRankRoad(array_data['SEG_NACIONAL'][2]); } if(indexselected == 'SEG_RESERVADA') { defineRoadType(3); defineSpeed("100"); defineLockRankRoad(array_data['SEG_RESERVADA'][2]); } if(indexselected == 'SEG_AUTOESTRADA') { defineRoadType(3); defineSpeed("120"); defineLockRankRoad(array_data['SEG_AUTOESTRADA'][2]); } if(indexselected == 'LD_ROTUNDA') { let coords = []; let segsfeitos = []; let segmentos = W.selectionManager.getSelectedFeatures()[0].model.getRoundabout().attributes.segIDs; let primeiro = W.selectionManager.getSelectedFeatures()[0].model.attributes.id; let segmento = primeiro; let feitos = 0; do{ let seg = W.selectionManager.model.segments.getObjectById(segmento); let geo = seg.geometry.components for (let i=0; i<geo.length - 1; i++) { let linha = [geo[i].x, geo[i].y]; coords.push(linha); } W.selectionManager.model.nodes.getObjectById(seg.attributes.toNodeID).attributes.segIDs.forEach(function(aux){ if(aux != segmento && segmentos.includes(aux) && !segsfeitos.includes(aux)) { segsfeitos.push(segmento); segmento = aux; } }); feitos++; } while (feitos < segmentos.length) let AddLandmark= require("Waze/Action/AddLandmark"); var wazefeatureVectorLandmark = require("Waze/Feature/Vector/Landmark"); var poi = new wazefeatureVectorLandmark(); var geometry = new OpenLayers.Geometry.Polygon(); var TabLine2 = []; for (var n=0; n < coords.length; n++) { var point = new OpenLayers.Geometry.Point(coords[n][0] ,coords[n][1]); TabLine2.push(point); } var LineString2 = new OpenLayers.Geometry.LinearRing(TabLine2); poi.geometry = new OpenLayers.Geometry.Polygon(LineString2); poi.attributes.categories = new Array("FARM","JUNCTION_INTERCHANGE"); let rank = array_data['LD_ROTUNDA'][2]; rank--; let bloquear; if(W.loginManager.user.rank >= rank) bloquear = rank; else bloquear = W.loginManager.user.rank; poi.attributes.lockRank = bloquear; W.model.actionManager.add(new AddLandmark(poi)); } if(indexselected == 'DATA_PORTAGENS') { let myRoad = W.selectionManager.getSelectedFeatures()[0].model.attributes; var from = ""; var to = ""; var sentido = ""; if(myRoad.fwdDirection == true && myRoad.revDirection == true) { $( "#divSentidos" ).show(); } else { if(myRoad.fwdDirection == true) //A to B { from = myRoad.fromNodeID; to = myRoad.toNodeID; sentido = "TRUE"; } else if(myRoad.revDirection == true)//B to A { from = myRoad.toNodeID; to = myRoad.fromNodeID; sentido = "FALSE"; } var $temp = $("<input>"); $("body").append($temp); $temp.val(sentido + "|" + $('a[class=permalink]').attr('href') + "|" + from + "|" + to).select(); document.execCommand("copy"); $temp.remove(); } } } if($('span[class=full-address]').text().indexOf('Portugal') != -1 || func == "DATA_PORTAGENS") { var emojivalue = document.createElement("div"); emojivalue.id = 'emoji_' + func; emojivalue.style.cssText = 'text-align:center;font-size:14px;visibility:visible;'; emojivalue.innerHTML = emoji[0]; emojivalue.title = emoji[1]; addsign.appendChild(emojivalue); signsroad.appendChild(addsign); } }); var btnAB = document.createElement("button"); btnAB.innerHTML = 'A->B'; btnAB.id = 'btnAB'; btnAB.style.cssText = 'height: 20px;font-size:11px'; btnAB.onclick = function() { let myRoad = W.selectionManager.getSelectedFeatures()[0].model.attributes; if(myRoad.fwdDirection == true) //A to B { var $temp = $("<input>"); $("body").append($temp); $temp.val("TRUE" + "|" + $('a[class=permalink]').attr('href') + "|" + myRoad.fromNodeID + "|" + myRoad.toNodeID).select(); document.execCommand("copy"); $temp.remove(); } } var btnBA = document.createElement("button"); btnBA.innerHTML = 'B->A'; btnBA.id = 'btnBA'; btnBA.style.cssText = 'height: 20px;font-size:11px'; btnBA.onclick = function() { let myRoad = W.selectionManager.getSelectedFeatures()[0].model.attributes; if(myRoad.revDirection == true) //B to A { var $temp = $("<input>"); $("body").append($temp); $temp.val("FALSE" + "|" + $('a[class=permalink]').attr('href') + "|" + myRoad.toNodeID + "|" + myRoad.fromNodeID).select(); document.execCommand("copy"); $temp.remove(); } } var divSentidos = document.createElement("div"); divSentidos.id = 'divSentidos'; divSentidos.appendChild(btnAB); divSentidos.appendChild(btnBA); var divLandmarkScript = document.createElement("div"); divLandmarkScript.id = 'divLandmarkScript'; divLandmarkScript.style.cssText = 'float:left;'; divLandmarkScript.appendChild(signsroad); divLandmarkScript.appendChild(divSentidos); $("div #segment-edit-general").prepend(divLandmarkScript); $( "#divSentidos" ).hide(); } } } function getSelectedVenue() { const features = WazeWrap.getSelectedFeatures(); // Be sure to check for features.length === 1, in case multiple venues are currently selected. return features.length === 1 && features[0].model.type === 'venue' ? features[0].model : undefined; } function defineSpeed (speed) { let UpdateObject= require("Waze/Action/UpdateObject"); $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) { var seg_id = segment.model.getID(); var seg = W.model.segments.getObjectById(seg_id); if(segment.model.attributes.fwdMaxSpeed == null && segment.model.attributes.fwdMaxSpeed == null) W.model.actionManager.add(new UpdateObject(seg, {'fwdMaxSpeed': speed, 'revMaxSpeed': speed})); else if(segment.model.attributes.fwdMaxSpeed == null) W.model.actionManager.add(new UpdateObject(seg, {'fwdMaxSpeed': speed})); else if(segment.model.attributes.fwdMaxSpeed == null) W.model.actionManager.add(new UpdateObject(seg, {'revMaxSpeed': speed})); }); } function defineRoadType (type) { let UpdateObject= require("Waze/Action/UpdateObject"); $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) { var seg_id = segment.model.getID(); var seg = W.model.segments.getObjectById(seg_id); W.model.actionManager.add(new UpdateObject(seg, {'roadType': type})); }); } function defineLockRankRoad (rank) { let UpdateObject= require("Waze/Action/UpdateObject"); rank--; var bloquear; if(W.loginManager.user.rank >= rank) bloquear = rank; else bloquear = W.loginManager.user.rank; $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) { let lock = segment.model.attributes.lockRank; var seg_id = segment.model.getID(); var seg = W.model.segments.getObjectById(seg_id); if(lock < bloquear) W.model.actionManager.add(new UpdateObject(seg, {'lockRank': bloquear})); }); } function defineStreetRoad(street) { let UpdateFeatureAddress = require("Waze/Action/UpdateFeatureAddress"); $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) { var seg_id = segment.model.getID(); if(seg_id == "-100") { $("input[id=empty-street]").prop('checked', true).change().focusout(); $("input[id=empty-city]").prop('checked', true).change().focusout(); $(".save-button.waze-btn.waze-btn-blue.waze-btn-smaller").trigger('click'); } else { var seg = W.model.segments.getObjectById(seg_id); var address = segment.model.getAddress().attributes; var newAddressAtts = { streetName: street, emptyStreet: street==""?true:false, cityName: "", emptyCity: true, countryID: address.country.id }; W.model.actionManager.add(new UpdateFeatureAddress(seg, newAddressAtts,{streetIDField:"primaryStreetID"})); } }); } // Split Segments function insertButtons() { if (W.selectionManager.getSelectedFeatures().length !== 1) return; try { if (document.getElementById('split-segment') !== null) return; } catch (e) {} var btn1 = $('<button class="action-button waze-btn waze-btn-white" title="Criar dois novos segmentos">Dividir em 2 segmentos paralelos</button>'); btn1.click(createSegments); var strMeters = "metros"; // 2014-01-09: Add River Width Combobox var selSegmentsDistance = $('<select id="segmentsDistance" data-type="numeric" class="form-control" />'); selSegmentsDistance.append($('<option value="5">5 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="7">7 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="9">9 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="11">11 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="13">13 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="15">15 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="17">17 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="19">19 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="21">21 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="23">23 ' + strMeters + '</option>')); selSegmentsDistance.append($('<option value="25">25 ' + strMeters + '</option>')); var cnt = $('<div id="split-segment" />'); var divGroup1 = $('<div class="form-group" />'); divGroup1.append($('<label class="control-label">Distância entre os dois segmentos paralelos:</label>')); divGroup1.append(selSegmentsDistance); var divControls1 = $('<div class="controls-container" />'); divGroup1.append(divControls1); cnt.append(divGroup1); var divGroup2 = $('<div class="form-group"/>'); var divControls2 = $('<div class="btn-toolbar" />'); divControls2.append(btn1); divGroup2.append(divControls2); cnt.append(divGroup2); $(cnt).insertAfter("#segment-edit-general .more-actions"); selSegmentsDistance = document.getElementById('segmentsDistance'); if (selSegmentsDistance !== null) { for (var i = 0; i < selSegmentsDistance.options.length; i++) { if (selSegmentsDistance.options[i].value == localStorage.getItem("metersSplitSegment")) { selSegmentsDistance.selectedIndex = i; break; } } } $('#segmentsDistance').change(function(){ localStorage.setItem("metersSplitSegment", $("#segmentsDistance").val()); }); } localStorage.setItem("metersSplitSemgment", JSON.stringify(_settings)); function createSegments() { var wazefeatureVectorSegment = require("Waze/Feature/Vector/Segment"); var UpdateSegmentGeometry= require("Waze/Action/UpdateSegmentGeometry"); var UpdateObject= require("Waze/Action/UpdateObject"); var sel = W.selectionManager.getSelectedFeatures()[0].model; var streetVertices = sel.geometry.getVertices(); var esquerdaPoints = null; var direitaPoints = null; var i; var leftPa, rightPa, leftPb, rightPb; var prevLeftEq, prevRightEq; var displacement = $( "#segmentsDistance" ).val(); var first = 0; for (i = first; i < streetVertices.length - 1; i++) { var pa = streetVertices[i]; var pb = streetVertices[i + 1]; var points = [pa, pb]; var ls = new OpenLayers.Geometry.LineString(points); var len = ls.getGeodesicLength(W.map.getProjectionObject()); var scale = (len + displacement / 2) / len; leftPa = pa.clone(); leftPa.resize(scale, pb, 1); rightPa = leftPa.clone(); leftPa.rotate(90, pa); rightPa.rotate(-90, pa); leftPb = pb.clone(); leftPb.resize(scale, pa, 1); rightPb = leftPb.clone(); leftPb.rotate(-90, pb); rightPb.rotate(90, pb); var leftEq = getEquation({ 'x1': leftPa.x, 'y1': leftPa.y, 'x2': leftPb.x, 'y2': leftPb.y }); var rightEq = getEquation({ 'x1': rightPa.x, 'y1': rightPa.y, 'x2': rightPb.x, 'y2': rightPb.y }); if (esquerdaPoints === null && direitaPoints === null) { esquerdaPoints = [leftPa]; direitaPoints = [rightPa]; } else { var li = intersectX(leftEq, prevLeftEq); var ri = intersectX(rightEq, prevRightEq); if (li && ri) { if (i >= 0) { esquerdaPoints.unshift(li); direitaPoints.push(ri); if (i == 0) { esquerdaPoints = [li]; direitaPoints = [ri]; } } } else { if (i >= 0) { esquerdaPoints.unshift(leftPb.clone()); direitaPoints.push(rightPb.clone()); if (i == 0) { esquerdaPoints = [leftPb]; direitaPoints = [rightPb]; } } } } prevLeftEq = leftEq; prevRightEq = rightEq; } esquerdaPoints.push(leftPb); direitaPoints.push(rightPb); esquerdaPoints.unshift(esquerdaPoints[esquerdaPoints.length-1]); esquerdaPoints.pop(); var newSegEsq = sel.attributes.geometry.clone(); var newSegDir = sel.attributes.geometry.clone(); var segmentos = SplitSegment(sel); newSegEsq.components = esquerdaPoints.reverse(); newSegDir.components = direitaPoints; var segmentoEsquerdo = W.model.segments.getObjectById(segmentos[0]); var segmentoDireito = W.model.segments.getObjectById(segmentos[1]); W.model.actionManager.add(new UpdateSegmentGeometry(segmentoEsquerdo,segmentoEsquerdo.geometry,newSegEsq)); W.model.actionManager.add(new UpdateSegmentGeometry(segmentoDireito,segmentoDireito.geometry,newSegDir)); W.model.actionManager.add(new UpdateObject(segmentoEsquerdo, {'revDirection': false})); W.model.actionManager.add(new UpdateObject(segmentoDireito, {'fwdDirection': false})); } function getEquation(segment) { if (segment.x2 == segment.x1) return { 'x': segment.x1 }; var slope = (segment.y2 - segment.y1) / (segment.x2 - segment.x1); var offset = segment.y1 - (slope * segment.x1); return { 'slope': slope, 'offset': offset }; } function intersectX(eqa, eqb, defaultPoint) { if ("number" == typeof eqa.slope && "number" == typeof eqb.slope) { if (eqa.slope == eqb.slope) return null; var ix = (eqb.offset - eqa.offset) / (eqa.slope - eqb.slope); var iy = eqa.slope * ix + eqa.offset; return new OpenLayers.Geometry.Point(ix, iy); } else if ("number" == typeof eqa.x) { return new OpenLayers.Geometry.Point(eqa.x, eqb.slope * eqa.x + eqb.offset); } else if ("number" == typeof eqb.y) { return new OpenLayers.Geometry.Point(eqb.x, eqa.slope * eqb.x + eqa.offset); } return null; } function SplitSegment(road) { let SplitSegments= require("Waze/Action/SplitSegments"); let UpdateSegmentGeometry= require("Waze/Action/UpdateSegmentGeometry"); if(road.arePropertiesEditable()) { var geo=road.geometry.clone(); var action=null; if(geo.components.length<2) { return undefined; } if(geo.components.length==2) { geo.components.splice(1,0,new OpenLayers.Geometry.Point(((geo.components[1].x+geo.components[0].x)/2),((geo.components[1].y+geo.components[0].y)/2))); W.model.actionManager.add(new UpdateSegmentGeometry(road,road.geometry,geo)); } action=new SplitSegments(road,{splitAtPoint:road.geometry.components[Math.ceil(road.geometry.components.length/2-1)]}); W.model.actionManager.add(action); var RoadIds=new Array(); if(action.splits!==null) { for(var i=0;i<action.splits.length;i++) { RoadIds.push(action.splits[i].attributes.id); } } return RoadIds; } } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址