Greasemonkey Script für OSMCha, achavi Links auf Changeset-Seiten

Wäre so ein ähnliches Skript für Node-/Way-/Relation-Seiten auf osm.org mit Link zu https://wiki.openstreetmap.org/wiki/OSM_History_Viewer_(by_PeWu) möglich?

Die Ansicht ist auch ganz cool :sunglasses: ich versuch mal das zu integrieren :slight_smile:

Hi,

ich hab mal erweitert.

Kurz dazu was ich gemacht hab:

  • @include erweitert auf “https://www.openstreetmap.org/*
  • Dann schau ich im href= ob es ein Way/Node/Relation oder Changeset ist…
  • Wenn Changeset dann die Funktion wie bisher, wenn Way/Node/Relation eine eigene Funktion auf Basis von der Changeset Funktion nur abgewandelt.
  • achavi(test) hab ich hinzugefügt

Code kann integriert werden :wink: verbessert usw. hab es jetzt nach meinem Coding vermögen gemacht… auf die schnelle :wink: :smiley:

// ==UserScript==
// @author        Strubbl
// @name          OpenStreetMap Changeset Analyze URLs
// @description   adds links to achavi and OSMCha to every OSM changeset page
// @include       https://www.openstreetmap.org/*
// @grant         none
// @version       1.1
// @updateURL     https://gitlab.com/Strubbl/userscripts/raw/master/osm_changeset_analyze_urls.user.js
// ==/UserScript==


   var hrefstr = window.location.href

   var n = hrefstr.search("/changeset/");

   if ( n > 0 )
   {
     console.log("changeset");
     osmpage="changeset";
   }

   var n = hrefstr.search("/node/");
   if ( n > 0 )
   {
     console.log("node");
     osmpage="objekt";
     osmobj="node";
     
   }

   var n = hrefstr.search("/way/");
   if ( n > 0 )
   {
     console.log("way");
     osmpage="objekt";
     osmobj="way";
   }

   var n = hrefstr.search("/relation/");
   if ( n > 0 )
   {
     console.log("relation");
     osmpage="objekt";
     osmobj="relation";
   }




// Funktionen für Changeset Seite
if ( osmpage == "changeset" ) {

analyze_names = ["achavi", "achavi(test)", "OSMCha"]
analyze_urls = ["https://overpass-api.de/achavi/?changeset=", "https://dev.overpass-api.de/achavi/?changeset=", "https://osmcha.org/changesets/"]


var cs_headline = document.getElementById("sidebar_content").getElementsByTagName('h2')[0]
var cs_id = 0
var i;
var input_fields = document.getElementsByTagName('input')
var stop_execution = false

// get changeset id
for (i = 0; i < input_fields.length; i++) {
  var check_for_cs_id = input_fields[i].getAttribute("data-changeset-id")
  if(check_for_cs_id) {
    cs_id = check_for_cs_id
    break
  }
}

// copied from post of miche101 https://forum.openstreetmap.org/viewtopic.php?pid=825651#p825651
// https://www.openstreetmap.org/changeset/56501044#map=16/48.1818/11.7873
if(!cs_id) {
   var href = window.location.href
   let regex = /.*changeset\//g;
   let result = href.replace (regex,"");  
   let regexx = /#.*/g;
   let resultx = result.replace (regexx,"");
   cs_id = resultx;
}

if(!cs_id) {
  console.log("osm_changeset_analyze_urls: no changeset id found")
  stop_execution = true
}

if(analyze_names.length != analyze_urls.length) {
  console.log("osm_changeset_analyze_urls: analyze_names and analyze_urls have different length")
  stop_execution = true
}

if(!stop_execution) {
  // generate links html code
  var links_html = ""
  for (i = 0; i < analyze_names.length; i++) {
    links_html += "<a href=\"" + analyze_urls[i] + cs_id + "\" target=\"_blank\">" + analyze_names[i] + "</a> "
  }
  // append links to website
  cs_headline.insertAdjacentHTML('afterend', "<div id=\"osm_changeset_analyze_urls\" style=\"color: #f00; padding-left: 20px;\">" + links_html + "</div>")
}

}




// Funktionen für Objekt Seite (node/way/relation)

if ( osmpage == "objekt" ) {
  
  
  analyze_names = ["OSM History Viewer"]
  // %OBJ% == node, way, relation    %ID% == OSM-ID
  analyze_urls = ["https://pewu.github.io/osm-history/#/%OBJ%/%ID%"]
  
  var cs_headline = document.getElementById("sidebar_content").getElementsByTagName('h2')[0]
  var cs_id = 0;  
  var stop_execution = false;
  

  // Link Example OSM History Viewer
  // https://pewu.github.io/osm-history/#/node/54154220
  // https://pewu.github.io/osm-history/#/way/683125725
  // https://pewu.github.io/osm-history/#/relation/9767454

   console.log("OSM-Objekt mit dem Typ: " + osmobj);
  
  
   var href = window.location.href
   let regex = /.*openstreetmap.org\/[^\/]*\//g;
   let result = href.replace (regex,"");  
   let regexx = /#.*/g;
   let resultx = result.replace (regexx,"");
   cs_id = resultx;
  
   console.log("OSM-Objekt mit der ID: " + cs_id);
  

  
  if(!cs_id) {
    console.log("osm_objekt_analyze_urls: no objekt id found")
    stop_execution = true
  }

  if(analyze_names.length != analyze_urls.length) {
    console.log("osm_objekt_analyze_urls: analyze_names and analyze_urls have different length")
    stop_execution = true
  }
      
     

  if(!stop_execution) {
    
    
    // generate links html code
    var links_html = ""
    for (i = 0; i < analyze_names.length; i++) {

      var url = analyze_urls[i];
      var url2 = url.replace("%OBJ%", osmobj );
      var url3 = url2.replace("%ID%", cs_id );
  
      links_html += "<a href=\"" + url3 + "\" target=\"_blank\">" + analyze_names[i] + "</a> "
    }
    
     
    // append links to website
    cs_headline.insertAdjacentHTML('afterend', "<div id=\"osm_changeset_analyze_urls\" style=\"color: #f00; padding-left: 20px;\">" + links_html + "</div>")
  }
  
  
  
}



PS: und ganz vergessen bei URL hab ich ein target=“_blank” hinzugefügt… damit beim klicken ein neues Fenster auf geht… fänd ich praktisch, weiß nicht wie ihr das findet?

Was ich bis jetzt nicht verstehe… wenn ich einen Changeset offen habe… und dann aus einen Way im Changeset klicke… dann wird das Skript nicht nochmal ausgeführt… :confused: nur wenn ich in einem Neuen Fenster öffne bzw. neu lade (F5)

Und jetzt hab ich noch gesehen man könnte auch mehrere // @include … angeben :slight_smile: wäre “Sauberer” :wink:

https://wiki.greasespot.net/Include_and_exclude_rules

Hi,

hab noch einen Bug gefunden wenn man z.B. eine history Seite aufmacht von einer Node/Way/rel. dann wird es nicht richtig verarbeitet… ist gefixt.

und jetzt hab ich mehrere @include gemacht…

// ==UserScript==
// @author        Strubbl
// @name          OpenStreetMap Changeset Analyze URLs
// @description   adds links to achavi and OSMCha to every OSM changeset page
// @include       https://www.openstreetmap.org/changeset/*
// @include       https://www.openstreetmap.org/node/*
// @include       https://www.openstreetmap.org/way/*
// @include       https://www.openstreetmap.org/relation/*
// @grant         none
// @version       1.1
// @updateURL     https://gitlab.com/Strubbl/userscripts/raw/master/osm_changeset_analyze_urls.user.js
// ==/UserScript==


   var hrefstr = window.location.href

   var n = hrefstr.search("/changeset/");

   if ( n > 0 )
   {
     console.log("changeset");
     osmpage="changeset";
   }

   var n = hrefstr.search("/node/");
   if ( n > 0 )
   {
     console.log("node");
     osmpage="objekt";
     osmobj="node";
     
   }

   var n = hrefstr.search("/way/");
   if ( n > 0 )
   {
     console.log("way");
     osmpage="objekt";
     osmobj="way";
   }

   var n = hrefstr.search("/relation/");
   if ( n > 0 )
   {
     console.log("relation");
     osmpage="objekt";
     osmobj="relation";
   }




// Funktionen für Changeset Seite
if ( osmpage == "changeset" ) {

analyze_names = ["achavi", "achavi(test)", "OSMCha"]
analyze_urls = ["https://overpass-api.de/achavi/?changeset=", "https://dev.overpass-api.de/achavi/?changeset=", "https://osmcha.org/changesets/"]


var cs_headline = document.getElementById("sidebar_content").getElementsByTagName('h2')[0]
var cs_id = 0
var i;
var input_fields = document.getElementsByTagName('input')
var stop_execution = false

// get changeset id
for (i = 0; i < input_fields.length; i++) {
  var check_for_cs_id = input_fields[i].getAttribute("data-changeset-id")
  if(check_for_cs_id) {
    cs_id = check_for_cs_id
    break
  }
}

// copied from post of miche101 https://forum.openstreetmap.org/viewtopic.php?pid=825651#p825651
// https://www.openstreetmap.org/changeset/56501044#map=16/48.1818/11.7873
if(!cs_id) {
   var href = window.location.href
   let regex = /.*changeset\//g;
   let result = href.replace (regex,"");  
   let regexx = /#.*/g;
   let resultx = result.replace (regexx,"");
   cs_id = resultx;
}

if(!cs_id) {
  console.log("osm_changeset_analyze_urls: no changeset id found")
  stop_execution = true
}

if(analyze_names.length != analyze_urls.length) {
  console.log("osm_changeset_analyze_urls: analyze_names and analyze_urls have different length")
  stop_execution = true
}

if(!stop_execution) {
  // generate links html code
  var links_html = ""
  for (i = 0; i < analyze_names.length; i++) {
    links_html += "<a href=\"" + analyze_urls[i] + cs_id + "\" target=\"_blank\">" + analyze_names[i] + "</a> "
  }
  // append links to website
  cs_headline.insertAdjacentHTML('afterend', "<div id=\"osm_changeset_analyze_urls\" style=\"color: #f00; padding-left: 20px;\">" + links_html + "</div>")
}

}




// Funktionen für Objekt Seite (node/way/relation)

if ( osmpage == "objekt" ) {
  
  
  analyze_names = ["OSM History Viewer"]
  // %OBJ% == node, way, relation    %ID% == OSM-ID
  analyze_urls = ["https://pewu.github.io/osm-history/#/%OBJ%/%ID%"]
  
  var cs_headline = document.getElementById("sidebar_content").getElementsByTagName('h2')[0]
  var cs_id = 0;  
  var stop_execution = false;
  

  // Link Example OSM History Viewer
  // https://pewu.github.io/osm-history/#/node/54154220
  // https://pewu.github.io/osm-history/#/way/683125725
  // https://pewu.github.io/osm-history/#/relation/9767454

   console.log("OSM-Objekt mit dem Typ: " + osmobj);
  
  
   var href = window.location.href
   let regex = /.*openstreetmap.org\/[^\/]*\//g;
   let result = href.replace (regex,"");  
   let regexx = /#.*/g;
   let resultx = result.replace (regexx,"");
   let regexxx = /\/.*/g;
   let resulty = resultx.replace (regexxx,"");
   cs_id = resulty;
  
   console.log("OSM-Objekt mit der ID: " + cs_id);
  

  
  if(!cs_id) {
    console.log("osm_objekt_analyze_urls: no objekt id found")
    stop_execution = true
  }

  if(analyze_names.length != analyze_urls.length) {
    console.log("osm_objekt_analyze_urls: analyze_names and analyze_urls have different length")
    stop_execution = true
  }
      
     

  if(!stop_execution) {
    
    
    // generate links html code
    var links_html = ""
    for (i = 0; i < analyze_names.length; i++) {

      var url = analyze_urls[i];
      var url2 = url.replace("%OBJ%", osmobj );
      var url3 = url2.replace("%ID%", cs_id );
  
      links_html += "<a href=\"" + url3 + "\" target=\"_blank\">" + analyze_names[i] + "</a> "
    }
    
     
    // append links to website
    cs_headline.insertAdjacentHTML('afterend', "<div id=\"osm_changeset_analyze_urls\" style=\"color: #f00; padding-left: 20px;\">" + links_html + "</div>")
  }
  
  
  
}

Hi, ich schon wieder :wink:

so hab eine Lösung für das nicht erneute ausführen des Codes gefunden bei Seitenwechsel. Mit “setInterval” überprüfen ich alle 1000ms ob es die ID = “osm_changeset_analyze_urls” vorhanden ist, wenn nicht werden die Funktionen aufgerufen :slight_smile: Hab dazu den Code neu Organisieren müssen… aber dafür funktioniert es jetzt so wie ich es mir vorstelle :sunglasses:

Gruß Miche :slight_smile:

// ==UserScript==
// @author        Strubbl, Miche101
// @name          OpenStreetMap Changeset, Objekt Analyze
// @description   adds links to achavi and OSMCha to every OSM changeset page and OSM Objekt History
// @include       https://www.openstreetmap.org/changeset/*
// @include       https://www.openstreetmap.org/node/*
// @include       https://www.openstreetmap.org/way/*
// @include       https://www.openstreetmap.org/relation/*
// @grant         none
// @version       1.2
// @updateURL     https://gitlab.com/Strubbl/userscripts/raw/master/osm_changeset_analyze_urls.user.js
// ==/UserScript==


setInterval(function(){ 
  if ( ! document.getElementById("osm_changeset_analyze_urls")) { myFunction() };
}, 1000);




function myFunction() {
 
   var href = window.location.href;

   var n = href.search("/changeset/");

   if ( n > 0 )
   {
     console.log("changeset");
     changeset(href);
   }

   var n = href.search("/node/");
   if ( n > 0 )
   {
     console.log("node");
     Objekt("node", href);     
   }

   var n = href.search("/way/");
   if ( n > 0 )
   {
     console.log("way");
     Objekt("way", href);
   }

   var n = href.search("/relation/");
   if ( n > 0 )
   {
     console.log("relation");
     Objekt("relation", href);
   }
     
}



// Funktionen für Changeset Seite
function changeset(href) {


  analyze_names = ["achavi", "achavi(test)", "OSMCha"]
  analyze_urls = ["https://overpass-api.de/achavi/?changeset=", "https://dev.overpass-api.de/achavi/?changeset=", "https://osmcha.org/changesets/"]


  var cs_headline = document.getElementById("sidebar_content").getElementsByTagName('h2')[0]
  var cs_id = 0
  var i;
  var input_fields = document.getElementsByTagName('input')
  var stop_execution = false

  // get changeset id
  for (i = 0; i < input_fields.length; i++) {
    var check_for_cs_id = input_fields[i].getAttribute("data-changeset-id")
    if(check_for_cs_id) {
      cs_id = check_for_cs_id
      break
    }
  }

  // copied from post of miche101 https://forum.openstreetmap.org/viewtopic.php?pid=825651#p825651
  // https://www.openstreetmap.org/changeset/56501044#map=16/48.1818/11.7873
  if(!cs_id) {
    let regex = /.*changeset\//g;
    let result = href.replace (regex,"");  
    let regexx = /#.*/g;
    let resultx = result.replace (regexx,"");
    cs_id = resultx;
  }

  if(!cs_id) {
    console.log("osm_changeset_analyze_urls: no changeset id found")
    stop_execution = true
  }

  if(analyze_names.length != analyze_urls.length) {
    console.log("osm_changeset_analyze_urls: analyze_names and analyze_urls have different length")
    stop_execution = true
  }

  if(!stop_execution) {
    // generate links html code
    var links_html = ""
    for (i = 0; i < analyze_names.length; i++) {
      links_html += "<a href=\"" + analyze_urls[i] + cs_id + "\" target=\"_blank\">" + analyze_names[i] + "</a> "
    }
    // append links to website
    cs_headline.insertAdjacentHTML('afterend', "<div id=\"osm_changeset_analyze_urls\" style=\"color: #f00; padding-left: 20px;\">" + links_html + "</div>")
  }

}




