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

Hi Strubbl,

ich hab mir jetzt das Stript installiert, dabei ist mir aufgefallen das dass Skript nur funktioniert wenn man eingeloggt ist… was ich nicht immer automatisch bin :wink:

Ich hab mir das Skript um eine Funktion erweitert, um auch wenn ich nicht eingeloggt bin es funktioniert:

Bei Zeile 29 hab ich das noch eingefügt:

//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;
}

Wenn du willst kannst es übernehmen :sunglasses:

Gruß Miche

Btw. Für die, die beim Firefox keinen Greasemonkey nutzen oder nutzen wollen, gibt es auch das Addon https://github.com/tankaru/JumpToOSMChangesetAnalyzer :sunglasses:

Danke. Das werde ich machen. An den Fall hatte ich nicht gedacht. Ich fand es super, dass die CS ID im HTML-Quelltext ohne große Regexes erreichbar ist, weil sich so Quelltext gerne ändert und der Regex dann nicht mehr passt. Aber die URL sollte stabil bleiben. Gute Idee.

Leider ist bei diesem Addon das Problem, dass es scheinbar nicht mehr gepflegt wird. Die Abhängigkeiten sind veraltet. Man muss das Addon selbst bauen und dafür irgendwie nodejs installieren. Und schließlich wäre da noch der Extraklick auf ein kleines Icon irgendwo am anderen Ende des Browserfensters. Ich bin da sehr faul und treffe so kleine Icons nicht so schnell. Und ich würde auch gerne mal Achavi in einem neuen Tab oder im selben Tab öffnen. Das soll ohne große Klickerei möglich sein.

By the way… Grossflächige Changesets klappen normalerweise nicht (so gut) mit achavi. Wer will kann gerne mal folgende Alternative austesten: achavi Beispiel 1 oder achavi Beispiel 2 (aktuell nur Changesets ab 2021). Weitere viele gute Beispiele zum Testen gibt’s auch hier.

In meinem Script sieht das dann so aus:

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/"]

Hallo mmd, ich habe das mal getestet.

https://www.openstreetmap.org/changeset/56501044
https://overpass-api.de/achavi/?changeset=56501044
https://dev.overpass-api.de/achavi/?changeset=56501044

Beim achavi dev sehe ich die Änderungen nicht. Weißt du, woran es da hakt?

Für die Version 1.1 von dem Script habe ich die Erweiterung von miche101 eingefügt.

Leider ist die SSD auf dem System zu klein, um auch die letzten Jahre in kurzer Zeit zu laden. Dazu bräuchte es wohl ~600GB. Verfügbar sind nur 430GB, davon sind allerdings schon 390GB belegt. Vor ein paar Jahren war irgendwie noch nicht absehbar, dass jeden Monat mal 100 bis 140 Mio. Änderungen neu dazukommen.

Der Planet für die Datenbank war vom 4.1.2021 + alles was danach kommt. Dein Changeset ist von 2018, ist also 3 Jahre zu alt.

Danke. Das hatte ich überlesen bei deinem vorigen Post.

Gedacht war das auch eher als Technologie-Demo für Changesets, die mit Achavi oder OSMCha nicht mehr funktionieren oder wo das Laden eher länger dauert, wie z.B. https://www.openstreetmap.org/changeset/101749337

Ja coole Sache, dass hab ich schon manchmal :sunglasses: Aber da muss ich mich auch selbst an der Nase fassen und öffters hochladen :smiley:

Es gibt auch noch die “Changeset by Comparison Visualization” von Pascal:

https://resultmaps.neis-one.org/osm-change-viz?c=101749337

Die scheint auch mit großflächigen Changesets umgehen zu können (vermutlich leider nicht Open Source, wie immer).

Das hab ich auch schon probiert… Aber, des geht nur, glaub…, Zwei Monate darf der Changeset sein… Das ist oft blöd… außer des wurde erst vor kurzem geändert

Sieht mir eher nach 1 Monat aus: “Contains changesets after 2021-03-15”. Die Changesets sind wahrscheinlich alle im voraus berechnet und als GeoJSON abgelegt. Das benötigt für einen längeren Zeitraum doch einiges an Platz. Im Fall von OSMCha ist das inzwischen deutlich im Terabyte-Bereich.

Dazu noch ganz kurz: ich habe einen Problem entdeckt, das dafür sorgt, dass Teile der Datenbank in bestimmten Situationen nicht komprimiert werden. Weiterhin habe ich die Ablage der Way nodes etwas geändert, so dass sich jetzt immerhin die letzten 5 Jahre in 385GB unterbringen lassen. :sunglasses:

Dummerweise scheint ein Daily file aus dem April 2016 kaputt/unvollständig zu sein, was ein Laden von noch älteren Daten im Moment etwas im Weg steht. Diese Daily Diffs beötige ich für die Konvertierung nach PBF und anschließendem Laden in Overpass, weil alles andere einfach zu langsam ist.

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>")
  }
  
  
}