parent
d24744bc29
commit
a6286cb05f
|
@ -14,7 +14,7 @@ from sqlalchemy.types import Float, Integer, Numeric, String
|
||||||
from .database import session
|
from .database import session
|
||||||
|
|
||||||
Base = declarative_base()
|
Base = declarative_base()
|
||||||
Base.query = session.query_property() # type:ignore
|
Base.query = session.query_property()
|
||||||
|
|
||||||
|
|
||||||
class Polygon(Base):
|
class Polygon(Base):
|
||||||
|
@ -30,6 +30,9 @@ class Polygon(Base):
|
||||||
tags = Column(postgresql.HSTORE)
|
tags = Column(postgresql.HSTORE)
|
||||||
way = Column(Geometry("GEOMETRY", srid=4326, spatial_index=True), nullable=False)
|
way = Column(Geometry("GEOMETRY", srid=4326, spatial_index=True), nullable=False)
|
||||||
area = column_property(func.ST_Area(way, False))
|
area = column_property(func.ST_Area(way, False))
|
||||||
|
geojson_str = column_property(
|
||||||
|
func.ST_AsGeoJSON(way, maxdecimaldigits=6), deferred=True
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def osm_url(self) -> str:
|
def osm_url(self) -> str:
|
||||||
|
@ -48,7 +51,7 @@ class Polygon(Base):
|
||||||
) -> sqlalchemy.orm.query.Query: # type: ignore
|
) -> sqlalchemy.orm.query.Query: # type: ignore
|
||||||
"""Polygons that contain given coordinates."""
|
"""Polygons that contain given coordinates."""
|
||||||
point = func.ST_SetSRID(func.ST_MakePoint(lon, lat), 4326)
|
point = func.ST_SetSRID(func.ST_MakePoint(lon, lat), 4326)
|
||||||
q = cls.query.filter( # type: ignore
|
q = cls.query.filter(
|
||||||
or_(
|
or_(
|
||||||
cls.boundary == "political",
|
cls.boundary == "political",
|
||||||
and_(
|
and_(
|
||||||
|
|
|
@ -189,6 +189,7 @@ def build_dict(hit: Hit | None, lat: str | float, lon: str | float) -> WikidataD
|
||||||
"admin_level": hit.get("admin_level"),
|
"admin_level": hit.get("admin_level"),
|
||||||
"wikidata": hit["wikidata"],
|
"wikidata": hit["wikidata"],
|
||||||
"element": hit.get("element"),
|
"element": hit.get("element"),
|
||||||
|
"geojson": hit.get("geojson"),
|
||||||
}
|
}
|
||||||
if not commons_cat:
|
if not commons_cat:
|
||||||
return ret
|
return ret
|
||||||
|
|
12
lookup.py
12
lookup.py
|
@ -105,6 +105,7 @@ def osm_lookup(
|
||||||
"commons_cat": commons,
|
"commons_cat": commons,
|
||||||
"admin_level": admin_level,
|
"admin_level": admin_level,
|
||||||
"element": e.osm_id,
|
"element": e.osm_id,
|
||||||
|
"geojson": typing.cast(str, e.geojson_str),
|
||||||
}
|
}
|
||||||
gss = tags.get("ref:gss")
|
gss = tags.get("ref:gss")
|
||||||
if gss:
|
if gss:
|
||||||
|
@ -112,6 +113,7 @@ def osm_lookup(
|
||||||
if ret:
|
if ret:
|
||||||
ret["admin_level"] = admin_level
|
ret["admin_level"] = admin_level
|
||||||
ret["element"] = e.osm_id
|
ret["element"] = e.osm_id
|
||||||
|
ret["geojson"] = typing.cast(str, e.geojson_str)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
name = tags.get("name")
|
name = tags.get("name")
|
||||||
|
@ -162,6 +164,7 @@ def index() -> str | Response:
|
||||||
if lat is not None and lon is not None:
|
if lat is not None and lon is not None:
|
||||||
result = lat_lon_to_wikidata(lat, lon)["result"]
|
result = lat_lon_to_wikidata(lat, lon)["result"]
|
||||||
result.pop("element", None)
|
result.pop("element", None)
|
||||||
|
result.pop("geojson", None)
|
||||||
return jsonify(result)
|
return jsonify(result)
|
||||||
|
|
||||||
samples = sorted(geocode.samples, key=lambda row: row[2])
|
samples = sorted(geocode.samples, key=lambda row: row[2])
|
||||||
|
@ -219,9 +222,16 @@ def detail_page() -> Response | str:
|
||||||
return render_template("query_error.html", lat=lat, lon=lon, query=query, r=r)
|
return render_template("query_error.html", lat=lat, lon=lon, query=query, r=r)
|
||||||
|
|
||||||
element = reply["result"].pop("element", None)
|
element = reply["result"].pop("element", None)
|
||||||
|
geojson = reply["result"].pop("geojson", None)
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"detail.html", lat=lat, lon=lon, str=str, element_id=element, **reply
|
"detail.html",
|
||||||
|
lat=lat,
|
||||||
|
lon=lon,
|
||||||
|
str=str,
|
||||||
|
element_id=element,
|
||||||
|
geojson=geojson,
|
||||||
|
**reply
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,64 @@
|
||||||
|
|
||||||
{% block title %}Geocode to Commons{% endblock %}
|
{% block title %}Geocode to Commons{% endblock %}
|
||||||
|
|
||||||
|
{% block link %}
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
|
||||||
|
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
|
||||||
|
crossorigin=""/>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block script %}
|
||||||
|
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
|
||||||
|
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
|
||||||
|
crossorigin=""></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var map = L.map('map').setView([{{ lat }}, {{ lon }}], 13);
|
||||||
|
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||||
|
maxZoom: 19,
|
||||||
|
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
|
||||||
|
}).addTo(map);
|
||||||
|
|
||||||
|
var marker = L.marker([{{ lat }} , {{ lon }}]).addTo(map);
|
||||||
|
|
||||||
|
{% if geojson %}
|
||||||
|
|
||||||
|
L.geoJSON({{ geojson | safe }}).addTo(map);
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
<style>
|
||||||
|
/*
|
||||||
|
#map {
|
||||||
|
width: 600px;
|
||||||
|
height: 600px;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Styles for the map */
|
||||||
|
#map {
|
||||||
|
position: fixed; /* This keeps the map in place when the page is scrolled */
|
||||||
|
top: 0; /* Starting from the top edge of the browser window */
|
||||||
|
right: 0; /* Positioned on the right side */
|
||||||
|
width: 50%; /* Half the screen width */
|
||||||
|
height: 100%; /* Full height of the browser window */
|
||||||
|
}
|
||||||
|
|
||||||
|
#main {
|
||||||
|
width: 48%
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="m-3">
|
<div id="map"></div>
|
||||||
|
<div class="m-3" id="main">
|
||||||
<h1>Geocode coordinates to Commons Category</h1>
|
<h1>Geocode coordinates to Commons Category</h1>
|
||||||
|
|
||||||
<p><a href="{{ url_for('index', lat=lat, lon=lon) }}">visit endpoint</a>
|
<p><a href="{{ url_for('index', lat=lat, lon=lon) }}">visit endpoint</a>
|
||||||
|
@ -48,6 +104,5 @@
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
Loading…
Reference in a new issue