forked from edward/owl-map
		
	Find match candidates
This commit is contained in:
		
							parent
							
								
									95366a76dd
								
							
						
					
					
						commit
						5b13ca1595
					
				| 
						 | 
				
			
			@ -368,6 +368,11 @@ function mouse_events(marker, qid) {
 | 
			
		|||
      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;
 | 
			
		||||
 | 
			
		||||
      var item_osm_candidates_url = `/api/1/item/${qid}/candidates`;
 | 
			
		||||
      axios.get(item_osm_candidates_url).then((response) => {
 | 
			
		||||
        console.log(response.data);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										62
									
								
								web_view.py
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								web_view.py
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,11 +1,12 @@
 | 
			
		|||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
from flask import Flask, render_template, request, jsonify, redirect, url_for
 | 
			
		||||
from sqlalchemy import func
 | 
			
		||||
from sqlalchemy import func, or_
 | 
			
		||||
from sqlalchemy.orm import selectinload
 | 
			
		||||
from matcher import nominatim, model, database, commons, wikidata, wikidata_api
 | 
			
		||||
from collections import Counter
 | 
			
		||||
from time import time
 | 
			
		||||
from geoalchemy2 import Geography
 | 
			
		||||
import GeoIP
 | 
			
		||||
 | 
			
		||||
srid = 4326
 | 
			
		||||
| 
						 | 
				
			
			@ -403,6 +404,65 @@ def api_get_item_tags(item_id):
 | 
			
		|||
    return jsonify(success=True, qid=item.qid, tag_or_key_list=osm_list, duration=t1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_tag_filter(item):
 | 
			
		||||
    osm_list = get_item_tags(item)
 | 
			
		||||
    tag_filter = []
 | 
			
		||||
    for tag_or_key in osm_list:
 | 
			
		||||
        if tag_or_key.startswith("Key:"):
 | 
			
		||||
            tag_filter.append(model.Polygon.tags.has_key(tag_or_key[4:]))
 | 
			
		||||
        if tag_or_key.startswith("Tag:"):
 | 
			
		||||
            k, _, v = tag_or_key.partition("=")
 | 
			
		||||
            tag_filter.append(model.Polygon.tags[k] == v)
 | 
			
		||||
 | 
			
		||||
    return or_(*tag_filter)
 | 
			
		||||
 | 
			
		||||
def get_nearby(item, max_distance=100):
 | 
			
		||||
    osm_objects = {}
 | 
			
		||||
    distances = {}
 | 
			
		||||
    tag_filter = get_tag_filter(item)
 | 
			
		||||
 | 
			
		||||
    for loc in item.locations:
 | 
			
		||||
        lat, lon = loc.get_lat_lon()
 | 
			
		||||
        point = func.ST_SetSRID(func.ST_MakePoint(lon, lat), 4326)
 | 
			
		||||
 | 
			
		||||
        dist = func.ST_Distance(point, model.Polygon.way.cast(Geography()))
 | 
			
		||||
 | 
			
		||||
        q = (model.Polygon.query
 | 
			
		||||
                          .add_columns(dist.label('distance'))
 | 
			
		||||
                          .filter(dist < max_distance, tag_filter)
 | 
			
		||||
                          .order_by(point.distance_centroid(model.Polygon.way))
 | 
			
		||||
                          .limit(20))
 | 
			
		||||
 | 
			
		||||
        for i, dist in q:
 | 
			
		||||
            osm_objects.setdefault(i.identifier, i)
 | 
			
		||||
            if i.identifier not in distances or dist < distances[i.identifier]:
 | 
			
		||||
                distances[i.identifier] = dist
 | 
			
		||||
 | 
			
		||||
    return [(osm_objects[identifier], dist)
 | 
			
		||||
            for identifier, dist
 | 
			
		||||
            in sorted(distances.items(), key=lambda i:i[1])]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route("/api/1/item/Q<int:item_id>/candidates")
 | 
			
		||||
def api_find_osm_candidates(item_id):
 | 
			
		||||
    t0 = time()
 | 
			
		||||
    item = model.Item.query.get(item_id)
 | 
			
		||||
    max_distance = 100
 | 
			
		||||
    nearby = []
 | 
			
		||||
    for osm, dist in get_nearby(item, max_distance):
 | 
			
		||||
        cur = {
 | 
			
		||||
            "identifier": osm.identifier,
 | 
			
		||||
            "distance": dist,
 | 
			
		||||
            "tags": osm.tags,
 | 
			
		||||
            "area": osm.area,
 | 
			
		||||
            "geojson": osm.geojson(),
 | 
			
		||||
        }
 | 
			
		||||
        nearby.append(cur)
 | 
			
		||||
 | 
			
		||||
    t1 = time() - t0
 | 
			
		||||
    return jsonify(success=True, qid=item.qid, nearby=nearby, duration=t1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route("/api/1/missing")
 | 
			
		||||
def api_missing_wikidata_items():
 | 
			
		||||
    qids_arg = request.args.get("qids")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue