kopia lustrzana https://github.com/OpenDroneMap/WebODM
187 wiersze
5.8 KiB
JavaScript
187 wiersze
5.8 KiB
JavaScript
// code to load JOSM is from the HOT OSM Tasking Manager
|
|
// https://github.com/hotosm/tasking-manager/
|
|
// and covered by a BSD 2-Clause License
|
|
|
|
PluginsAPI.Map.addActionButton(function (options) {
|
|
if (options.tiles.length === 1) {
|
|
// maps that display multiple tasks don't have a share option on the page
|
|
// and so we can't set things up to edit them
|
|
|
|
var tile = options.tiles[0];
|
|
var tileUrl =
|
|
window.location.protocol +
|
|
"//" +
|
|
window.location.host +
|
|
tile.url +
|
|
"tiles/{z}/{x}/{y}.png";
|
|
var JOSM_COMMAND_TIMEOUT = 1000;
|
|
var josmLastCommand = 0;
|
|
|
|
var startEditor = function (editor) {
|
|
// to load our imagery in an editor, we need to share it
|
|
// .shareButton switches to btn-primary when the project is shared
|
|
var private = $(".shareButton").hasClass("btn-secondary");
|
|
if (private) {
|
|
// check with the user that it's okay to share the project
|
|
if (
|
|
window.confirm(
|
|
"Sharing will be turned on for this project so that imagery can be loaded in the editor."
|
|
)
|
|
) {
|
|
if ($(".sharePopup.top").is(":visible")) {
|
|
// it is very unlikely, but possible that the sharePopup is open
|
|
// in which case we need to click the checkbox not the button
|
|
$(".shareButton div.checkbox input").click();
|
|
} else {
|
|
// otherwise we can just click the shareButton and it will turn on sharing
|
|
$(".shareButton").click();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (editor === "ideditor") {
|
|
var editUrl =
|
|
"https://www.openstreetmap.org/edit?editor=id#map=" +
|
|
options.map.getZoom() +
|
|
"/" +
|
|
options.map.getCenter().lat +
|
|
"/" +
|
|
options.map.getCenter().lng +
|
|
"&background=custom:" +
|
|
tileUrl;
|
|
window.open(editUrl);
|
|
} else if (editor === "josm") {
|
|
function formatUrlParams_(params) {
|
|
return (
|
|
"?" +
|
|
Object.keys(params)
|
|
.map(function (key) {
|
|
return key + "=" + params[key];
|
|
})
|
|
.join("&")
|
|
);
|
|
}
|
|
|
|
function sendJOSMCmd(endpoint, params) {
|
|
var url = endpoint + formatUrlParams_(params),
|
|
loaded,
|
|
iframe;
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
// Figure out when we can next run a command
|
|
var wait = Math.max(
|
|
josmLastCommand + JOSM_COMMAND_TIMEOUT - Date.now(),
|
|
0
|
|
);
|
|
|
|
// This remembers when we are going to run THIS command, and adds the timeout
|
|
// (yes, it is double-counted - this seems to be more reliable).
|
|
josmLastCommand = Date.now() + wait + JOSM_COMMAND_TIMEOUT;
|
|
|
|
setTimeout(function () {
|
|
iframe = document.createElement("iframe");
|
|
iframe.style.display = "none";
|
|
iframe.addEventListener("load", function () {
|
|
if (loaded === undefined) {
|
|
loaded = true;
|
|
resolve();
|
|
iframe.parentElement.removeChild(iframe);
|
|
}
|
|
});
|
|
iframe.setAttribute("src", url);
|
|
document.body.appendChild(iframe);
|
|
}, wait);
|
|
|
|
setTimeout(function () {
|
|
if (loaded === undefined) {
|
|
loaded = false;
|
|
reject();
|
|
iframe.parentElement.removeChild(iframe);
|
|
}
|
|
}, wait + JOSM_COMMAND_TIMEOUT);
|
|
});
|
|
}
|
|
|
|
function prepareJOSM() {
|
|
var imageryParams = {
|
|
title: tile.meta.name,
|
|
type: "tms",
|
|
max_zoom: 24,
|
|
url: encodeURIComponent(tileUrl),
|
|
};
|
|
sendJOSMCmd("http://127.0.0.1:8111/imagery", imageryParams).catch(
|
|
function () {
|
|
alert(
|
|
"Cannot communicate with JOSM. Is it open and running on http://127.0.0.1:8111 ?"
|
|
);
|
|
}
|
|
);
|
|
var loadAndZoomParams = {
|
|
left: options.map.getBounds().getWest(),
|
|
bottom: options.map.getBounds().getSouth(),
|
|
right: options.map.getBounds().getEast(),
|
|
top: options.map.getBounds().getNorth(),
|
|
changeset_comment: "",
|
|
changeset_source: encodeURIComponent("WebODM - " + tile.meta.name),
|
|
new_layer: false,
|
|
};
|
|
sendJOSMCmd("http://127.0.0.1:8111/load_and_zoom", loadAndZoomParams);
|
|
}
|
|
|
|
prepareJOSM();
|
|
}
|
|
};
|
|
|
|
return React.createElement(
|
|
"div",
|
|
{ className: "btn-group dropup" },
|
|
React.createElement(
|
|
// child a
|
|
"button",
|
|
{
|
|
className: "btn btn-sm btn-secondary dropdown-toggle",
|
|
"data-toggle": "dropdown",
|
|
"aria-haspopup": "true",
|
|
"aria-expanded": "false",
|
|
},
|
|
React.createElement("i", { className: "fa fa-map" }, ""), // child a1
|
|
" OSM Digitize ", // child a2
|
|
React.createElement("span", { className: "caret" }, "") // child a3
|
|
),
|
|
React.createElement(
|
|
// child b
|
|
"ul",
|
|
{ className: "dropdown-menu" },
|
|
React.createElement(
|
|
"li",
|
|
null, // child b2
|
|
React.createElement(
|
|
"a",
|
|
{
|
|
href: "#",
|
|
onClick: function () {
|
|
startEditor("ideditor");
|
|
},
|
|
},
|
|
"iD Editor"
|
|
) // child b2.1
|
|
),
|
|
React.createElement(
|
|
"li",
|
|
null, // child b2
|
|
React.createElement(
|
|
"a",
|
|
{
|
|
href: "#",
|
|
onClick: function () {
|
|
startEditor("josm");
|
|
},
|
|
},
|
|
"JOSM"
|
|
) // child b2.2
|
|
)
|
|
)
|
|
);
|
|
}
|
|
});
|