docker2 / disambiguation /disambiguate.py
SpatialWebAgent's picture
Update disambiguation/disambiguate.py
5688cac verified
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 1 13:11:36 2022
@author: syed
"""
import requests
import urllib3
import json
from geocoder import geo_level1
from geocoder import geo_level2
from geocoder import geo_level3
import time
from utils import geoutil
import re
import regex_spatial
import streamlit as st
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
import os
BACKEND_URL = "https://SpatialWebAgent-dockerb22.hf.space/api/predict/"
API_TOKEN = os.getenv('API_TOKEN3')
def call_backend(input_text):
try:
headers = {
"Authorization": f"Bearer {API_TOKEN}"
}
response = requests.post(
BACKEND_URL,
headers=headers,
json={"data": [input_text]},
timeout=10
)
if response.status_code == 200:
return response.json() # ✅ 保留原始 JSON 对象 (dict)
return {"error": f"❌ Backend Error (HTTP {response.status_code})"}
except Exception as e:
return {"error": f"⚠️ Connection Error: {str(e)}"}
def dismabiguate_entities(doc, ent, ase, level_1, level_2, level_3, midmid):
return get_coordinates(ent, ase, level_1, level_2, level_3, midmid)
def get_coordinates(ent, ase, level_1, level_2, level_3, midmid):
# request_url = 'https://nominatim.openstreetmap.org/search.php?q='+ase+'&polygon_geojson=1&accept-language=en&format=jsonv2'
# headers = {
# "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15"
# }
# time.sleep(2)
# page = requests.get(request_url, headers=headers, verify=False)
# json_content = json.loads(page.content)
# print(json_content, 'jjjjj')
# all_coordinates = json_content[0]['geojson']['coordinates'][0]
# centroid = (float(json_content[0]['lon']), float(json_content[0]['lat']))
res = call_backend(ase)['data'][0]
st.markdown(res)
all_coordinates = res[0]
centroid = res[1]
for p in all_coordinates:
p2 = (p[0], p[1])
angle = geoutil.calculate_bearing(centroid, p2)
p.append(angle)
mid1 = None
mid2 = None
coordinates = all_coordinates
if level_3 is not None:
all_coordinates, centroid = geo_level3.get_level3_coordinates(coordinates, centroid, level_3, level_1)
geojson = get_geojson(ent, all_coordinates, centroid)
return geojson
def dismabiguate_entities_between(doc, ent, ase, level_1, level_2, level_3, midmid):
return get_coordinates_between(doc, ent, ase, level_1, level_2, level_3, midmid)
def get_coordinates_between(doc, ent, ase, level_1, level_2, level_3, midmid):
# first ase
request_url = 'https://nominatim.openstreetmap.org/search.php?q=' + doc.ents[0].text + '&polygon_geojson=1&accept-language=en&format=jsonv2'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15"
}
page1 = requests.get(request_url, headers=headers, verify=False)
# second ase
request_url = 'https://nominatim.openstreetmap.org/search.php?q=' + doc.ents[1].text + '&polygon_geojson=1&accept-language=en&format=jsonv2'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15"
}
page = requests.get(request_url, headers=headers, verify=False)
# request_url = 'https://nominatim.openstreetmap.org/search.php?q=' + ase + '&polygon_geojson=1&accept-language=en&format=jsonv2'
# headers = {
# "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15"
# }
# page = requests.get(request_url, headers=headers, verify=False)
# st.markdown('The IP of this Space is blocked by OpenStreetMap, we are fixing this issue. You can still interact with the second table at the first page.')
# json_content = json.loads(page.content)
# all_coordinates = json_content[0]['geojson']['coordinates'][0]
# centroid = (float(json_content[0]['lon']), float(json_content[0]['lat']))
res = call_backend(ase)
# st.markdown(res)
res = res['data'][0]
# st.markdown(res)
all_coordinates = res[0]
centroid = res[1]
for p in all_coordinates:
p2 = (p[0], p[1])
angle = geoutil.calculate_bearing(centroid, p2)
p.append(angle)
mid1 = None
mid2 = None
coordinates = all_coordinates
if level_1 is not None:
all_coordinates, centroid, mid1, mid2 = geo_level1.get_level1_coordinates(all_coordinates, centroid, level_1, midmid)
if level_2 is not None:
if level_1 is not None and level_1.lower() not in geo_level1.center:
all_coordinates, centroid = geo_level2.get_level2_coordinates(coordinates, centroid, level_2, level_1)
else:
print ("Else executed")
all_coordinates, centroid = geo_level2.get_level2_coordinates(all_coordinates, centroid, level_2, level_1)
if level_3 is not None:
all_coordinates, centroid = geo_level3.get_level3_coordinates(coordinates, centroid, level_3, level_1)
geojson = get_geojson(ent, all_coordinates, centroid)
return geojson
def get_geojson(ent, arr, centroid):
poly_json = {}
poly_json['type'] = 'FeatureCollection'
poly_json['features'] = []
coordinates= []
coordinates.append(arr)
poly_json['features'].append({
'type':'Feature',
'id': ent,
'properties': {
'centroid': centroid
},
'geometry': {
'type':'Polygon',
'coordinates': coordinates
}
})
return poly_json
def export(ent, poly_json):
with open(ent+'.geojson', 'w') as outfile:
json.dump(poly_json, outfile)