diff --git a/.gitignore b/.gitignore index 6a7802f..62ca108 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__ .mypy_cache/ +config/default.py diff --git a/geocode/py.typed b/geocode/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/geocode/wikidata.py b/geocode/wikidata.py index 08f4c91..09a6cd8 100644 --- a/geocode/wikidata.py +++ b/geocode/wikidata.py @@ -153,7 +153,7 @@ def unescape_title(t: str) -> str: return urllib.parse.unquote(t.replace("_", " ")) -Hit = dict[str, str | None] +Hit = dict[str, str | int | None] def commons_from_rows(rows: list[Row]) -> Hit | None: @@ -188,6 +188,7 @@ def build_dict(hit: Hit | None, lat: str | float, lon: str | float) -> WikidataD "coords": coords, "admin_level": hit.get("admin_level"), "wikidata": hit["wikidata"], + "element": hit.get("element"), } if not commons_cat: return ret diff --git a/lookup.py b/lookup.py index ece7b2c..35335e4 100755 --- a/lookup.py +++ b/lookup.py @@ -28,7 +28,7 @@ def get_random_lat_lon() -> tuple[float, float]: return lat, lon -Elements = sqlalchemy.orm.query.Query[model.Polygon] +Elements = sqlalchemy.orm.query.Query def do_lookup( @@ -80,7 +80,7 @@ def lat_lon_to_wikidata(lat: str | float, lon: str | float) -> dict[str, typing. def osm_lookup( - elements: Elements, lat: str | float, lon: str | float + elements: Elements, lat: str | float, lon: str | float # type:ignore ) -> wikidata.Hit | None: """OSM lookup.""" ret: wikidata.Hit | None @@ -104,12 +104,14 @@ def osm_lookup( "wikidata": qid, "commons_cat": commons, "admin_level": admin_level, + "element": e.osm_id, } gss = tags.get("ref:gss") if gss: ret = wikidata.get_commons_cat_from_gss(gss) if ret: ret["admin_level"] = admin_level + ret["element"] = e.osm_id return ret name = tags.get("name") @@ -123,11 +125,10 @@ def osm_lookup( ret = wikidata.commons_from_rows(rows) if ret: ret["admin_level"] = admin_level + ret["element"] = e.osm_id return ret - has_wikidata_tag = [ - e.tags for e in elements if e.tags.get("wikidata") # type: ignore - ] + has_wikidata_tag = [e.tags for e in elements if e.tags.get("wikidata")] if len(has_wikidata_tag) != 1: return None @@ -159,7 +160,9 @@ def index() -> str | Response: lat, lon = request.args.get("lat"), request.args.get("lon") if lat is not None and lon is not None: - return jsonify(lat_lon_to_wikidata(lat, lon)["result"]) + result = lat_lon_to_wikidata(lat, lon)["result"] + result.pop("element", None) + return jsonify(result) samples = sorted(geocode.samples, key=lambda row: row[2]) return render_template("index.html", samples=samples) @@ -215,7 +218,11 @@ def detail_page() -> Response | str: query, r = e.args return render_template("query_error.html", lat=lat, lon=lon, query=query, r=r) - return render_template("detail.html", lat=lat, lon=lon, **reply) + element = reply["result"].pop("element", None) + + return render_template( + "detail.html", lat=lat, lon=lon, str=str, element_id=element, **reply + ) if __name__ == "__main__": diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..f3fd3e5 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,22 @@ + + +
+ + + + + + {% block link %}{% endblock %} + +visit endpoint @@ -24,17 +22,32 @@
-{{ result | pprint }}+
{{ result | tojson(indent=2) }}+ +{% if result.wikidata %} +
Wikidata item: {{ result.wikidata }}
+{% endif %} {% if result.commons_cat %} -({{ lat }}, {{ lon }}, {{result.commons_cat.title | pprint }}),
+Commons category: {{result.commons_cat.title }}
+{% endif %} + +{% if elements %} +{{ elements.count() }} surrounding elements found
+{% else %} +No elements found
{% endif %} {% for element in elements %} {% set tags = element.tags %} -{{ element.tags | pprint }}+
source code: https://github.com/EdwardBetts/uk-geocode
+