WME OpenMaps

Add an additional layer containing maps that are released as open data to Waze Map Editor

当前为 2015-11-24 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name WME OpenMaps
  3. // @namespace http://www.tomputtemans.com/
  4. // @description Add an additional layer containing maps that are released as open data to Waze Map Editor
  5. // @include https://www.waze.com/*/editor/*
  6. // @include https://www.waze.com/editor/*
  7. // @include https://editor-beta.waze.com/*
  8. // @version 2.2
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. function omInit() {
  14. // Check initialisation
  15. if (typeof Waze === 'undefined' || typeof Waze.map === 'undefined' || typeof Waze.model.countries.top === 'undefined') {
  16. setTimeout(omInit, 660);
  17. log('Waze object unavailable, map still loading');
  18. return;
  19. }
  20. log('OM initated');
  21.  
  22. // set up language string
  23. var om_strings = {
  24. en: {
  25. opacity_label: "Opacity",
  26. tab_title: "Open Maps",
  27. no_map_selected: "No map",
  28. maptype: {
  29. cadastre: "Cadastre",
  30. satellite: "Satellite"
  31. }
  32. },
  33. nl: {
  34. opacity_label: "Doorzichtigheid",
  35. tab_title: "Open Maps",
  36. no_map_selected: "Geen kaart",
  37. maptype: {
  38. cadastre: "Kadaster",
  39. satellite: "Satelliet"
  40. }
  41. },
  42. fr: {
  43. opacity_label: "Opacité",
  44. tab_title: "Open Maps",
  45. no_map_selected: "Aucune carte",
  46. maptype: {
  47. cadastre: "Cadastre",
  48. satellite: "Satellite"
  49. }
  50. }
  51. };
  52. om_strings['en_GB'] = om_strings.en;
  53. I18n.availableLocales.map(function(locale) {
  54. if (I18n.translations[locale]) {
  55. I18n.translations[locale].openmaps = om_strings[locale];
  56. }
  57. });
  58. if (typeof localStorage.OM_opacity == 'undefined') {
  59. localStorage.OM_opacity = 100;
  60. }
  61.  
  62. var OpenMaps = (function() {
  63. var userInfo = document.getElementById('user-info'),
  64. navTabs = userInfo.querySelector('.nav-tabs'),
  65. tabContent = userInfo.querySelector('.tab-content'),
  66. openMapsTab = document.createElement('li'),
  67. openMapsContent = document.createElement('div'),
  68. openMapsTitle = document.createElement('h4'),
  69. openMapsSelector = document.createElement('select'),
  70. noMapOption = document.createElement('option'),
  71. footer = document.createElement('p'),
  72. categories = [],
  73. maps = [],
  74. emptyLayer = new OL.Layer("Open Maps"),
  75. activeLayer = emptyLayer,
  76. opacitySlider = document.createElement('input'),
  77. opacityLabel = document.createElement('label'),
  78. opacityDiv = document.createElement('div');
  79.  
  80. openMapsTab.innerHTML = '<a href="#sidepanel-openMaps" data-toggle="tab" title="' + I18n.t('openmaps.tab_title') + '"><span class="icon-picture"></span></a>';
  81. openMapsContent.id = 'sidepanel-openMaps';
  82. openMapsContent.className = 'tab-pane';
  83. openMapsTitle.appendChild(document.createTextNode(I18n.t('openmaps.tab_title')));
  84. openMapsTitle.style.marginBottom = '5px';
  85. openMapsContent.appendChild(openMapsTitle);
  86. openMapsSelector.className = 'form-control';
  87. noMapOption.appendChild(document.createTextNode(I18n.t('openmaps.no_map_selected')));
  88. noMapOption.layer = emptyLayer;
  89. openMapsSelector.appendChild(noMapOption);
  90. openMapsSelector.addEventListener('change', function(event) {
  91. localStorage.OM_previousMap = openMapsSelector.options[openMapsSelector.selectedIndex].value;
  92. replaceLayer(openMapsSelector.options[openMapsSelector.selectedIndex].layer);
  93. });
  94. openMapsSelector.style.marginBottom = '5px';
  95. openMapsContent.appendChild(openMapsSelector);
  96. navTabs.appendChild(openMapsTab);
  97. tabContent.appendChild(openMapsContent);
  98.  
  99. opacityDiv.className = 'form-group';
  100. opacitySlider.type = 'range';
  101. opacitySlider.max = 100;
  102. opacitySlider.min = 5;
  103. opacitySlider.step = 5;
  104. opacitySlider.id = "openmapsOpacity";
  105. opacitySlider.value = localStorage.OM_opacity;
  106. opacitySlider.style.verticalAlign = 'middle';
  107. opacitySlider.addEventListener('input', function() {
  108. maps.forEach(function(map) {
  109. map.layer.setOpacity(opacitySlider.value / 100);
  110. });
  111. localStorage.OM_opacity = opacitySlider.value;
  112. });
  113. opacityLabel.appendChild(document.createTextNode(I18n.t('openmaps.opacity_label') + ':'));
  114. opacityLabel.className = "control-label";
  115. opacityLabel.style.marginRight = '10px';
  116. opacityLabel.for = "openmapsOpacity";
  117. opacityDiv.appendChild(opacityLabel);
  118. opacityDiv.appendChild(opacitySlider);
  119. openMapsContent.appendChild(opacityDiv);
  120. try {
  121. footer.appendChild(document.createTextNode(GM_info.script.name + ': v' + GM_info.script.version));
  122. } catch(e) {
  123. // Probably no support for GM_info, ignore
  124. }
  125. footer.style.fontSize = '11px';
  126. openMapsContent.appendChild(footer);
  127.  
  128. Waze.map.addLayer(emptyLayer);
  129. // Necessary as the layer doesn't update when a zoom has occurred
  130. Waze.map.events.register('zoomend', null, function() {
  131. if (activeLayer) {
  132. activeLayer.redraw();
  133. }
  134. });
  135.  
  136. // Start listening to any event that changes the maps extent and add/remove the layers as such
  137. Waze.map.events.register("moveend", null, function() {
  138. maps.forEach(function(map) {
  139. if (map.listed && !map.inArea()) {
  140. if (activeLayer === map.layer) {
  141. replaceLayer(emptyLayer);
  142. }
  143. categories[map.category].removeChild(map.option);
  144. map.listed = false;
  145. if (categories[map.category].childNodes.length === 0) {
  146. openMapsSelector.removeChild(categories[map.category]);
  147. categories[map.category] = undefined;
  148. }
  149. } else if (!map.listed && map.inArea()) {
  150. if (!categories[map.category]) {
  151. var optgroup = document.createElement('optgroup');
  152. optgroup.label = I18n.t('openmaps.maptype.' + map.category);
  153. categories[map.category] = optgroup;
  154. openMapsSelector.appendChild(optgroup);
  155. }
  156. categories[map.category].appendChild(map.option);
  157. map.listed = true;
  158. }
  159. })
  160. });
  161. function replaceLayer(targetLayer) {
  162. if (activeLayer === targetLayer) {
  163. return;
  164. }
  165. var layerIndex = Waze.map.getLayerIndex(activeLayer);
  166. Waze.map.removeLayer(activeLayer);
  167. Waze.map.addLayer(targetLayer);
  168. Waze.map.setLayerIndex(targetLayer, layerIndex);
  169. targetLayer.setVisibility(true);
  170. activeLayer = targetLayer;
  171. }
  172. return {
  173. addMap: function(id, name, category, format, url, inArea, params, options) {
  174. var layer = new OL.Layer.WMS(I18n.t('openmaps.tab_title'), url, params, options),
  175. option = document.createElement('option'),
  176. listed = inArea();
  177. option.appendChild(document.createTextNode(name));
  178. option.layer = layer;
  179. option.value = id;
  180. layer.setOpacity(localStorage.OM_opacity / 100);
  181. // Append to select box if the map is in the current area
  182. if (listed) {
  183. if (!categories[category]) {
  184. var optgroup = document.createElement('optgroup');
  185. optgroup.label = I18n.t('openmaps.maptype.' + category);
  186. categories[category] = optgroup;
  187. openMapsSelector.appendChild(optgroup);
  188. }
  189. categories[category].appendChild(option);
  190. }
  191. // Select the map again if it was selected at the end of the previous session
  192. if (localStorage.OM_previousMap == id) {
  193. openMapsSelector.selectedIndex = option.index;
  194. openMapsSelector.dispatchEvent(new Event('change'));
  195. }
  196. maps.push({
  197. name: name,
  198. category: category,
  199. inArea: inArea,
  200. layer: layer,
  201. option: option,
  202. listed: listed
  203. });
  204. }
  205. };
  206. })();
  207.  
  208. // AGIV: Vlaanderen (Belgium)
  209. // <Fees>Gratis</Fees>
  210. // <AccessConstraints>Door het gebruik van deze service, is de gebruiker verplicht zich te houden aan de toegangs- en gebruiksbepalingen van de in deze service aangeboden gegevens.</AccessConstraints>
  211. OpenMaps.addMap(3201, 'AGIV', 'cadastre', 'WMS', 'https://geoservices.informatievlaanderen.be/raadpleegdiensten/GRB-basiskaart/wms',
  212. function() {
  213. var bounds = new OL.Bounds(280525, 6557859, 661237, 6712007);
  214. return bounds.intersectsBounds(Waze.map.getExtent());
  215. },
  216. { layers: "GRB_BSK", format: "image/png" },
  217. { transitionEffect: "resize", tileSize: new OL.Size(512,512), attribution: "Agentschap voor Geografische Informatie Vlaanderen" });
  218.  
  219. // AGIV: Vlaanderen (Belgium)
  220. // <Fees>Gratis</Fees>
  221. // <AccessConstraints>Door het gebruik van deze service, is de gebruiker verplicht zich te houden aan de toegangs- en gebruiksbepalingen van de in deze service aangeboden gegevens.</AccessConstraints>
  222. OpenMaps.addMap(3202, 'AGIV', 'satellite', 'WMS', 'https://geoservices.informatievlaanderen.be/raadpleegdiensten/omwrgbmrvl/wms',
  223. function() {
  224. var bounds = new OL.Bounds(280525, 6557859, 661237, 6712007);
  225. return bounds.intersectsBounds(Waze.map.getExtent());
  226. },
  227. { layers: "Ortho", format: "image/png" },
  228. { transitionEffect: "resize", tileSize: new OL.Size(512,512), projection: new OL.Projection("EPSG:3857"), attribution: "Agentschap voor Geografische Informatie Vlaanderen" });
  229.  
  230. // Projet Informatique de Cartographie Continue: Wallonie (Belgium)
  231. // <Fees></Fees>
  232. // <AccessConstraints></AccessConstraints>
  233. OpenMaps.addMap(3203, 'PICC', 'cadastre', 'WMS', 'https://geoservices.wallonie.be/arcgis/services/TOPOGRAPHIE/PICC/MapServer/WMSServer',
  234. function() {
  235. return Waze.model.countries.top.abbr === 'BE';
  236. },
  237. { layers: "1,2,3,5,6,8,24,25,33,48,49,50,52,53,54,55,56,58,59,60", format: "image/png" },
  238. { transitionEffect: "resize", tileSize: new OL.Size(512,512), projection: new OL.Projection("EPSG:3857"), attribution: "Région wallonne" });
  239.  
  240. // Brussels NL (Belgium)
  241. // <Fees>NONE</Fees>
  242. // <AccessConstraints>NONE</AccessConstraints>
  243. OpenMaps.addMap(3204, 'Irisnet NL', 'cadastre', 'WMS', 'http://geoserver.gis.irisnet.be/geoserver/wms',
  244. function() {
  245. //4.236259,50.760568,4.487572,50.915372
  246. var bounds = new OL.Bounds(471578, 6579050, 499555, 6606337);
  247. return bounds.intersectsBounds(Waze.map.getExtent());
  248. },
  249. { layers: "urbisNL", format: "image/png" },
  250. { transitionEffect: "resize", tileSize: new OL.Size(512,512), projection: new OL.Projection("EPSG:31370"), attribution: "Irisnet GIS" });
  251.  
  252. // Brussels FR (Belgium)
  253. // <Fees>NONE</Fees>
  254. // <AccessConstraints>NONE</AccessConstraints>
  255. OpenMaps.addMap(3205, 'Irisnet FR', 'cadastre', 'WMS', 'http://geoserver.gis.irisnet.be/geoserver/wms',
  256. function() {
  257. //4.236259,50.760568,4.487572,50.915372
  258. var bounds = new OL.Bounds(471578, 6579050, 499555, 6606337);
  259. return bounds.intersectsBounds(Waze.map.getExtent());
  260. },
  261. { layers: "urbisFR", format: "image/png" },
  262. { transitionEffect: "resize", tileSize: new OL.Size(512,512), projection: new OL.Projection("EPSG:31370"), attribution: "Irisnet GIS" });
  263.  
  264. // BAG WMS (The Netherlands)
  265. // <Fees>NONE</Fees>
  266. // <AccessConstraints>HotherRestrictions; Geen beperkingen; http://creativecommons.org/publicdomain/zero/1.0/deed.nl</AccessConstraints>
  267. OpenMaps.addMap(3101, 'BAG', 'cadastre', 'WMS', 'https://geodata.nationaalgeoregister.nl/bag/wms',
  268. function() {
  269. return Waze.model.countries.top.abbr === 'NL';
  270. },
  271. { layers: "ligplaats,pand,verblijfsobject,woonplaats,standplaats", format: "image/png" },
  272. { transitionEffect: "resize", tileSize: new OL.Size(512,512) });
  273.  
  274. // Luchtfoto's Bij12 (The Netherlands)
  275. OpenMaps.addMap(3102, 'Luchtfoto 2014', 'satellite', 'WMS', 'http://webservices.gbo-provincies.nl/lufo/services/wms?',
  276. function() {
  277. return Waze.model.countries.top.abbr === 'NL';
  278. },
  279. { layers: "actueel_zomer", format: "image/jpeg",isBaseLayer: true},
  280. { transitionEffect: "resize", tileSize: new OL.Size(512,512), projection: new OL.Projection("EPSG:28992") });
  281. // BGT (The Netherlands)
  282. // <Fees>NONE</Fees>
  283. // <AccessConstraints>Geen beperkingen; http://creativecommons.org/publicdomain/zero/1.0/deed.nl</AccessConstraints>
  284. OpenMaps.addMap(3103, 'BGT', 'cadastre', 'WMS', 'https://geodata.nationaalgeoregister.nl/bgt/wms?',
  285. function() {
  286. return Waze.model.countries.top.abbr === 'NL';
  287. },
  288. { layers: "bgtomtrekgericht,bgtvulling", format: "image/png" },
  289. { transitionEffect: "resize", tileSize: new OL.Size(512,512), projection: new OL.Projection("EPSG:28992") });
  290. }
  291.  
  292. function log(message) {
  293. console.log('%cWME Open Maps: %c' + message, 'color:black', 'color:#d97e00');
  294. }
  295.  
  296. // attempt to bootstrap after about a second
  297. log('OM bootstrap set');
  298. setTimeout(omInit, 1020);
  299. })();