NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Additional Links for the openstreetmap.org-sidebar
// @description This script source is outdated and installation should move to jsDeliver from GitHub.
// @version 12
// @grant none
// @copyright 2021, https://github.com/joshinils and https://github.com/kmpoppe
// @updateURL https://cdn.jsdelivr.net/gh/OSM-de/osm-org-greasemonkey@master/osm-org-greasemonkey.user.js
// @installURL https://cdn.jsdelivr.net/gh/OSM-de/osm-org-greasemonkey@master/osm-org-greasemonkey.user.js
// @downloadURL https://cdn.jsdelivr.net/gh/OSM-de/osm-org-greasemonkey@master/osm-org-greasemonkey.user.js
// @license MIT
// @icon https://www.openstreetmap.org/assets/favicon-16x16-474476c1b2381628a81361a9e2bf04b936d21f77c59e84b48c6c69ea376fb6cf.png
// @match https://www.openstreetmap.org/*
// ==/UserScript==
// Mutation observer for URI (Source: https://stackoverflow.com/a/46428962)
var oldHref = document.location.href;
window.onload = function() {
var config = {
childList: true,
subtree: true
};
var bodyList = document.querySelector("body");
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (oldHref !== document.location.href) {
oldHref = document.location.href;
modifyContent();
}
});
});
observer.observe(bodyList, config);
};
modifyContent();
function modifyContent() {
// new DOM objects
var displayContainer;
// native DOM objects
var sidebar_content;
var navbar_content;
// other variables
var thisUrl;
var loc;
var objectMatches;
var mapMatches;
var iZoom;
var OsmObject = { id: "", type: "" };
var OsmMap = { lat: "", lon: "", zoom : "" };
// get native DOM objects
sidebar_content = document.getElementById("sidebar_content").getElementsByClassName("browse-section")[0];
navbar_content = document.getElementsByClassName("primary")[0].getElementsByClassName("btn-group")[0];
// parse the current URI into RegEx matches
loc = window.location.toString();
objectMatches = loc.match(/(changeset|node|way|relation)\/(\d+)/);
if (objectMatches) {
OsmObject = {
id: objectMatches[2],
type: objectMatches[1]
};
}
mapMatches = loc.match(/#map=(\d+)\/([\-|\d|.]*)\/([\-|\d|.]*)/);
if (mapMatches) {
iZoom = parseInt(mapMatches[1]) - 1;
OsmMap = {
lat: mapMatches[2],
lon: mapMatches[3],
zoom: iZoom.toString()
};
}
// Add links to the sidebar (node, way, relation, changeset)
if (sidebar_content) {
displayContainer = document.createElement("div");
displayContainer.id = "GM-CONTA";
displayContainer.className = "browse-tag-list";
// Changesets ONLY
if (OsmObject.type === "changeset") {
thisUrl = "https://osmcha.org/changesets/" + OsmObject.id;
createOrUpdate("GM-OMSCH", displayContainer, thisUrl, "OSMCha for this Changeset");
}
// Nodes, Ways, Relations ONLY
if (new RegExp(["node","way","relation"].join("|")).test(OsmObject.type)) {
// OSM Deep History
thisUrl = "https://osmlab.github.io/osm-deep-history/#/" + OsmObject.type + "/" + OsmObject.id;
createOrUpdate("GM-OMSDH", displayContainer, thisUrl, "OSM Deep History");
thisUrl = "https://nominatim.openstreetmap.org/ui/details.html?osmtype=" + OsmObject.type.substring(0, 1).toUpperCase() + "&osmid=" + OsmObject.id;
// Nominatim Details
createOrUpdate("GM-NOMIN", displayContainer, thisUrl, "Nominatim Details");
}
if (!document.getElementById("GM-CONTA")) {
sidebar_content.parentNode.insertBefore(displayContainer, sidebar_content);
}
}
// Add links to the primary navigation bar
if (navbar_content) {
if (loc.includes("#map=")) {
// Mapillary
thisUrl = "https://www.mapillary.com/app/?lat=" + OsmMap.lat + "&lng=" + OsmMap.lon + "&z=" + OsmMap.zoom;
createOrUpdate("GM-MAPIL", navbar_content, thisUrl, "Mapillary", "btn btn-outline-primary");
// KartaView
thisUrl = "https://kartaview.org/map/@" + OsmMap.lat + "," + OsmMap.lon + "," + OsmMap.zoom + "z";
createOrUpdate("GM-KARTA", navbar_content, thisUrl, "KartaView", "btn btn-outline-primary");
}
}
}
function createOrUpdate(id, targetObject, thisUrl, text, className = "") {
var existingAnchor = document.getElementById(id);
if (existingAnchor) {
existingAnchor.href = thisUrl;
} else {
targetObject.appendChild(
getAnchorElement(
id,
thisUrl,
text,
className
)
);
}
}
function getAnchorElement(id, url, text, className = "", target = "_blank") {
var anchor;
anchor = document.createElement("a");
anchor.id = id;
anchor.target = target;
anchor.href = url;
anchor.innerHTML = "<center>" + text + "</center>";
if (className !== "") {
anchor.className = className;
}
return anchor;
}