Various improvements
This commit is contained in:
		
							parent
							
								
									474d9c6a66
								
							
						
					
					
						commit
						d24744bc29
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,2 +1,3 @@
 | 
				
			||||||
__pycache__
 | 
					__pycache__
 | 
				
			||||||
.mypy_cache/
 | 
					.mypy_cache/
 | 
				
			||||||
 | 
					config/default.py
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										0
									
								
								geocode/py.typed
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								geocode/py.typed
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -153,7 +153,7 @@ def unescape_title(t: str) -> str:
 | 
				
			||||||
    return urllib.parse.unquote(t.replace("_", " "))
 | 
					    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:
 | 
					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,
 | 
					        "coords": coords,
 | 
				
			||||||
        "admin_level": hit.get("admin_level"),
 | 
					        "admin_level": hit.get("admin_level"),
 | 
				
			||||||
        "wikidata": hit["wikidata"],
 | 
					        "wikidata": hit["wikidata"],
 | 
				
			||||||
 | 
					        "element": hit.get("element"),
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if not commons_cat:
 | 
					    if not commons_cat:
 | 
				
			||||||
        return ret
 | 
					        return ret
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										21
									
								
								lookup.py
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								lookup.py
									
									
									
									
									
								
							| 
						 | 
					@ -28,7 +28,7 @@ def get_random_lat_lon() -> tuple[float, float]:
 | 
				
			||||||
    return lat, lon
 | 
					    return lat, lon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Elements = sqlalchemy.orm.query.Query[model.Polygon]
 | 
					Elements = sqlalchemy.orm.query.Query
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def do_lookup(
 | 
					def do_lookup(
 | 
				
			||||||
| 
						 | 
					@ -80,7 +80,7 @@ def lat_lon_to_wikidata(lat: str | float, lon: str | float) -> dict[str, typing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def osm_lookup(
 | 
					def osm_lookup(
 | 
				
			||||||
    elements: Elements, lat: str | float, lon: str | float
 | 
					    elements: Elements, lat: str | float, lon: str | float  # type:ignore
 | 
				
			||||||
) -> wikidata.Hit | None:
 | 
					) -> wikidata.Hit | None:
 | 
				
			||||||
    """OSM lookup."""
 | 
					    """OSM lookup."""
 | 
				
			||||||
    ret: wikidata.Hit | None
 | 
					    ret: wikidata.Hit | None
 | 
				
			||||||
| 
						 | 
					@ -104,12 +104,14 @@ def osm_lookup(
 | 
				
			||||||
                    "wikidata": qid,
 | 
					                    "wikidata": qid,
 | 
				
			||||||
                    "commons_cat": commons,
 | 
					                    "commons_cat": commons,
 | 
				
			||||||
                    "admin_level": admin_level,
 | 
					                    "admin_level": admin_level,
 | 
				
			||||||
 | 
					                    "element": e.osm_id,
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
        gss = tags.get("ref:gss")
 | 
					        gss = tags.get("ref:gss")
 | 
				
			||||||
        if gss:
 | 
					        if gss:
 | 
				
			||||||
            ret = wikidata.get_commons_cat_from_gss(gss)
 | 
					            ret = wikidata.get_commons_cat_from_gss(gss)
 | 
				
			||||||
            if ret:
 | 
					            if ret:
 | 
				
			||||||
                ret["admin_level"] = admin_level
 | 
					                ret["admin_level"] = admin_level
 | 
				
			||||||
 | 
					                ret["element"] = e.osm_id
 | 
				
			||||||
                return ret
 | 
					                return ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        name = tags.get("name")
 | 
					        name = tags.get("name")
 | 
				
			||||||
| 
						 | 
					@ -123,11 +125,10 @@ def osm_lookup(
 | 
				
			||||||
            ret = wikidata.commons_from_rows(rows)
 | 
					            ret = wikidata.commons_from_rows(rows)
 | 
				
			||||||
            if ret:
 | 
					            if ret:
 | 
				
			||||||
                ret["admin_level"] = admin_level
 | 
					                ret["admin_level"] = admin_level
 | 
				
			||||||
 | 
					                ret["element"] = e.osm_id
 | 
				
			||||||
                return ret
 | 
					                return ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    has_wikidata_tag = [
 | 
					    has_wikidata_tag = [e.tags for e in elements if e.tags.get("wikidata")]
 | 
				
			||||||
        e.tags for e in elements if e.tags.get("wikidata")  # type: ignore
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
    if len(has_wikidata_tag) != 1:
 | 
					    if len(has_wikidata_tag) != 1:
 | 
				
			||||||
        return None
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -159,7 +160,9 @@ def index() -> str | Response:
 | 
				
			||||||
    lat, lon = request.args.get("lat"), request.args.get("lon")
 | 
					    lat, lon = request.args.get("lat"), request.args.get("lon")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if lat is not None and lon is not None:
 | 
					    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])
 | 
					    samples = sorted(geocode.samples, key=lambda row: row[2])
 | 
				
			||||||
    return render_template("index.html", samples=samples)
 | 
					    return render_template("index.html", samples=samples)
 | 
				
			||||||
| 
						 | 
					@ -215,7 +218,11 @@ def detail_page() -> Response | str:
 | 
				
			||||||
        query, r = e.args
 | 
					        query, r = e.args
 | 
				
			||||||
        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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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__":
 | 
					if __name__ == "__main__":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										22
									
								
								templates/base.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								templates/base.html
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					<!doctype html>
 | 
				
			||||||
 | 
					<html lang="en">
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					  <meta charset="utf-8">
 | 
				
			||||||
 | 
					  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  {% block link %}{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <title>
 | 
				
			||||||
 | 
					    {% block title %}{% endblock %}
 | 
				
			||||||
 | 
					  </title>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  {% block style %}{% endblock %}
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					  {% block content %}{% endblock %}
 | 
				
			||||||
 | 
					  {% block script %}{% endblock %}
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,9 @@
 | 
				
			||||||
<!doctype html>
 | 
					{% extends "base.html" %}
 | 
				
			||||||
<html lang="en">
 | 
					 | 
				
			||||||
<head>
 | 
					 | 
				
			||||||
  <meta charset="utf-8">
 | 
					 | 
				
			||||||
  <title>Geocode to commons</title>
 | 
					 | 
				
			||||||
</head>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
<body>
 | 
					{% block title %}Geocode to Commons{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block content %}
 | 
				
			||||||
 | 
					<div class="m-3">
 | 
				
			||||||
<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>
 | 
				
			||||||
| 
						 | 
					@ -24,17 +22,32 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</p>
 | 
					</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<pre>{{ result | pprint }}</pre>
 | 
					<h4>API returns</h4>
 | 
				
			||||||
 | 
					<pre>{{ result | tojson(indent=2) }}</pre>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% if result.wikidata %}
 | 
				
			||||||
 | 
					<p><strong>Wikidata item</strong>: <a href="https://www.wikidata.org/wiki/{{ result.wikidata }}">{{ result.wikidata }}</a></p>
 | 
				
			||||||
 | 
					{% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% if result.commons_cat %}
 | 
					{% if result.commons_cat %}
 | 
				
			||||||
<p>({{ lat }}, {{ lon }}, {{result.commons_cat.title | pprint }}),</p>
 | 
					<p><strong>Commons category</strong>: <a href="{{ result.commons_cat.url }}">{{result.commons_cat.title }}</a></p>
 | 
				
			||||||
 | 
					{% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% if elements %}
 | 
				
			||||||
 | 
					<p>{{ elements.count() }} surrounding elements found</p>
 | 
				
			||||||
 | 
					{% else %}
 | 
				
			||||||
 | 
					<p>No elements found</p>
 | 
				
			||||||
{% endif %}
 | 
					{% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% for element in elements %}
 | 
					{% for element in elements %}
 | 
				
			||||||
{% set tags = element.tags %}
 | 
					{% set tags = element.tags %}
 | 
				
			||||||
  <pre>{{ element.tags | pprint }}</pre>
 | 
					<div class="rounded border border-4 p-1 my-2{% if element_id == element.osm_id %} bg-primary-subtle{% endif %}">
 | 
				
			||||||
 | 
					  {% for key, value in element.tags.items() if not (key == "way_area" or "name:" in key or key.startswith("source")) %}
 | 
				
			||||||
 | 
					  <div><strong>{{ key }}</strong>: {{ value }}</div>
 | 
				
			||||||
 | 
					  {% endfor %}
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
{% endfor %}
 | 
					{% endfor %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</body>
 | 
					</div>
 | 
				
			||||||
</html>
 | 
					{% endblock %}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,9 @@
 | 
				
			||||||
<!doctype html>
 | 
					{% extends "base.html" %}
 | 
				
			||||||
<html lang="en">
 | 
					 | 
				
			||||||
<head>
 | 
					 | 
				
			||||||
  <meta charset="utf-8">
 | 
					 | 
				
			||||||
  <title>Geocode to commons</title>
 | 
					 | 
				
			||||||
</head>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
<body>
 | 
					{% block title %}Geocode to Commons{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block content %}
 | 
				
			||||||
 | 
					<div class="m-3">
 | 
				
			||||||
<h1>Geocode coordinates to Commons Category</h1>
 | 
					<h1>Geocode coordinates to Commons Category</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<ol>
 | 
					<ol>
 | 
				
			||||||
| 
						 | 
					@ -33,6 +31,6 @@ Latitude/Longitude: <input name="q"/> (e.g. 54.375, -2.999) <input type="submit"
 | 
				
			||||||
</ul>
 | 
					</ul>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<p>source code: <a href="https://github.com/EdwardBetts/uk-geocode">https://github.com/EdwardBetts/uk-geocode</a></p>
 | 
					<p>source code: <a href="https://github.com/EdwardBetts/uk-geocode">https://github.com/EdwardBetts/uk-geocode</a></p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</body>
 | 
					{% endblock %}
 | 
				
			||||||
</html>
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue