diff --git a/static/js/map.js b/static/js/map.js
index b4c02a3..0da2585 100644
--- a/static/js/map.js
+++ b/static/js/map.js
@@ -259,7 +259,7 @@ function set_isa_list(isa_count_list) {
});
}
-function build_item_detail(item) {
+function build_item_detail(item, tag_or_key_list) {
var wd_url = "https://www.wikidata.org/wiki/" + item.qid;
var popup = "
Wikidata item
";
@@ -275,12 +275,22 @@ function build_item_detail(item) {
popup += `
${isa_label} (${isa_qid})`;
}
}
+
+ if (tag_or_key_list && tag_or_key_list.length) {
+ popup += "
OSM tags/keys to search for"
+ for (const v of tag_or_key_list) {
+ popup += `
${v}`;
+ }
+ }
+
if (item.image_list && item.image_list.length) {
popup += `
`;
}
if (item.street_address && item.street_address.length) {
- popup += `
street address
${item.street_address[0]["text"]}`;
+ popup += "
street address"
+ popup += `
${item.street_address[0]["text"]}`;
}
+
popup += "
";
return popup;
@@ -326,8 +336,12 @@ function mouse_events(marker, qid) {
detail_card.classList.remove("bg-highlight");
}, 500);
- var item_detail = build_item_detail(items[qid].wikidata);
- detail.innerHTML = item_detail;
+ 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;
+ var item_detail = build_item_detail(items[qid].wikidata, tag_or_key_list);
+ detail.innerHTML = item_detail;
+ });
});
item.markers ||= [];
diff --git a/web_view.py b/web_view.py
index 9913bff..efb8d92 100755
--- a/web_view.py
+++ b/web_view.py
@@ -374,6 +374,35 @@ def api_osm_objects():
return jsonify(success=True, objects=objects, duration=t1)
+skip_isa = {13226383, 16686448, 2221906}
+skip_tags = {"Key:addr:street"}
+
+def get_item_tags(item):
+ isa_list = [v["numeric-id"] for v in item.get_claim("P31")]
+ isa_items = model.Item.query.filter(model.Item.item_id.in_(isa_list)).all()
+ osm_list = set()
+ seen = set(isa_list) | skip_isa
+ while isa_items:
+ isa = isa_items.pop()
+ osm = [v for v in isa.get_claim("P1282") if v not in skip_tags]
+ osm_list.update(osm)
+
+ subclass_of = [v["numeric-id"] for v in isa.get_claim("P279")]
+ isa_list = [isa_id for isa_id in subclass_of if isa_id not in seen]
+ seen.update(isa_list)
+ isa_items += model.Item.query.filter(model.Item.item_id.in_(isa_list)).all()
+ return sorted(osm_list)
+
+
+@app.route("/api/1/item/Q/tags")
+def api_get_item_tags(item_id):
+ t0 = time()
+ item = model.Item.query.get(item_id)
+ osm_list = get_item_tags(item)
+ t1 = time() - t0
+ return jsonify(success=True, qid=item.qid, tag_or_key_list=osm_list, duration=t1)
+
+
@app.route("/api/1/missing")
def api_missing_wikidata_items():
qids_arg = request.args.get("qids")