WME GIS Buttons

Displays the locality of the current location and provides links to open GIS if available

当前为 2018-09-22 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name WME GIS Buttons
  3. // @author @Philistine11
  4. // @namespace https://greasyfork.org/en/users/53803
  5. // @description Displays the locality of the current location and provides links to open GIS if available
  6. // @include https://*.waze.com/editor*
  7. // @include https://*.waze.com/*/editor*
  8. // @version 1.5.1
  9. // ==/UserScript==
  10.  
  11. function gis_init(model, modeId) {
  12. W.app.modeController.model.bind('change:mode', gis_init);
  13. if (modeId === 1)
  14. return;
  15.  
  16. var location = $('div.location-info-region');
  17. if (location.length === 0) {
  18. setTimeout(gis_init, 500);
  19. return;
  20. }
  21. location.after('<div class="input-group input-group-sm" style="float:left; padding-left:2rem;"><span class="input-group-addon" style="display:table-cell; font-size:2rem; line-height:0; width:0;"><span id="gisStatus" class="fa fa-spinner fa-pulse" style="line-height:0;"></span></span><div class="input-group-btn" style="width:0;"><a id="gisLocality" class="btn btn-default disabled hidden" style="border:1px solid" target="_blank" href="#">Locality</a><a id="gisCounty" class="btn btn-default disabled hidden" style="border:1px solid" target="_blank" href="#">County</a><a id="gisState" class="btn btn-default disabled hidden" style="border:1px solid" target="_blank" href="#">State</a></span></div>');
  22.  
  23. var GISButtonsOn = JSON.parse(localStorage.getItem('GISButtonsOn'));
  24. var GISButtonsAPIKey = localStorage.getItem('GISButtonsAPIKey');
  25. $('#gisStatus').click(() => {
  26. GISButtonsOn = !GISButtonsOn;
  27. localStorage.setItem('GISButtonsOn', GISButtonsOn);
  28. start();
  29. }).contextmenu(() => {
  30. do {
  31. GISButtonsAPIKey = prompt("Enter your GIS Buttons API key:", GISButtonsAPIKey || "").trim();
  32. } while (!GISButtonsAPIKey || GISButtonsAPIKey.length != 39);
  33. localStorage.setItem('GISButtonsAPIKey', GISButtonsAPIKey);
  34. start();
  35. return false;
  36. });
  37.  
  38. var trigger;
  39. var setTrigger = () => {if (GISButtonsAPIKey) trigger = setTimeout(update, 1000);}
  40. var clearTrigger = () => clearTimeout(trigger);
  41.  
  42. var states = {};
  43. var start = () => {
  44. new Promise((resolve, reject) => {
  45. if (Object.keys(states).length == 0)
  46. $.getJSON('https://script.google.com/macros/s/AKfycbx2bytvT5Un0TWcaU7BpVkauqeE8zqt8Mek7Zq-OF-bznGYDyZw/exec?link=10dR8z16eKPHeI-ywLcHh2UNS3enQ7gt36Hhzm9nOJbA', rows => {
  47. for (var row in rows)
  48. states[rows[row][0]] = rows[row][1];
  49. });
  50. resolve();
  51. }).then(() =>{
  52. if (GISButtonsOn) {
  53. if (GISButtonsAPIKey) {
  54. W.map.events.register('movestart', null, clearTrigger);
  55. W.map.events.register('moveend', null, setTrigger);
  56. update();
  57. } else
  58. $('#gisStatus').removeClass().addClass('fa fa-key').css('color','red').attr('title',"Right-click to set GIS Buttons API Key");
  59. } else {
  60. W.map.events.unregister('movestart', null, clearTrigger);
  61. W.map.events.unregister('moveend', null, setTrigger);
  62. $('#gisLocality, #gisCounty, #gisState').addClass('hidden');
  63. $('#gisStatus').removeClass().addClass('fa fa-power-off').css('color','red').attr('title',"Click to turn on GIS Buttons");
  64. }
  65. });
  66. }
  67.  
  68. var update = () => {
  69. $('#gisStatus').removeClass().addClass('fa fa-spinner fa-pulse').css('color','').attr('title','');
  70. var center = W.map.getCenter().transform(new OL.Projection('EPSG:900913'), new OL.Projection('EPSG:4326'));
  71. $.getJSON(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${center.lat},${center.lon}&key=${GISButtonsAPIKey}`, data => {
  72. if (data.status === 'OK') {
  73. var locs = data.results[0].address_components;
  74. var locality = '', county = '', state = '';
  75. $('#gisLocality, #gisCounty, #gisState').addClass('hidden');
  76. for (var loc = 0; loc < locs.length; loc++) {
  77. if (locs[loc].types.indexOf('administrative_area_level_1') !== -1) {
  78. state = locs[loc].long_name;
  79. $('#gisState').removeClass('hidden').text(state);
  80. } else if (locs[loc].types.indexOf('administrative_area_level_2') !== -1) {
  81. county = locs[loc].long_name;
  82. $('#gisCounty').removeClass('hidden').text(county);
  83. } else if (locs[loc].types.indexOf('locality') !== -1) {
  84. locality = locs[loc].long_name;
  85. $('#gisLocality').removeClass('hidden').text(locality);
  86. }
  87. }
  88.  
  89. $('#gisLocality, #gisCounty, #gisState').prop('href', '#').addClass('disabled');
  90.  
  91. new Promise((resolve, reject) => {
  92. if (states.hasOwnProperty(state)) {
  93. resolve(new Promise((resolve, reject) => {
  94. if (typeof (states[state]) === 'string')
  95. $.getJSON(`https://script.google.com/macros/s/AKfycbx2bytvT5Un0TWcaU7BpVkauqeE8zqt8Mek7Zq-OF-bznGYDyZw/exec?link=${states[state]}`, rows => {
  96. states[state] = rows;
  97. resolve();
  98. });
  99. else
  100. resolve();
  101. }).then(() => {
  102. for (var row in states[state])
  103. if (states[state][row][2] !== '')
  104. if (states[state][row][1] === 'State') {
  105. $('#gisState').prop('href', states[state][row][2].replace('<lat>',center.lat).replace('<lon>',center.lon).replace('<zoom>',W.map.getZoom()+12)).removeClass('disabled');
  106. } else if (states[state][row][1] === 'County') {
  107. if (county.indexOf(states[state][row][0]) != -1)
  108. $('#gisCounty').prop('href', states[state][row][2].replace('<lat>',center.lat).replace('<lon>',center.lon).replace('<zoom>',W.map.getZoom()+12)).removeClass('disabled');
  109. } else if (states[state][row][0] === locality)
  110. $('#gisLocality').prop('href', states[state][row][2].replace('<lat>',center.lat).replace('<lon>',center.lon).replace('<zoom>',W.map.getZoom()+12)).removeClass('disabled');
  111. }));
  112. }
  113. resolve();
  114. }).then(() => $('#gisStatus').removeClass().addClass('fa fa-power-off').css('color','green').attr('title',"Click to turn off GIS Buttons")).catch(error => console.warn(error));
  115. } else {
  116. console.error("GIS Buttons", data);
  117. $('#gisStatus').removeClass().addClass('fa fa-exclamation-circle').css('color','red').attr('title', "Check console for errors");
  118. }
  119. });
  120. };
  121.  
  122. start();
  123. }
  124.  
  125. gis_init();