WME Place NavPoints

Add place entry point indicators to the map

目前為 2020-09-10 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name WME Place NavPoints
  3. // @namespace WazeDev
  4. // @version 2020.09.09.001
  5. // @description Add place entry point indicators to the map
  6. // @author MapOMatic
  7. // @include /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/
  8. // @require https://gf.qytechs.cn/scripts/24851-wazewrap/code/WazeWrap.js
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. /* global W */
  13. /* global OpenLayers */
  14. /* global $ */
  15. /* global WazeWrap */
  16.  
  17. const _settings = {
  18. visible: true,
  19. plaVisible: true
  20. };
  21.  
  22. function drawLines() {
  23. const layer = W.map.venueLayer;
  24. layer.removeFeatures(layer.getFeaturesByAttribute('isNavLine', true));
  25. if (_settings.visible && W.map.getZoom() >= 6) {
  26. const features = [];
  27. const bounds = W.map.getExtent().scale(2.0);
  28. W.model.venues.getObjectArray()
  29. .filter(venue => (_settings.plaVisible || !venue.isParkingLot()) && bounds.intersectsBounds(venue.geometry.getBounds()))
  30. .forEach(venue => {
  31. const pts = [];
  32. pts.push(venue.geometry.getCentroid());
  33. if (venue.attributes.entryExitPoints.length) {
  34. pts.push(venue.attributes.entryExitPoints[0].getPoint());
  35. }
  36. const s = findClosestSegment(pts[pts.length - 1], false, false, venue);
  37. if (s) {
  38. pts.push(s.closestPoint);
  39. const ls = new OpenLayers.Geometry.LineString(pts);
  40. features.push(new OpenLayers.Feature.Vector(ls, { isNavLine: true }, { strokeColor: '#0FF', strokeWidth: 2, strokeDashstyle: '6 4' }));
  41. }
  42. features.push(
  43. new OpenLayers.Feature.Vector(
  44. pts[pts.length - 1],
  45. { isNavLine: true },
  46. {
  47. pointRadius: 4,
  48. strokeWidth: 2,
  49. fillColor: '#A00',
  50. strokeColor: '#0FF',
  51. fillOpacity: 1
  52. }
  53. )
  54. );
  55. });
  56. layer.addFeatures(features);
  57. }
  58. }
  59.  
  60. function findClosestSegment(mygeometry, ignorePLR, ignoreUnnamedPR, venue) {
  61. const segments = W.model.segments.getObjectArray();
  62. let minDistance = Infinity;
  63. let closestSegment;
  64.  
  65. segments.forEach(segment => {
  66. const { roadType } = segment.attributes;
  67. let ignoreForRpp = false;
  68. const segmentStreetID = segment.attributes.primaryStreetID;
  69.  
  70. if (venue.isResidential() && !venue.attributes.entryExitPoints.length) {
  71. const venueStreetID = venue.attributes.streetID;
  72. ignoreForRpp = !(segmentStreetID === venueStreetID
  73. || (WazeWrap.Model.getStreetName(venueStreetID) === WazeWrap.Model.getStreetName(segmentStreetID)
  74. && WazeWrap.Model.getCityName(venueStreetID) === WazeWrap.Model.getStreetName(segmentStreetID)));
  75. }
  76.  
  77. if (!ignoreForRpp
  78. && !segment.isDeleted()
  79. && ![10, 16, 18, 19].includes(roadType) // 10 ped boardwalk, 16 stairway, 18 railroad, 19 runway, 3 freeway
  80. && !(ignorePLR && roadType === 20) // PLR
  81. && !(ignoreUnnamedPR && roadType === 17 && WazeWrap.Model.getStreetName(segmentStreetID) === null)) { // PR
  82. const distanceToSegment = mygeometry.distanceTo(segment.geometry, { details: true });
  83. if (distanceToSegment.distance < minDistance) {
  84. minDistance = distanceToSegment.distance;
  85. closestSegment = segment;
  86. closestSegment.closestPoint = new OpenLayers.Geometry.Point(distanceToSegment.x1, distanceToSegment.y1);
  87. }
  88. }
  89. });
  90. return closestSegment;
  91. }
  92.  
  93. function saveSettings() {
  94. localStorage.setItem('wme_place_navpoints', JSON.stringify(_settings));
  95. }
  96.  
  97. function errorHandler(callback) {
  98. try {
  99. callback();
  100. } catch (ex) {
  101. console.error(ex);
  102. }
  103. }
  104.  
  105. function onPlacesLayerCheckedChanged(checked) {
  106. _settings.visible = checked;
  107. $('#layer-switcher-item_pla_navpoints').attr('disabled', checked ? null : true);
  108. saveSettings();
  109. drawLines();
  110. }
  111.  
  112. function onPlaLayerCheckedChanged(checked) {
  113. _settings.plaVisible = checked;
  114. saveSettings();
  115. drawLines();
  116. }
  117.  
  118. function init() {
  119. const loadedSettings = JSON.parse(localStorage.getItem('wme_place_navpoints'));
  120. $.extend(_settings, loadedSettings);
  121. const drawLinesFunc = () => errorHandler(drawLines);
  122. W.model.events.register('mergeend', null, drawLinesFunc);
  123. W.map.events.register('zoomend', null, drawLinesFunc);
  124. W.model.venues.on('objectschanged', drawLinesFunc);
  125. W.model.venues.on('objectsadded', drawLinesFunc);
  126. W.model.venues.on('objectsremoved', drawLinesFunc);
  127. W.model.segments.on('objectschanged', drawLinesFunc);
  128. W.model.segments.on('objectsadded', drawLinesFunc);
  129. W.model.segments.on('objectsremoved', drawLinesFunc);
  130. drawLines();
  131. WazeWrap.Interface.AddLayerCheckbox('Display', 'Place NavPoints', _settings.visible, onPlacesLayerCheckedChanged, null);
  132. WazeWrap.Interface.AddLayerCheckbox('Display', 'PLA NavPoints', _settings.visible, onPlaLayerCheckedChanged, null);
  133. $('#layer-switcher-item_pla_navpoints').attr('disabled', _settings.visible ? null : true).parent().css({ 'margin-left': '10px' });
  134. }
  135.  
  136. function bootstrap() {
  137. if (W && W.map && WazeWrap.Ready) {
  138. init();
  139. } else {
  140. setTimeout(bootstrap, 200);
  141. }
  142. }
  143.  
  144. bootstrap();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址