// Funktionen für Objekt Seite (node/way/relation)
function Objekt(osmobj, href) {
  
  
  analyze_names = ["OSM History Viewer"]
  // %OBJ% == node, way, relation    %ID% == OSM-ID
  analyze_urls = ["https://pewu.github.io/osm-history/#/%OBJ%/%ID%"]
  
  var cs_headline = document.getElementById("sidebar_content").getElementsByTagName('h2')[0]
  var cs_id = 0;  
  var stop_execution = false;
  

  // Link Example OSM History Viewer
  // https://pewu.github.io/osm-history/#/node/54154220
  // https://pewu.github.io/osm-history/#/way/683125725
  // https://pewu.github.io/osm-history/#/relation/9767454

   console.log("OSM-Objekt mit dem Typ: " + osmobj);
  
  
   let regex = /.*openstreetmap.org\/[^\/]*\//g;
   let result = href.replace (regex,"");  
   let regexx = /#.*/g;
   let resultx = result.replace (regexx,"");
   let regexxx = /\/.*/g;
   let resulty = resultx.replace (regexxx,"");
   cs_id = resulty;
  
   console.log("OSM-Objekt mit der ID: " + cs_id);
  

  
  if(!cs_id) {
    console.log("osm_objekt_analyze_urls: no objekt id found")
    stop_execution = true
  }

  if(analyze_names.length != analyze_urls.length) {
    console.log("osm_objekt_analyze_urls: analyze_names and analyze_urls have different length")
    stop_execution = true
  }
      
     

  if(!stop_execution) {
    
    
    // generate links html code
    var links_html = ""
    for (i = 0; i < analyze_names.length; i++) {

      var url = analyze_urls[i];
      var url2 = url.replace("%OBJ%", osmobj );
      var url3 = url2.replace("%ID%", cs_id );
  
      links_html += "<a href=\"" + url3 + "\" target=\"_blank\">" + analyze_names[i] + "</a> "
    }
    
     
    // append links to website
    cs_headline.insertAdjacentHTML('afterend', "<div id=\"osm_changeset_analyze_urls\" style=\"color: #f00; padding-left: 20px;\">" + links_html + "</div>")
  }
  
  
}
     

   

#edit:

Hallo miche101, vielen Dank für deine Arbeit.

Ich wollte das in zwei separate Scripte packen, aber es scheint Probleme zu geben, wenn man beide Scripte hat. das muss ich nochmal debuggen. Er lädt entweder nur das eine oder das andere Script und wenn man sich zB. von Changeset zu Way klickt, wird auf der Way-Seite das Changeset-Script ausgeführt. Das sollte Greasemonkey eigentlich anhand der URL schon nicht erlauben. Aber nun ja…

Ich glaub der Firefox verarbeitet hier nicht alles neu, sondern nur die Änderungen an der Seite… und darum werden auch die Skripte nicht neu ausgeführt. Wie der Firefox dann das Greasemonkey verarbeitet bzw. Skript wechselt ist die Frage… eventuell muss man alles in eine Skript packen :confused:

und mir ist aufgefallen dass du eine Regex weg gemacht hast :confused: des war um z.B. diesen Link zu verarbeiten:

https://www.openstreetmap.org/way/4776904/history

let regexxx = //.*/g;

Gruß Miche

Gerade ausprobiert (Eure letzte Version, alles in einem). Funktioniert gut - Dankeschön!

Ich habe jetzt mal alle Daten seit 2012 geladen, dabei noch 3 Probleme in Overpass entdeckt, die in einem Fall dafür sorgen, dass der Update unter bestimmten Bedingungen abstützt und die Daten dann nicht mehr aktualisiert werden. Bleibt zu hoffen, dass ich bei der Aktion nicht noch weitere schlafende Bugs geweckt habe.

Auf der SSD sind jetzt noch 58 GB frei, die 9 Jahre passten in 380GB hinein. Die Daten sollten theoretisch jede Minute aktualisiert werden. Wie bei Testinstanzen üblich gibt es jedoch keinerlei Garantien für Verfügbarkeit der Instanz oder Aktualität der Daten.

Jetzt klappt auch mein Testbeispiel aus 2015 wieder: https://dev.overpass-api.de/achavi/index.html?changeset=28764270

Alternativ auch mit der OSMCha Changetset-Map: https://dev.overpass-api.de/changeset-map/#28764270