mapParams: function (search) {
const params = new URLSearchParams(search || location.search),
+ geoURI = OSM.parseGeoURI(params.get("geouri")),
mapParams = {};
if (params.has("mlon") && params.has("mlat")) {
mapParams.mlat = parseFloat(params.get("mlat"));
mapParams.mrad = parseFloat(params.get("mrad"));
}
+ if (geoURI) {
+ mapParams.marker = true;
+ mapParams.mlon = geoURI.coords.lng;
+ mapParams.mlat = geoURI.coords.lat;
+ mapParams.mrad = geoURI.uncertainty;
+ }
// Old-style object parameters; still in use for edit links e.g. /edit?way=1234
for (const type of ["node", "way", "relation", "note"]) {
mapParams.lon = params.get("mlon");
mapParams.lat = params.get("mlat");
mapParams.zoom = params.get("zoom") || 12;
+ } else if (geoURI?.uncertainty > 0 && !("zoom" in geoURI)) {
+ mapParams.bounds = geoURI.coords.toBounds(geoURI.uncertainty * 4);
+ } else if (geoURI) {
+ mapParams.lon = geoURI.coords.lng;
+ mapParams.lat = geoURI.coords.lat;
+ mapParams.zoom = geoURI.zoom || 12;
} else if (loc) {
[mapParams.lon, mapParams.lat, mapParams.zoom] = loc;
} else if (OSM.home) {
expect(params).to.have.property("zoom", 16);
});
+ it("parses geoURIs", function () {
+ const params = OSM.mapParams("?geouri=geo%3A57.6247%2C-3.6845");
+ expect(params).to.have.property("lat", 57.6247);
+ expect(params).to.have.property("lon", -3.6845);
+ expect(params).to.have.property("mlat", 57.6247);
+ expect(params).to.have.property("mlon", -3.6845);
+ expect(params).to.have.property("zoom", 12);
+ });
+
+ it("parses zoom in geoURIs", function () {
+ const params = OSM.mapParams("?geouri=geo%3A57.6247%2C-3.6845%3Fz%3D16");
+ expect(params).to.have.property("lat", 57.6247);
+ expect(params).to.have.property("lon", -3.6845);
+ expect(params).to.have.property("mlat", 57.6247);
+ expect(params).to.have.property("mlon", -3.6845);
+ expect(params).to.have.property("zoom", 16);
+ });
+
+ it("parses uncertainty in geoURIs", function () {
+ const params = OSM.mapParams("?geouri=geo%3A57.6247%2C-3.6845%3Bu%3D100");
+ const expected = L.latLngBounds([57.62290336944585, -3.6878552857327764], [57.62649663055414, -3.6811447142672233]);
+ expect(params).to.have.property("mlat", 57.6247);
+ expect(params).to.have.property("mlon", -3.6845);
+ expect(params).to.have.property("mrad", 100);
+ expect(params).to.have.property("bounds").deep.equal(expected);
+ });
+
it("parses lat/lon/zoom from the hash", function () {
location.hash = "#map=16/57.6247/-3.6845";
const params = OSM.mapParams("?");