parent
b631476844
commit
1625f3d5d1
|
@ -102,17 +102,17 @@ def wd_uri_to_qid(value: str) -> str:
|
||||||
return value[len(wd_entity) - 1 :]
|
return value[len(wd_entity) - 1 :]
|
||||||
|
|
||||||
|
|
||||||
def geosearch_query(lat: float, lon: float) -> list[Row]:
|
def geosearch_query(lat: float, lon: float) -> str:
|
||||||
"""Geosearch via WDQS."""
|
"""Geosearch via WDQS."""
|
||||||
lat_str, lon_str = f"{lat:f}", f"{lon:f}"
|
lat_str, lon_str = f"{lat:f}", f"{lon:f}"
|
||||||
query = render_template("sparql/geosearch.sparql", lat=lat_str, lon=lon_str)
|
query = render_template("sparql/geosearch.sparql", lat=lat_str, lon=lon_str)
|
||||||
return wdqs(query)
|
return query
|
||||||
|
|
||||||
|
|
||||||
def geosearch(lat: float, lon: float) -> Row | None:
|
def geosearch(lat: float, lon: float) -> Row | None:
|
||||||
"""Geosearch."""
|
"""Geosearch."""
|
||||||
default_max_dist = 1
|
default_max_dist = 1
|
||||||
rows = geosearch_query(lat, lon)
|
rows = wdqs(geosearch_query(lat, lon))
|
||||||
max_dist = {
|
max_dist = {
|
||||||
"Q188509": 1, # suburb
|
"Q188509": 1, # suburb
|
||||||
"Q3957": 2, # town
|
"Q3957": 2, # town
|
||||||
|
|
20
lookup.py
20
lookup.py
|
@ -12,6 +12,9 @@ from time import time
|
||||||
import sqlalchemy.exc
|
import sqlalchemy.exc
|
||||||
import werkzeug.debug.tbtools
|
import werkzeug.debug.tbtools
|
||||||
from flask import Flask, jsonify, redirect, render_template, request, url_for
|
from flask import Flask, jsonify, redirect, render_template, request, url_for
|
||||||
|
from pygments import highlight
|
||||||
|
from pygments.formatters import HtmlFormatter
|
||||||
|
from pygments.lexers import SparqlLexer
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
from sqlalchemy.orm.query import Query
|
from sqlalchemy.orm.query import Query
|
||||||
from werkzeug.wrappers import Response
|
from werkzeug.wrappers import Response
|
||||||
|
@ -138,7 +141,9 @@ def lat_lon_to_wikidata(lat: float, lon: float) -> dict[str, typing.Any]:
|
||||||
elements = []
|
elements = []
|
||||||
result = wikidata.build_dict(hit, lat, lon)
|
result = wikidata.build_dict(hit, lat, lon)
|
||||||
|
|
||||||
return {"elements": elements, "result": result}
|
query = wikidata.geosearch_query(lat, lon)
|
||||||
|
|
||||||
|
return {"elements": elements, "result": result, "query": query}
|
||||||
|
|
||||||
|
|
||||||
def get_admin_level(tags: Tags) -> int | None:
|
def get_admin_level(tags: Tags) -> int | None:
|
||||||
|
@ -301,6 +306,16 @@ def wikidata_tag() -> str:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def highlight_sparql(query: str) -> str:
|
||||||
|
"""Highlight SPARQL query syntax using Pygments."""
|
||||||
|
lexer = SparqlLexer()
|
||||||
|
formatter = HtmlFormatter()
|
||||||
|
return highlight(query, lexer, formatter)
|
||||||
|
|
||||||
|
|
||||||
|
app.jinja_env.filters["highlight_sparql"] = highlight_sparql
|
||||||
|
|
||||||
|
|
||||||
def build_detail_page(lat: float, lon: float) -> str:
|
def build_detail_page(lat: float, lon: float) -> str:
|
||||||
"""Run lookup and build detail page."""
|
"""Run lookup and build detail page."""
|
||||||
if lat < -90 or lat > 90 or lon < -180 or lon > 180:
|
if lat < -90 or lat > 90 or lon < -180 or lon > 180:
|
||||||
|
@ -319,6 +334,8 @@ def build_detail_page(lat: float, lon: float) -> str:
|
||||||
element = reply["result"].pop("element", None)
|
element = reply["result"].pop("element", None)
|
||||||
geojson = reply["result"].pop("geojson", None)
|
geojson = reply["result"].pop("geojson", None)
|
||||||
|
|
||||||
|
css = HtmlFormatter().get_style_defs(".highlight")
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"detail.html",
|
"detail.html",
|
||||||
lat=lat,
|
lat=lat,
|
||||||
|
@ -326,6 +343,7 @@ def build_detail_page(lat: float, lon: float) -> str:
|
||||||
str=str,
|
str=str,
|
||||||
element_id=element,
|
element_id=element,
|
||||||
geojson=geojson,
|
geojson=geojson,
|
||||||
|
css=css,
|
||||||
**reply,
|
**reply,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,8 @@ L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||||
width: 48%
|
width: 48%
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{{ css | safe }}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@ -96,6 +98,13 @@ L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||||
<p>No elements found</p>
|
<p>No elements found</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if query %}
|
||||||
|
<p>Searching for Wikimedia Commons categories using this SPARQL query. <a href="https://query.wikidata.org/#{{ query | urlencode }}">Wikidata Query service</a></p>
|
||||||
|
<div>
|
||||||
|
{{ query | highlight_sparql | safe }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% for element in elements %}
|
{% for element in elements %}
|
||||||
{% set tags = element.tags %}
|
{% set tags = element.tags %}
|
||||||
<div class="rounded border border-4 p-1 my-2{% if element_id == element.osm_id %} bg-primary-subtle{% endif %}">
|
<div class="rounded border border-4 p-1 my-2{% if element_id == element.osm_id %} bg-primary-subtle{% endif %}">
|
||||||
|
|
Loading…
Reference in a new issue