2021-05-09 11:18:56 +01:00
|
|
|
"use strict";
|
2021-05-07 16:46:47 +01:00
|
|
|
|
|
|
|
var options = {};
|
|
|
|
if (start_lat || start_lng) {
|
2021-05-09 11:18:56 +01:00
|
|
|
start_lat = start_lat.toFixed(5);
|
|
|
|
start_lng = start_lng.toFixed(5);
|
2021-05-07 16:46:47 +01:00
|
|
|
options = {
|
|
|
|
center: [start_lat, start_lng],
|
|
|
|
zoom: zoom,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
var map = L.map("map", options);
|
2021-05-09 07:18:20 +01:00
|
|
|
var items = {};
|
2021-05-07 16:46:47 +01:00
|
|
|
var wikidata_items = {};
|
|
|
|
var osm_objects = {};
|
|
|
|
var wikidata_loaded = false;
|
|
|
|
var osm_loaded = false;
|
|
|
|
var loading = document.getElementById("loading");
|
|
|
|
var load_text = document.getElementById("load-text");
|
|
|
|
var isa_card = document.getElementById("isa-card");
|
2021-05-15 15:07:29 +01:00
|
|
|
var link_status_card = document.getElementById("link-status-card");
|
2021-05-11 18:33:42 +01:00
|
|
|
var detail_card = document.getElementById("detail-card");
|
2021-05-12 23:11:52 +01:00
|
|
|
var detail = document.getElementById("detail");
|
|
|
|
var detail_header = document.getElementById("detail-header");
|
2021-05-14 10:08:50 +01:00
|
|
|
var search_and_isa = document.getElementById("search-and-isa");
|
2021-05-12 23:11:52 +01:00
|
|
|
var detail_qid;
|
|
|
|
var candidates = document.getElementById("candidates");
|
2021-05-09 18:33:02 +01:00
|
|
|
var checkbox_list = document.getElementsByClassName("isa-checkbox");
|
2021-05-15 15:07:29 +01:00
|
|
|
|
|
|
|
var linked = document.getElementById("linked");
|
|
|
|
var not_linked = document.getElementById("not-linked");
|
|
|
|
|
2021-05-12 23:11:52 +01:00
|
|
|
var nearby_lookup = {};
|
2021-05-07 16:46:47 +01:00
|
|
|
var isa_labels = {};
|
2021-05-10 13:59:08 +01:00
|
|
|
var items_url = "/api/1/items";
|
|
|
|
var osm_objects_url = "/api/1/osm";
|
|
|
|
var missing_url = "/api/1/missing";
|
2021-05-12 11:52:07 +01:00
|
|
|
var hover_circles = [];
|
|
|
|
var selected_circles = [];
|
2021-05-12 23:11:52 +01:00
|
|
|
var candidate_outline;
|
2021-05-10 13:59:08 +01:00
|
|
|
|
|
|
|
var isa_count = {};
|
2021-05-09 21:59:24 +01:00
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
map.zoomControl.setPosition("topright");
|
2021-05-07 16:46:47 +01:00
|
|
|
|
2021-05-14 20:51:22 +01:00
|
|
|
function build_map_path() {
|
2021-05-09 18:33:02 +01:00
|
|
|
var zoom = map.getZoom();
|
|
|
|
var c = map.getCenter();
|
|
|
|
var lat = c.lat.toFixed(5);
|
|
|
|
var lng = c.lng.toFixed(5);
|
2021-05-14 20:51:22 +01:00
|
|
|
var path = `/map/${zoom}/${lat}/${lng}`;
|
|
|
|
if (detail_qid !== undefined) {
|
|
|
|
path += `?item=${detail_qid}`;
|
|
|
|
}
|
|
|
|
return path;
|
|
|
|
}
|
|
|
|
|
|
|
|
function update_map_path() {
|
|
|
|
history.replaceState(null, null, build_map_path());
|
|
|
|
}
|
|
|
|
|
|
|
|
function qid_from_url() {
|
|
|
|
const queryString = window.location.search;
|
|
|
|
const urlParams = new URLSearchParams(queryString);
|
|
|
|
return urlParams.get("item") || undefined;
|
|
|
|
}
|
|
|
|
|
|
|
|
map.on("moveend", update_map_path);
|
2021-05-09 18:33:02 +01:00
|
|
|
|
2021-05-07 16:46:47 +01:00
|
|
|
var blueMarker = L.ExtraMarkers.icon({
|
2021-05-09 11:18:56 +01:00
|
|
|
icon: "fa-wikidata",
|
|
|
|
markerColor: "blue",
|
|
|
|
shape: "circle",
|
|
|
|
prefix: "fa",
|
2021-05-07 16:46:47 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
var greenMarker = L.ExtraMarkers.icon({
|
2021-05-09 11:18:56 +01:00
|
|
|
icon: "fa-wikidata",
|
|
|
|
markerColor: "green",
|
|
|
|
shape: "circle",
|
|
|
|
prefix: "fa",
|
2021-05-07 16:46:47 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
var redMarker = L.ExtraMarkers.icon({
|
2021-05-09 11:18:56 +01:00
|
|
|
icon: "fa-wikidata",
|
|
|
|
markerColor: "red",
|
|
|
|
shape: "circle",
|
|
|
|
prefix: "fa",
|
2021-05-07 16:46:47 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
var osmYellowMarker = L.ExtraMarkers.icon({
|
2021-05-09 11:18:56 +01:00
|
|
|
icon: "fa-map",
|
|
|
|
markerColor: "yellow",
|
|
|
|
shape: "square",
|
|
|
|
prefix: "fa",
|
2021-05-07 16:46:47 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
var osmOrangeMarker = L.ExtraMarkers.icon({
|
2021-05-09 11:18:56 +01:00
|
|
|
icon: "fa-map",
|
|
|
|
markerColor: "orange",
|
|
|
|
shape: "square",
|
|
|
|
prefix: "fa",
|
2021-05-07 16:46:47 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
if (!start_lat || !start_lng) {
|
2021-05-09 11:18:56 +01:00
|
|
|
map.fitBounds([
|
|
|
|
[49.85, -10.5],
|
|
|
|
[58.75, 1.9],
|
|
|
|
]);
|
2021-05-07 16:46:47 +01:00
|
|
|
}
|
|
|
|
|
2023-11-01 20:58:44 +00:00
|
|
|
var osm = L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
2021-05-09 11:18:56 +01:00
|
|
|
maxZoom: 19,
|
|
|
|
});
|
2021-05-07 16:46:47 +01:00
|
|
|
|
|
|
|
osm.addTo(map);
|
|
|
|
|
2021-05-09 18:33:02 +01:00
|
|
|
function load_complete() {
|
2021-05-13 14:27:06 +01:00
|
|
|
loading.classList.add("d-none");
|
|
|
|
load_text.classList.remove("d-none");
|
|
|
|
detail_card.classList.add("d-none");
|
2021-05-14 20:51:22 +01:00
|
|
|
if(detail_qid) {
|
|
|
|
open_detail(detail_qid);
|
|
|
|
}
|
2021-05-09 18:33:02 +01:00
|
|
|
}
|
|
|
|
|
2021-05-09 21:59:24 +01:00
|
|
|
function add_to_feature_group(qid, thing) {
|
|
|
|
if (items[qid] === undefined) items[qid] = {};
|
|
|
|
if (items[qid].group === undefined) items[qid].group = L.featureGroup();
|
|
|
|
|
|
|
|
var group = items[qid].group;
|
|
|
|
thing.addTo(group);
|
|
|
|
return group;
|
|
|
|
}
|
|
|
|
|
2021-05-10 13:59:08 +01:00
|
|
|
function update_wikidata(check_for_missing = true) {
|
2021-05-09 11:18:56 +01:00
|
|
|
if (
|
|
|
|
Object.keys(wikidata_items).length === 0 ||
|
|
|
|
Object.keys(osm_objects).length === 0
|
|
|
|
) {
|
2021-05-09 18:33:02 +01:00
|
|
|
if (wikidata_loaded && osm_loaded) load_complete();
|
2021-05-07 16:46:47 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-05-10 13:59:08 +01:00
|
|
|
if (check_for_missing) {
|
|
|
|
var missing_qids = [];
|
|
|
|
for (const qid in osm_objects) {
|
|
|
|
var item = wikidata_items[qid];
|
|
|
|
if (!item) missing_qids.push(qid);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (missing_qids.length) {
|
2021-05-15 13:05:21 +01:00
|
|
|
var c = map.getCenter();
|
|
|
|
var params = {
|
|
|
|
qids: missing_qids.join(","),
|
|
|
|
lat: c.lat.toFixed(5),
|
|
|
|
lon: c.lng.toFixed(5),
|
|
|
|
};
|
2021-05-10 13:59:08 +01:00
|
|
|
axios.get(missing_url, { params: params }).then((response) => {
|
|
|
|
response.data.isa_count.forEach((isa) => {
|
|
|
|
isa_labels[isa.qid] = isa.label;
|
|
|
|
if (isa_count[isa.qid] === undefined) {
|
|
|
|
isa_count[isa.qid] = isa;
|
|
|
|
} else {
|
|
|
|
isa_count[isa.qid].count += 1;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
process_wikidata_items(response.data.items);
|
|
|
|
update_wikidata(false);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-15 15:07:29 +01:00
|
|
|
var linked_count = 0;
|
|
|
|
var not_linked_count = 0;
|
|
|
|
|
2021-05-07 16:46:47 +01:00
|
|
|
for (const qid in osm_objects) {
|
2021-05-09 11:18:56 +01:00
|
|
|
var osm_list = osm_objects[qid];
|
|
|
|
|
|
|
|
var item = wikidata_items[qid];
|
2021-05-07 16:46:47 +01:00
|
|
|
|
2021-05-09 22:41:39 +01:00
|
|
|
osm_list.forEach((osm) => {
|
|
|
|
osm.marker.setIcon(item ? osmYellowMarker : osmOrangeMarker);
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!item) continue;
|
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
item.markers.forEach((marker_data) => {
|
|
|
|
marker_data.marker.setIcon(greenMarker);
|
2021-05-11 09:05:56 +01:00
|
|
|
if (!items[qid].lines) items[qid].lines = [];
|
2021-05-09 11:18:56 +01:00
|
|
|
osm_list.forEach((osm) => {
|
|
|
|
var path = [osm.centroid, marker_data];
|
2021-05-09 21:59:24 +01:00
|
|
|
var polyline = L.polyline(path, { color: "green" });
|
|
|
|
add_to_feature_group(qid, polyline);
|
2021-05-11 09:05:56 +01:00
|
|
|
items[qid].lines.push(polyline);
|
2021-05-07 16:46:47 +01:00
|
|
|
});
|
2021-05-09 11:18:56 +01:00
|
|
|
});
|
2021-05-07 16:46:47 +01:00
|
|
|
}
|
|
|
|
for (const qid in wikidata_items) {
|
2021-05-15 15:07:29 +01:00
|
|
|
if (osm_objects[qid]) {
|
|
|
|
linked_count += 1;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
not_linked_count += 1;
|
2021-05-09 11:18:56 +01:00
|
|
|
var item = wikidata_items[qid];
|
|
|
|
item.markers.forEach((marker_data) => {
|
|
|
|
marker_data.marker.setIcon(redMarker);
|
|
|
|
});
|
2021-05-07 16:46:47 +01:00
|
|
|
}
|
|
|
|
|
2021-05-15 15:07:29 +01:00
|
|
|
document.getElementById("linked-count").textContent = linked_count;
|
|
|
|
document.getElementById("not-linked-count").textContent = not_linked_count;
|
|
|
|
|
2021-05-10 13:59:08 +01:00
|
|
|
var isa_count_values = Object.values(isa_count);
|
|
|
|
set_isa_list(isa_count_values);
|
2021-05-15 15:07:29 +01:00
|
|
|
link_status_card.classList.remove("d-none");
|
2021-05-09 18:33:02 +01:00
|
|
|
load_complete();
|
2021-05-07 16:46:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function isa_only(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
var this_id = e.target.parentNode.childNodes[0].id;
|
|
|
|
|
|
|
|
for (const checkbox of checkbox_list) {
|
|
|
|
checkbox.checked = checkbox.id == this_id;
|
|
|
|
}
|
|
|
|
|
|
|
|
checkbox_change();
|
|
|
|
}
|
|
|
|
|
2021-05-08 09:45:14 +01:00
|
|
|
function show_all_isa(e) {
|
|
|
|
e.preventDefault();
|
2021-05-09 18:33:02 +01:00
|
|
|
|
2021-05-08 09:45:14 +01:00
|
|
|
for (const checkbox of checkbox_list) {
|
|
|
|
checkbox.checked = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
checkbox_change();
|
|
|
|
}
|
|
|
|
|
2021-05-07 16:46:47 +01:00
|
|
|
function checkbox_change() {
|
|
|
|
var ticked = [];
|
|
|
|
for (const checkbox of checkbox_list) {
|
2021-05-09 18:33:02 +01:00
|
|
|
if (checkbox.checked) ticked.push(checkbox.id.substr(4));
|
2021-05-07 16:46:47 +01:00
|
|
|
}
|
|
|
|
|
2021-05-09 21:59:24 +01:00
|
|
|
for (const qid in items) {
|
|
|
|
var item = items[qid];
|
2021-05-11 18:33:42 +01:00
|
|
|
if (item.group === undefined) continue;
|
2021-05-09 21:59:24 +01:00
|
|
|
if (item.isa_list === undefined) continue;
|
2021-05-07 16:46:47 +01:00
|
|
|
|
2021-05-15 15:07:29 +01:00
|
|
|
var show_item = true;
|
|
|
|
|
|
|
|
if (osm_objects[qid] && !linked.checked) {
|
|
|
|
show_item = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!osm_objects[qid] && !not_linked.checked) {
|
|
|
|
show_item = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (show_item) {
|
|
|
|
const item_isa_list = item.isa_list;
|
|
|
|
const intersection = ticked.filter((isa_qid) =>
|
|
|
|
item_isa_list.includes(isa_qid)
|
|
|
|
);
|
|
|
|
|
|
|
|
if (intersection.length == 0) {
|
|
|
|
show_item = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (show_item) {
|
2021-05-09 21:59:24 +01:00
|
|
|
item.group.addTo(map);
|
|
|
|
} else {
|
|
|
|
item.group.removeFrom(map);
|
2021-05-09 07:18:20 +01:00
|
|
|
}
|
2021-05-07 16:46:47 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-15 15:07:29 +01:00
|
|
|
function link_status_change() {
|
|
|
|
if (!linked.checked && !not_linked.checked) {
|
|
|
|
for (const qid in items) {
|
|
|
|
var item = items[qid];
|
|
|
|
item.group.removeFrom(map);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-05-11 09:05:56 +01:00
|
|
|
function set_isa_list(isa_count_list) {
|
|
|
|
isa_count_list.sort((a, b) => b.count - a.count);
|
|
|
|
|
2021-05-13 14:27:06 +01:00
|
|
|
isa_card.classList.remove("d-none");
|
2021-05-07 16:46:47 +01:00
|
|
|
var isa_list = document.getElementById("isa-list");
|
2021-05-09 11:18:56 +01:00
|
|
|
isa_list.innerHTML = "";
|
2021-05-11 09:05:56 +01:00
|
|
|
isa_count_list.forEach((isa) => {
|
2021-05-07 16:46:47 +01:00
|
|
|
var isa_id = `isa-${isa.qid}`;
|
2021-05-09 11:18:56 +01:00
|
|
|
var e = document.createElement("div");
|
|
|
|
e.setAttribute("class", "isa-item");
|
|
|
|
|
|
|
|
var checkbox = document.createElement("input");
|
|
|
|
checkbox.setAttribute("type", "checkbox");
|
|
|
|
checkbox.setAttribute("checked", "checked");
|
|
|
|
checkbox.setAttribute("id", isa_id);
|
|
|
|
checkbox.setAttribute("class", "isa-checkbox");
|
2021-05-07 16:46:47 +01:00
|
|
|
checkbox.onchange = checkbox_change;
|
|
|
|
e.appendChild(checkbox);
|
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
e.appendChild(document.createTextNode(" "));
|
2021-05-07 16:46:47 +01:00
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
var label = document.createElement("label");
|
|
|
|
label.setAttribute("for", isa_id);
|
|
|
|
var label_text = document.createTextNode(
|
|
|
|
` ${isa.label} (${isa.qid}): ${isa.count} `
|
|
|
|
);
|
2021-05-07 16:46:47 +01:00
|
|
|
label.appendChild(label_text);
|
|
|
|
|
|
|
|
e.appendChild(label);
|
2021-05-09 11:18:56 +01:00
|
|
|
e.appendChild(document.createTextNode(" "));
|
2021-05-07 16:46:47 +01:00
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
var only = document.createElement("a");
|
|
|
|
only.setAttribute("href", "#");
|
|
|
|
var only_text = document.createTextNode("only");
|
2021-05-07 16:46:47 +01:00
|
|
|
only.appendChild(only_text);
|
|
|
|
only.onclick = isa_only;
|
|
|
|
e.appendChild(only);
|
|
|
|
|
|
|
|
isa_list.appendChild(e);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-05-12 08:27:34 +01:00
|
|
|
function build_item_detail(item, tag_or_key_list) {
|
2021-05-09 11:18:56 +01:00
|
|
|
var wd_url = "https://www.wikidata.org/wiki/" + item.qid;
|
2021-05-14 12:54:54 +01:00
|
|
|
var popup = '<div class="row"><div class="col">'
|
2021-05-14 20:51:22 +01:00
|
|
|
var has_image = item.image_list && item.image_list.length;
|
2021-05-11 09:05:56 +01:00
|
|
|
|
2021-05-14 12:54:54 +01:00
|
|
|
popup += "<strong>Wikidata item</strong><br>";
|
2021-05-09 11:18:56 +01:00
|
|
|
popup += `<a href="${wd_url}" target="_blank">${item.label}</a> (${item.qid})`;
|
|
|
|
if (item.description) {
|
2021-05-12 23:11:52 +01:00
|
|
|
popup += `<br><strong>description</strong><br>${item.description}`;
|
2021-05-09 11:18:56 +01:00
|
|
|
}
|
|
|
|
if (item.isa_list && item.isa_list.length) {
|
|
|
|
popup += "<br><strong>item type</strong>";
|
|
|
|
for (const [index, isa_qid] of item.isa_list.entries()) {
|
|
|
|
var isa_url = "https://www.wikidata.org/wiki/" + isa_qid;
|
|
|
|
var isa_label = isa_labels[isa_qid];
|
|
|
|
popup += `<br><a href="${isa_url}" target="_blank">${isa_label}</a> (${isa_qid})`;
|
2021-05-09 07:18:20 +01:00
|
|
|
}
|
2021-05-09 11:18:56 +01:00
|
|
|
}
|
2021-05-14 16:05:38 +01:00
|
|
|
if (item.street_address && item.street_address.length) {
|
|
|
|
popup += "<br><strong>street address</strong>";
|
|
|
|
popup += `<br>${item.street_address[0]}`;
|
|
|
|
}
|
|
|
|
|
2021-05-12 08:27:34 +01:00
|
|
|
if (tag_or_key_list && tag_or_key_list.length) {
|
2021-05-14 20:51:22 +01:00
|
|
|
if (!has_image) {
|
|
|
|
popup += '</div><div class="col">'
|
|
|
|
} else {
|
|
|
|
popup += "<br>"
|
|
|
|
}
|
|
|
|
|
|
|
|
popup += "<strong>OSM tags/keys to search for</strong>";
|
2021-05-12 08:27:34 +01:00
|
|
|
for (const v of tag_or_key_list) {
|
|
|
|
popup += `<br>${v}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-14 20:51:22 +01:00
|
|
|
|
|
|
|
if (has_image) {
|
|
|
|
popup += '</div><div class="col">'
|
|
|
|
popup += `<img class="w-100" src="/commons/${item.image_list[0]}">`;
|
|
|
|
}
|
|
|
|
|
2021-05-14 12:54:54 +01:00
|
|
|
popup += "</div></div>";
|
2021-05-11 09:05:56 +01:00
|
|
|
|
|
|
|
return popup;
|
|
|
|
}
|
|
|
|
|
|
|
|
function mouseover(item) {
|
|
|
|
if (item.outline) {
|
|
|
|
item.outline.setStyle({ fillOpacity: 0.2, weight: 6 });
|
|
|
|
}
|
|
|
|
if (item.lines) {
|
2021-05-11 16:46:05 +01:00
|
|
|
item.lines.forEach((line) => {
|
|
|
|
line.setStyle({ weight: 6 });
|
|
|
|
});
|
2021-05-11 09:05:56 +01:00
|
|
|
}
|
2021-05-12 11:52:07 +01:00
|
|
|
|
|
|
|
item.markers.forEach((marker) => {
|
|
|
|
var coords = marker.getLatLng();
|
2021-05-12 23:11:52 +01:00
|
|
|
var circle = L.circle(coords, { radius: 20 }).addTo(map);
|
2021-05-12 11:52:07 +01:00
|
|
|
hover_circles.push(circle);
|
|
|
|
});
|
2021-05-11 16:46:05 +01:00
|
|
|
}
|
2021-05-11 09:05:56 +01:00
|
|
|
|
|
|
|
function mouseout(item) {
|
|
|
|
if (item.outline) {
|
|
|
|
item.outline.setStyle({ fillOpacity: 0, weight: 3 });
|
|
|
|
}
|
|
|
|
if (item.lines) {
|
2021-05-11 16:46:05 +01:00
|
|
|
item.lines.forEach((line) => {
|
|
|
|
line.setStyle({ weight: 3 });
|
|
|
|
});
|
2021-05-11 09:05:56 +01:00
|
|
|
}
|
2021-05-12 11:52:07 +01:00
|
|
|
|
|
|
|
hover_circles.forEach((circle) => {
|
|
|
|
circle.removeFrom(map);
|
|
|
|
});
|
|
|
|
hover_circles = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
function close_item_details() {
|
|
|
|
selected_circles.forEach((circle) => {
|
|
|
|
circle.removeFrom(map);
|
|
|
|
});
|
|
|
|
selected_circles = [];
|
2021-05-12 23:11:52 +01:00
|
|
|
|
|
|
|
detail_header.innerHTML = "";
|
|
|
|
detail.innerHTML = "";
|
|
|
|
candidates.innerHTML = "";
|
2021-05-14 20:51:22 +01:00
|
|
|
update_map_path();
|
2021-05-12 23:11:52 +01:00
|
|
|
|
|
|
|
if (candidate_outline) {
|
|
|
|
candidate_outline.removeFrom(map);
|
|
|
|
candidate_outline = undefined;
|
|
|
|
}
|
2021-05-11 16:46:05 +01:00
|
|
|
}
|
2021-05-11 09:05:56 +01:00
|
|
|
|
2021-05-14 12:54:54 +01:00
|
|
|
function show_outline(osm) {
|
|
|
|
if (candidate_outline !== undefined) {
|
|
|
|
candidate_outline.removeFrom(map);
|
|
|
|
}
|
|
|
|
|
|
|
|
var mapStyle = { fillOpacity: 0, color: "red" };
|
|
|
|
var geojson = L.geoJSON(null, { style: mapStyle });
|
|
|
|
geojson.addData(osm.geojson);
|
|
|
|
geojson.addTo(map);
|
|
|
|
|
|
|
|
candidate_outline = geojson;
|
|
|
|
}
|
|
|
|
|
2021-05-14 20:51:22 +01:00
|
|
|
function open_detail(qid) {
|
|
|
|
var item = items[qid];
|
|
|
|
if (item.wikidata === undefined) {
|
|
|
|
console.log("not found:", qid);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
search_and_isa.classList.add("d-none");
|
|
|
|
detail_card.classList.remove("d-none");
|
|
|
|
detail_card.classList.add("bg-highlight");
|
|
|
|
close_item_details();
|
|
|
|
detail_qid = qid;
|
|
|
|
|
|
|
|
item.markers.forEach((marker) => {
|
|
|
|
var coords = marker.getLatLng();
|
|
|
|
var circle = L.circle(coords, { radius: 20, color: "orange" }).addTo(map);
|
|
|
|
selected_circles.push(circle);
|
|
|
|
});
|
|
|
|
|
|
|
|
window.setTimeout(function () {
|
|
|
|
detail_card.classList.remove("bg-highlight");
|
|
|
|
}, 1000);
|
|
|
|
|
|
|
|
update_map_path();
|
|
|
|
|
|
|
|
var item_label = `${item.wikidata.label} (${item.wikidata.qid})`;
|
|
|
|
detail_header.innerHTML = "";
|
|
|
|
detail_header.append(document.createTextNode(item_label));
|
|
|
|
|
|
|
|
var item_tags_url = `/api/1/item/${qid}/tags`;
|
|
|
|
axios.get(item_tags_url).then((response) => {
|
|
|
|
var tag_or_key_list = response.data.tag_or_key_list;
|
|
|
|
if (response.data.qid != detail_qid) {
|
|
|
|
tag_or_key_list = []; // different QID
|
|
|
|
}
|
|
|
|
var item_detail = build_item_detail(item.wikidata, tag_or_key_list);
|
|
|
|
detail.innerHTML = item_detail;
|
|
|
|
|
|
|
|
if (tag_or_key_list.length == 0) return;
|
|
|
|
|
|
|
|
var item_osm_candidates_url = `/api/1/item/${qid}/candidates`;
|
|
|
|
var bounds = map.getBounds();
|
|
|
|
var params = { bounds: bounds.toBBoxString() };
|
|
|
|
|
|
|
|
axios
|
|
|
|
.get(item_osm_candidates_url, { params: params })
|
|
|
|
.then((response) => {
|
|
|
|
if (response.data.qid != detail_qid) return; // different QID
|
|
|
|
var nearby = response.data.nearby;
|
|
|
|
if (!nearby.length) return;
|
|
|
|
var osm_html = "<strong>Possible OSM matches</strong><br>";
|
|
|
|
osm_html += '<table class="table table-sm table-hover">'
|
|
|
|
osm_html += '<tbody>'
|
|
|
|
for (const osm of nearby) {
|
|
|
|
var candidate_id = osm.identifier.replace("/", "_");
|
|
|
|
osm_html += `<tr class="osm-candidate" id="${candidate_id}"><td class="text-end text-nowrap">${osm.distance.toFixed(0)}m `;
|
|
|
|
osm_html += `<a href="https://www.openstreetmap.org/${osm.identifier}" target="_blank">`;
|
|
|
|
osm_html += '<i class="fa fa-map-o"></i></a>';
|
|
|
|
osm_html += "</td><td>";
|
|
|
|
nearby_lookup[candidate_id] = osm;
|
|
|
|
if (osm.name) {
|
|
|
|
osm_html += osm.name + " ";
|
|
|
|
}
|
|
|
|
if (!osm.presets.length && !osm.name) {
|
|
|
|
osm_html += "no name ";
|
|
|
|
}
|
|
|
|
osm_html += osm.presets.map(function(p) {
|
|
|
|
var wiki_url = `http://wiki.openstreetmap.org/wiki/${p.tag_or_key}`;
|
|
|
|
return `<a href="${wiki_url}" class="osm-wiki-link" target="_blank">${p.name} <i class="fa fa-external-link"></i></a>`;
|
|
|
|
}).join(", ");
|
|
|
|
if (osm.address_list && osm.address_list.length) {
|
|
|
|
if (osm.address_list.length == 1) {
|
|
|
|
osm_html += "<br>address node: " + osm.address_list[0];
|
|
|
|
} else {
|
|
|
|
osm_html += "<br>address nodes: " + osm.address_list.join("; ")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
osm_html += "</td></tr>";
|
|
|
|
}
|
|
|
|
osm_html += "</tbody></table>"
|
|
|
|
candidates.innerHTML = osm_html;
|
|
|
|
var span_list = document.getElementsByClassName("osm-candidate");
|
|
|
|
|
|
|
|
for (const osm_span of span_list) {
|
|
|
|
osm_span.onmouseenter = function (e) {
|
|
|
|
show_outline(nearby_lookup[e.target.id]);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-05-11 09:05:56 +01:00
|
|
|
function mouse_events(marker, qid) {
|
|
|
|
items[qid] ||= {};
|
|
|
|
var item = items[qid];
|
2021-05-11 16:46:05 +01:00
|
|
|
marker.on("mouseover", function () {
|
|
|
|
mouseover(item);
|
|
|
|
});
|
|
|
|
marker.on("mouseout", function () {
|
|
|
|
mouseout(item);
|
|
|
|
});
|
2021-05-11 18:33:42 +01:00
|
|
|
marker.on("click", function () {
|
2021-05-12 23:11:52 +01:00
|
|
|
detail_qid = qid;
|
2021-05-14 20:51:22 +01:00
|
|
|
open_detail(qid);
|
2021-05-11 18:33:42 +01:00
|
|
|
});
|
2021-05-11 09:05:56 +01:00
|
|
|
|
|
|
|
item.markers ||= [];
|
|
|
|
item.markers.push(marker);
|
|
|
|
}
|
|
|
|
|
|
|
|
function add_wikidata_marker(item, marker_data) {
|
|
|
|
var icon = blueMarker;
|
|
|
|
var qid = item.qid;
|
|
|
|
var label = `${item.label} (${item.qid})`;
|
|
|
|
var marker = L.marker(marker_data, { icon: icon });
|
|
|
|
mouse_events(marker, qid);
|
|
|
|
|
2021-05-09 21:59:24 +01:00
|
|
|
var group = add_to_feature_group(item.qid, marker);
|
|
|
|
group.addTo(map);
|
2021-05-12 11:52:07 +01:00
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
marker_data.marker = marker;
|
2021-05-09 07:18:20 +01:00
|
|
|
}
|
|
|
|
|
2021-05-10 13:59:08 +01:00
|
|
|
function process_wikidata_items(load_items) {
|
|
|
|
load_items.forEach((item) => {
|
|
|
|
var qid = item.qid;
|
|
|
|
if (item.qid in wikidata_items) return;
|
|
|
|
item.markers.forEach((marker_data) =>
|
|
|
|
add_wikidata_marker(item, marker_data)
|
|
|
|
);
|
2021-05-14 14:10:01 +01:00
|
|
|
items[qid].wikidata = item;
|
2021-05-10 13:59:08 +01:00
|
|
|
wikidata_items[item.qid] = item;
|
|
|
|
|
|
|
|
if (items[qid] === undefined) items[qid] = {};
|
|
|
|
items[qid].isa_list = item.isa_list;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-05-07 16:46:47 +01:00
|
|
|
function load_wikidata_items() {
|
2021-05-09 11:18:56 +01:00
|
|
|
var checkbox_list = document.getElementsByClassName("isa-checkbox");
|
2021-05-07 16:46:47 +01:00
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
for (const checkbox of checkbox_list) checkbox.checked = true;
|
2021-05-15 15:07:29 +01:00
|
|
|
linked.checked = true;
|
|
|
|
not_linked.checked = true;
|
2021-05-07 16:46:47 +01:00
|
|
|
|
|
|
|
checkbox_change();
|
|
|
|
|
2021-05-12 11:52:07 +01:00
|
|
|
close_item_details();
|
2021-05-14 16:08:59 +01:00
|
|
|
search_and_isa.classList.remove("d-none");
|
2021-05-13 14:27:06 +01:00
|
|
|
detail_card.classList.add("d-none");
|
|
|
|
loading.classList.remove("d-none");
|
|
|
|
load_text.classList.add("d-none");
|
2021-05-07 16:46:47 +01:00
|
|
|
|
|
|
|
var bounds = map.getBounds();
|
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
var params = { bounds: bounds.toBBoxString() };
|
2021-05-07 16:46:47 +01:00
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
axios.get(items_url, { params: params }).then((response) => {
|
2021-05-10 13:59:08 +01:00
|
|
|
response.data.isa_count.forEach((isa) => {
|
|
|
|
isa_count[isa.qid] = isa;
|
|
|
|
isa_labels[isa.qid] = isa.label;
|
2021-05-07 16:46:47 +01:00
|
|
|
});
|
|
|
|
|
2021-05-10 13:59:08 +01:00
|
|
|
process_wikidata_items(response.data.items);
|
|
|
|
|
2021-05-07 16:46:47 +01:00
|
|
|
wikidata_loaded = true;
|
2021-05-13 14:27:06 +01:00
|
|
|
isa_card.classList.remove("d-none");
|
2021-05-15 15:07:29 +01:00
|
|
|
link_status_card.classList.remove("d-none");
|
2021-05-07 16:46:47 +01:00
|
|
|
update_wikidata();
|
|
|
|
});
|
2021-05-10 13:59:08 +01:00
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
axios.get(osm_objects_url, { params: params }).then((response) => {
|
2021-05-07 16:46:47 +01:00
|
|
|
console.log(`${response.data.duration} seconds`);
|
2021-05-09 11:18:56 +01:00
|
|
|
response.data.objects.forEach((osm) => {
|
2021-05-07 16:46:47 +01:00
|
|
|
var qid = osm.wikidata;
|
2021-05-09 11:18:56 +01:00
|
|
|
if (osm_objects[qid] === undefined) osm_objects[qid] = [];
|
2021-05-07 16:46:47 +01:00
|
|
|
osm_objects[qid].push(osm);
|
|
|
|
|
|
|
|
var icon = osmYellowMarker;
|
2021-05-09 11:18:56 +01:00
|
|
|
var marker = L.marker(osm.centroid, { title: osm.name, icon: icon });
|
2021-05-07 16:46:47 +01:00
|
|
|
osm.marker = marker;
|
2021-05-09 11:18:56 +01:00
|
|
|
var wd_url = "https://www.wikidata.org/wiki/" + qid;
|
2021-05-07 16:46:47 +01:00
|
|
|
var popup = `
|
|
|
|
<p>
|
|
|
|
${osm.name}:
|
|
|
|
<a href="${osm.url}" target="_blank">${osm.identifier}</a>
|
|
|
|
<br>
|
2021-05-08 09:45:43 +01:00
|
|
|
Wikidata tag: <a href="${wd_url}" target="_blank">${qid}</a>
|
2021-05-09 11:18:56 +01:00
|
|
|
</p>`;
|
2021-05-14 20:51:22 +01:00
|
|
|
|
2021-05-11 09:05:56 +01:00
|
|
|
mouse_events(marker, qid);
|
|
|
|
|
2021-05-09 21:59:24 +01:00
|
|
|
var group = add_to_feature_group(qid, marker);
|
|
|
|
group.addTo(map);
|
2021-05-12 11:52:07 +01:00
|
|
|
items[qid].markers ||= [];
|
|
|
|
items[qid].markers.push(marker);
|
2021-05-08 12:14:30 +01:00
|
|
|
|
2021-05-09 11:18:56 +01:00
|
|
|
if (osm.type != "node" && osm.geojson) {
|
|
|
|
var mapStyle = { fillOpacity: 0 };
|
|
|
|
var geojson = L.geoJSON(null, { style: mapStyle });
|
2021-05-08 12:14:30 +01:00
|
|
|
geojson.addData(osm.geojson);
|
2021-05-09 22:41:39 +01:00
|
|
|
add_to_feature_group(qid, geojson);
|
2021-05-11 09:05:56 +01:00
|
|
|
items[qid].outline = geojson;
|
2021-05-08 12:14:30 +01:00
|
|
|
}
|
2021-05-07 16:46:47 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
osm_loaded = true;
|
|
|
|
update_wikidata();
|
|
|
|
});
|
2021-05-09 11:18:56 +01:00
|
|
|
}
|
2021-05-07 16:46:47 +01:00
|
|
|
|
2021-05-09 18:33:02 +01:00
|
|
|
document.getElementById("search-form").onsubmit = function (e) {
|
2021-05-07 16:46:47 +01:00
|
|
|
e.preventDefault();
|
2021-05-09 11:18:56 +01:00
|
|
|
var search_text = document.getElementById("search-text").value.trim();
|
|
|
|
if (!search_text) return;
|
|
|
|
var params = { q: search_text };
|
2021-05-07 16:46:47 +01:00
|
|
|
var search_url = "/api/1/search";
|
2021-05-09 11:18:56 +01:00
|
|
|
var search_results = document.getElementById("search-results");
|
|
|
|
axios.get(search_url, { params: params }).then((response) => {
|
|
|
|
search_results.innerHTML = "";
|
|
|
|
response.data.hits.forEach((hit) => {
|
|
|
|
var e = document.createElement("div");
|
|
|
|
var category = document.createTextNode(hit.category + " ");
|
2021-05-07 16:46:47 +01:00
|
|
|
e.appendChild(category);
|
2021-05-09 11:18:56 +01:00
|
|
|
var a = document.createElement("a");
|
2021-05-07 16:46:47 +01:00
|
|
|
var lat = parseFloat(hit.lat).toFixed(5);
|
|
|
|
var lon = parseFloat(hit.lon).toFixed(5);
|
2021-05-09 11:18:56 +01:00
|
|
|
a.setAttribute("href", `/map/15/${lat}/${lon}`);
|
2021-05-07 16:46:47 +01:00
|
|
|
var link_text = document.createTextNode(hit.name);
|
|
|
|
a.appendChild(link_text);
|
|
|
|
e.appendChild(a);
|
|
|
|
search_results.appendChild(e);
|
|
|
|
});
|
|
|
|
});
|
2021-05-09 11:18:56 +01:00
|
|
|
};
|
2021-05-07 16:46:47 +01:00
|
|
|
|
2021-05-11 18:33:42 +01:00
|
|
|
function close_detail() {
|
2021-05-14 10:08:50 +01:00
|
|
|
search_and_isa.classList.remove("d-none");
|
2021-05-13 14:27:06 +01:00
|
|
|
detail_card.classList.add("d-none");
|
2021-05-12 11:52:07 +01:00
|
|
|
|
|
|
|
close_item_details();
|
2021-05-14 20:51:22 +01:00
|
|
|
detail_qid = undefined;
|
2021-05-15 13:16:21 +01:00
|
|
|
update_map_path();
|
2021-05-11 18:33:42 +01:00
|
|
|
}
|
|
|
|
|
2021-05-09 18:33:02 +01:00
|
|
|
document.getElementById("load-btn").onclick = load_wikidata_items;
|
|
|
|
document.getElementById("show-all-isa").onclick = show_all_isa;
|
2021-05-11 18:33:42 +01:00
|
|
|
document.getElementById("close-detail").onclick = close_detail;
|
2021-05-14 20:51:22 +01:00
|
|
|
|
2021-05-15 15:07:29 +01:00
|
|
|
linked.onchange = checkbox_change;
|
|
|
|
not_linked.onchange = checkbox_change;
|
|
|
|
|
2021-05-14 20:51:22 +01:00
|
|
|
detail_qid = qid_from_url();
|
|
|
|
update_map_path();
|
|
|
|
|
|
|
|
if(detail_qid) {
|
|
|
|
load_wikidata_items();
|
|
|
|
}
|