Spaces:
Sleeping
Sleeping
Shunfeng Zheng
commited on
Upload 18 files
Browse files- disambiguation/__pycache__/disambiguate.cpython-310.pyc +0 -0
- disambiguation/__pycache__/disambiguate.cpython-39.pyc +0 -0
- disambiguation/disambiguate.py +155 -0
- geocoder/.DS_Store +0 -0
- geocoder/__pycache__/geo_level1.cpython-310.pyc +0 -0
- geocoder/__pycache__/geo_level1.cpython-39.pyc +0 -0
- geocoder/__pycache__/geo_level11.cpython-310.pyc +0 -0
- geocoder/__pycache__/geo_level2.cpython-310.pyc +0 -0
- geocoder/__pycache__/geo_level2.cpython-39.pyc +0 -0
- geocoder/__pycache__/geo_level3.cpython-310.pyc +0 -0
- geocoder/__pycache__/geo_level3.cpython-39.pyc +0 -0
- geocoder/geo_level1.py +185 -0
- geocoder/geo_level11.py +130 -0
- geocoder/geo_level2.py +117 -0
- geocoder/geo_level3.py +150 -0
- geocoder/llm_coding.py +46 -0
- geocoder/locate_function.py +112 -0
- geocoder/untitled0.py +26 -0
disambiguation/__pycache__/disambiguate.cpython-310.pyc
ADDED
|
Binary file (3.25 kB). View file
|
|
|
disambiguation/__pycache__/disambiguate.cpython-39.pyc
ADDED
|
Binary file (2.2 kB). View file
|
|
|
disambiguation/disambiguate.py
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
Created on Mon Aug 1 13:11:36 2022
|
| 5 |
+
|
| 6 |
+
@author: syed
|
| 7 |
+
"""
|
| 8 |
+
import requests
|
| 9 |
+
import urllib3
|
| 10 |
+
import json
|
| 11 |
+
from geocoder import geo_level1
|
| 12 |
+
from geocoder import geo_level2
|
| 13 |
+
from geocoder import geo_level3
|
| 14 |
+
|
| 15 |
+
from utils import geoutil
|
| 16 |
+
import re
|
| 17 |
+
import regex_spatial
|
| 18 |
+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
def dismabiguate_entities(doc, ent, ase, level_1, level_2, level_3, midmid):
|
| 24 |
+
return get_coordinates(ent, ase, level_1, level_2, level_3, midmid)
|
| 25 |
+
def get_coordinates(ent, ase, level_1, level_2, level_3, midmid):
|
| 26 |
+
request_url = 'https://nominatim.openstreetmap.org/search.php?q='+ase+'&polygon_geojson=1&accept-language=en&format=jsonv2'
|
| 27 |
+
headers = {
|
| 28 |
+
"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"
|
| 29 |
+
}
|
| 30 |
+
page = requests.get(request_url, headers=headers, verify=False)
|
| 31 |
+
# page = requests.get(request_url, verify=False)
|
| 32 |
+
# print(request_url, '++++++')
|
| 33 |
+
# print(ent, '++++++')
|
| 34 |
+
# print(ase, '++++++')
|
| 35 |
+
# print(level_1, '++++++')
|
| 36 |
+
# print(level_2, '++++++')
|
| 37 |
+
# print(level_3, '++++++')
|
| 38 |
+
# print(midmid, '++++++')
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
json_content = json.loads(page.content)
|
| 42 |
+
# json_content = json.loads(aa)
|
| 43 |
+
print(json_content, 'jjjjj')
|
| 44 |
+
all_coordinates = json_content[0]['geojson']['coordinates'][0]
|
| 45 |
+
centroid = (float(json_content[0]['lon']), float(json_content[0]['lat']))
|
| 46 |
+
for p in all_coordinates:
|
| 47 |
+
p2 = (p[0], p[1])
|
| 48 |
+
angle = geoutil.calculate_bearing(centroid, p2)
|
| 49 |
+
p.append(angle)
|
| 50 |
+
mid1 = None
|
| 51 |
+
mid2 = None
|
| 52 |
+
coordinates = all_coordinates
|
| 53 |
+
# if level_1 is not None:
|
| 54 |
+
#
|
| 55 |
+
# all_coordinates, centroid, mid1, mid2 = geo_level1.get_level1_coordinates(all_coordinates, centroid, level_1, midmid)
|
| 56 |
+
|
| 57 |
+
# if level_2 is not None:
|
| 58 |
+
# if level_1 is not None and level_1.lower() not in geo_level1.center:
|
| 59 |
+
# all_coordinates, centroid = geo_level2.get_level2_coordinates(coordinates, centroid, level_2, level_1)
|
| 60 |
+
# else:
|
| 61 |
+
# print ("Else executed")
|
| 62 |
+
# all_coordinates, centroid = geo_level2.get_level2_coordinates(all_coordinates, centroid, level_2, level_1)
|
| 63 |
+
|
| 64 |
+
if level_3 is not None:
|
| 65 |
+
all_coordinates, centroid = geo_level3.get_level3_coordinates(coordinates, centroid, level_3, level_1)
|
| 66 |
+
|
| 67 |
+
geojson = get_geojson(ent, all_coordinates, centroid)
|
| 68 |
+
|
| 69 |
+
return geojson
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
def dismabiguate_entities_between(doc, ent, ase, level_1, level_2, level_3, midmid):
|
| 73 |
+
return get_coordinates_between(doc, ent, ase, level_1, level_2, level_3, midmid)
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
def get_coordinates_between(doc, ent, ase, level_1, level_2, level_3, midmid):
|
| 77 |
+
|
| 78 |
+
# first ase
|
| 79 |
+
request_url = 'https://nominatim.openstreetmap.org/search.php?q=' + doc.ents[0].text + '&polygon_geojson=1&accept-language=en&format=jsonv2'
|
| 80 |
+
headers = {
|
| 81 |
+
"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"
|
| 82 |
+
}
|
| 83 |
+
page1 = requests.get(request_url, headers=headers, verify=False)
|
| 84 |
+
|
| 85 |
+
# second ase
|
| 86 |
+
request_url = 'https://nominatim.openstreetmap.org/search.php?q=' + doc.ents[1].text + '&polygon_geojson=1&accept-language=en&format=jsonv2'
|
| 87 |
+
headers = {
|
| 88 |
+
"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"
|
| 89 |
+
}
|
| 90 |
+
page = requests.get(request_url, headers=headers, verify=False)
|
| 91 |
+
|
| 92 |
+
|
| 93 |
+
request_url = 'https://nominatim.openstreetmap.org/search.php?q=' + ase + '&polygon_geojson=1&accept-language=en&format=jsonv2'
|
| 94 |
+
headers = {
|
| 95 |
+
"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"
|
| 96 |
+
}
|
| 97 |
+
page = requests.get(request_url, headers=headers, verify=False)
|
| 98 |
+
print('bebe')
|
| 99 |
+
print(ase)
|
| 100 |
+
print(doc.ents)
|
| 101 |
+
|
| 102 |
+
json_content = json.loads(page.content)
|
| 103 |
+
# json_content = json.loads(aa)
|
| 104 |
+
# print(json_content, 'jjj')
|
| 105 |
+
all_coordinates = json_content[0]['geojson']['coordinates'][0]
|
| 106 |
+
centroid = (float(json_content[0]['lon']), float(json_content[0]['lat']))
|
| 107 |
+
for p in all_coordinates:
|
| 108 |
+
p2 = (p[0], p[1])
|
| 109 |
+
angle = geoutil.calculate_bearing(centroid, p2)
|
| 110 |
+
p.append(angle)
|
| 111 |
+
mid1 = None
|
| 112 |
+
mid2 = None
|
| 113 |
+
coordinates = all_coordinates
|
| 114 |
+
if level_1 is not None:
|
| 115 |
+
|
| 116 |
+
all_coordinates, centroid, mid1, mid2 = geo_level1.get_level1_coordinates(all_coordinates, centroid, level_1, midmid)
|
| 117 |
+
|
| 118 |
+
if level_2 is not None:
|
| 119 |
+
if level_1 is not None and level_1.lower() not in geo_level1.center:
|
| 120 |
+
all_coordinates, centroid = geo_level2.get_level2_coordinates(coordinates, centroid, level_2, level_1)
|
| 121 |
+
else:
|
| 122 |
+
print ("Else executed")
|
| 123 |
+
all_coordinates, centroid = geo_level2.get_level2_coordinates(all_coordinates, centroid, level_2, level_1)
|
| 124 |
+
|
| 125 |
+
if level_3 is not None:
|
| 126 |
+
all_coordinates, centroid = geo_level3.get_level3_coordinates(coordinates, centroid, level_3, level_1)
|
| 127 |
+
|
| 128 |
+
geojson = get_geojson(ent, all_coordinates, centroid)
|
| 129 |
+
|
| 130 |
+
return geojson
|
| 131 |
+
|
| 132 |
+
def get_geojson(ent, arr, centroid):
|
| 133 |
+
poly_json = {}
|
| 134 |
+
poly_json['type'] = 'FeatureCollection'
|
| 135 |
+
poly_json['features'] = []
|
| 136 |
+
coordinates= []
|
| 137 |
+
coordinates.append(arr)
|
| 138 |
+
poly_json['features'].append({
|
| 139 |
+
'type':'Feature',
|
| 140 |
+
'id': ent,
|
| 141 |
+
'properties': {
|
| 142 |
+
'centroid': centroid
|
| 143 |
+
},
|
| 144 |
+
'geometry': {
|
| 145 |
+
'type':'Polygon',
|
| 146 |
+
'coordinates': coordinates
|
| 147 |
+
}
|
| 148 |
+
})
|
| 149 |
+
return poly_json
|
| 150 |
+
|
| 151 |
+
def export(ent, poly_json):
|
| 152 |
+
with open(ent+'.geojson', 'w') as outfile:
|
| 153 |
+
json.dump(poly_json, outfile)
|
| 154 |
+
|
| 155 |
+
|
geocoder/.DS_Store
ADDED
|
Binary file (6.15 kB). View file
|
|
|
geocoder/__pycache__/geo_level1.cpython-310.pyc
ADDED
|
Binary file (4.18 kB). View file
|
|
|
geocoder/__pycache__/geo_level1.cpython-39.pyc
ADDED
|
Binary file (3.95 kB). View file
|
|
|
geocoder/__pycache__/geo_level11.cpython-310.pyc
ADDED
|
Binary file (3.86 kB). View file
|
|
|
geocoder/__pycache__/geo_level2.cpython-310.pyc
ADDED
|
Binary file (2.84 kB). View file
|
|
|
geocoder/__pycache__/geo_level2.cpython-39.pyc
ADDED
|
Binary file (2.87 kB). View file
|
|
|
geocoder/__pycache__/geo_level3.cpython-310.pyc
ADDED
|
Binary file (3.61 kB). View file
|
|
|
geocoder/__pycache__/geo_level3.cpython-39.pyc
ADDED
|
Binary file (2.78 kB). View file
|
|
|
geocoder/geo_level1.py
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
Created on Tue Aug 2 12:38:31 2022
|
| 5 |
+
|
| 6 |
+
@author: syed
|
| 7 |
+
"""
|
| 8 |
+
import regex_spatial
|
| 9 |
+
from utils import geoutil
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
north = ["north", "N'", "North", "NORTH"]
|
| 13 |
+
south = ["south", "S'", "South", "SOUTH"]
|
| 14 |
+
east = ["east", "E'", "East", "EAST"]
|
| 15 |
+
west = ["west", "W'", "West", "WEST"]
|
| 16 |
+
northeast = ["north-east", "NE'", "north east", "NORTH-EAST", "North East", "NORTH EAST", 'northeast']
|
| 17 |
+
southeast = ["south-east", "SE'", "south east", "SOUTH-EAST", "South East", "SOUTH EAST", 'southeast']
|
| 18 |
+
northwest = ["north-west", "NW'", "north west", "NORTH-WEST", "North West", "NORTH WEST", 'northwest']
|
| 19 |
+
southwest = ["south-west", "SW'", "south west", "SOUTH-WEST", "South West", "SOUTH WEST", 'southwest']
|
| 20 |
+
center = ["center","central", "downtown","midtown"]
|
| 21 |
+
def get_min_max(direction):
|
| 22 |
+
regex = regex_spatial.get_directional_regex()
|
| 23 |
+
direction_list = regex.split("|")
|
| 24 |
+
if direction in direction_list:
|
| 25 |
+
if direction in east:
|
| 26 |
+
return (337, 22)
|
| 27 |
+
if direction in northeast:
|
| 28 |
+
return (22, 67)
|
| 29 |
+
if direction in north:
|
| 30 |
+
return (67, 112)
|
| 31 |
+
if direction in northwest:
|
| 32 |
+
return (112, 157)
|
| 33 |
+
if direction in west:
|
| 34 |
+
return (157, 202)
|
| 35 |
+
if direction in southwest:
|
| 36 |
+
return (202, 247)
|
| 37 |
+
if direction in south:
|
| 38 |
+
return (247, 292)
|
| 39 |
+
if direction in southeast:
|
| 40 |
+
return (292, 337)
|
| 41 |
+
|
| 42 |
+
return None
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def get_min_max(direction):
|
| 46 |
+
regex = regex_spatial.get_directional_regex()
|
| 47 |
+
direction_list = regex.split("|")
|
| 48 |
+
if direction in direction_list:
|
| 49 |
+
if direction in east:
|
| 50 |
+
return (337, 22)
|
| 51 |
+
if direction in northeast:
|
| 52 |
+
return (292, 337)
|
| 53 |
+
if direction in north:
|
| 54 |
+
return (247, 292)
|
| 55 |
+
if direction in northwest:
|
| 56 |
+
return (202, 247)
|
| 57 |
+
if direction in west:
|
| 58 |
+
return (157, 202)
|
| 59 |
+
if direction in southwest:
|
| 60 |
+
return (112, 157)
|
| 61 |
+
if direction in south:
|
| 62 |
+
return (67, 112)
|
| 63 |
+
if direction in southeast:
|
| 64 |
+
return (22, 67)
|
| 65 |
+
|
| 66 |
+
return None
|
| 67 |
+
|
| 68 |
+
# def get_min_max(direction):
|
| 69 |
+
# regex = regex_spatial.get_directional_regex()
|
| 70 |
+
# direction_list = regex.split("|")
|
| 71 |
+
# if direction in direction_list:
|
| 72 |
+
# if direction in north:
|
| 73 |
+
# return (337, 22)
|
| 74 |
+
# if direction in northeast:
|
| 75 |
+
# return (22, 67)
|
| 76 |
+
# if direction in east:
|
| 77 |
+
# return (67, 112)
|
| 78 |
+
# if direction in southeast:
|
| 79 |
+
# return (112, 157)
|
| 80 |
+
# if direction in south:
|
| 81 |
+
# return (157, 202)
|
| 82 |
+
# if direction in southwest:
|
| 83 |
+
# return (202, 247)
|
| 84 |
+
# if direction in west:
|
| 85 |
+
# return (247, 292)
|
| 86 |
+
# if direction in northwest:
|
| 87 |
+
# return (292, 337)
|
| 88 |
+
#
|
| 89 |
+
# return None
|
| 90 |
+
|
| 91 |
+
def get_directional_coordinates_by_angle(coordinates, direction, minimum, maximum):
|
| 92 |
+
direction_coordinates = []
|
| 93 |
+
for p in coordinates:
|
| 94 |
+
if direction in east:
|
| 95 |
+
if p[2] >= minimum or p[2] <= maximum:
|
| 96 |
+
direction_coordinates.append(p)
|
| 97 |
+
|
| 98 |
+
else:
|
| 99 |
+
if p[2] >= minimum and p[2] <= maximum:
|
| 100 |
+
direction_coordinates.append(p)
|
| 101 |
+
return direction_coordinates
|
| 102 |
+
|
| 103 |
+
def get_directional_coordinates(coordinates, direction, centroid , minimum, maximum, is_midmid):
|
| 104 |
+
direction_coordinates = get_directional_coordinates_by_angle(coordinates, direction, minimum, maximum)
|
| 105 |
+
print(direction_coordinates, 'ddddd')
|
| 106 |
+
midmid1, midmid2= geoutil.get_midmid_point(centroid, direction_coordinates[0],direction_coordinates[-1], is_midmid)
|
| 107 |
+
if direction in west:
|
| 108 |
+
maxi = max(p[2] for p in direction_coordinates)
|
| 109 |
+
mini = min(p[2] for p in direction_coordinates)
|
| 110 |
+
index_mini = 0
|
| 111 |
+
index_maxi = 0
|
| 112 |
+
for idx,p in enumerate(direction_coordinates):
|
| 113 |
+
if p[2] == mini:
|
| 114 |
+
index_mini = idx
|
| 115 |
+
if p[2] == maxi:
|
| 116 |
+
index_maxi = idx
|
| 117 |
+
|
| 118 |
+
direction_coordinates.insert(index_maxi+1, midmid2)
|
| 119 |
+
direction_coordinates.insert(index_mini+1, midmid1)
|
| 120 |
+
print(index_maxi+1, midmid2, 'imim')
|
| 121 |
+
print(index_mini+1, midmid1, 'imim')
|
| 122 |
+
else:
|
| 123 |
+
direction_coordinates.append(midmid2)
|
| 124 |
+
direction_coordinates.append(midmid1)
|
| 125 |
+
|
| 126 |
+
return direction_coordinates, midmid1, midmid2
|
| 127 |
+
|
| 128 |
+
def get_level1_coordinates(coordinates, centroid, direction, is_midmid):
|
| 129 |
+
min_max = get_min_max(direction)
|
| 130 |
+
if min_max is not None:
|
| 131 |
+
coordinates, mid1, mid2 = get_directional_coordinates(coordinates, direction, centroid,
|
| 132 |
+
min_max[0], min_max[1],is_midmid)
|
| 133 |
+
# print(mid1, 'min_max')
|
| 134 |
+
# print(mid2, 'min_max')
|
| 135 |
+
print(coordinates, 'min_max')
|
| 136 |
+
print("Level 1 Coordinates///")
|
| 137 |
+
for idx, p in enumerate(coordinates):
|
| 138 |
+
print(idx, p)
|
| 139 |
+
return coordinates, centroid, mid1, mid2
|
| 140 |
+
elif direction.lower() in center:
|
| 141 |
+
return get_central(coordinates, centroid, direction, is_midmid), centroid, None, None
|
| 142 |
+
else :
|
| 143 |
+
return coordinates, centroid, None, None
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
def get_central(coordinates, centroid, direction, is_midmid):
|
| 147 |
+
|
| 148 |
+
n_min_max = get_min_max("north")
|
| 149 |
+
n_coordinates=get_directional_coordinates_by_angle(coordinates, "north", n_min_max[0], n_min_max[1])
|
| 150 |
+
n_mid1, n_mid2 = geoutil.get_midmid_point(centroid,n_coordinates[0],n_coordinates[-1], is_midmid)
|
| 151 |
+
|
| 152 |
+
ne_min_max = get_min_max("north east")
|
| 153 |
+
ne_coordinates=get_directional_coordinates_by_angle(coordinates, "north east", ne_min_max[0], ne_min_max[1])
|
| 154 |
+
ne_mid1, ne_mid2 = geoutil.get_midmid_point(centroid,ne_coordinates[0],ne_coordinates[-1], is_midmid)
|
| 155 |
+
|
| 156 |
+
e_min_max = get_min_max("east")
|
| 157 |
+
e_coordinates=get_directional_coordinates_by_angle(coordinates, "east", e_min_max[0], e_min_max[1])
|
| 158 |
+
e_mid1, e_mid2 = geoutil.get_midmid_point(centroid,e_coordinates[0],e_coordinates[-1], is_midmid)
|
| 159 |
+
|
| 160 |
+
se_min_max = get_min_max("south east")
|
| 161 |
+
se_coordinates=get_directional_coordinates_by_angle(coordinates, "south east", se_min_max[0], se_min_max[1])
|
| 162 |
+
se_mid1, se_mid2 = geoutil.get_midmid_point(centroid,se_coordinates[0],se_coordinates[-1], is_midmid)
|
| 163 |
+
|
| 164 |
+
s_min_max = get_min_max("south")
|
| 165 |
+
s_coordinates=get_directional_coordinates_by_angle(coordinates, "south", s_min_max[0], s_min_max[1])
|
| 166 |
+
s_mid1, s_mid2 = geoutil.get_midmid_point(centroid,s_coordinates[0],s_coordinates[-1], is_midmid)
|
| 167 |
+
|
| 168 |
+
sw_min_max = get_min_max("south west")
|
| 169 |
+
sw_coordinates=get_directional_coordinates_by_angle(coordinates, "south west", sw_min_max[0], sw_min_max[1])
|
| 170 |
+
sw_mid1, sw_mid2 = geoutil.get_midmid_point(centroid,sw_coordinates[0],sw_coordinates[-1], is_midmid)
|
| 171 |
+
|
| 172 |
+
w_min_max = get_min_max("west")
|
| 173 |
+
w_coordinates=get_directional_coordinates_by_angle(coordinates, "west", w_min_max[0], w_min_max[1])
|
| 174 |
+
w_mid1, w_mid2 = geoutil.get_midmid_point(centroid,w_coordinates[0],w_coordinates[-1], is_midmid)
|
| 175 |
+
|
| 176 |
+
nw_min_max = get_min_max("north west")
|
| 177 |
+
nw_coordinates=get_directional_coordinates_by_angle(coordinates, "north west", nw_min_max[0], nw_min_max[1])
|
| 178 |
+
nw_mid1, nw_mid2 = geoutil.get_midmid_point(centroid,nw_coordinates[0],nw_coordinates[-1], is_midmid)
|
| 179 |
+
|
| 180 |
+
central_coordindates =[e_mid1, e_mid2, ne_mid1, ne_mid2, n_mid1, n_mid2,
|
| 181 |
+
nw_mid1, nw_mid2, w_mid1, w_mid2, sw_mid1, sw_mid2,
|
| 182 |
+
s_mid1, s_mid2, se_mid1, se_mid2]
|
| 183 |
+
return central_coordindates
|
| 184 |
+
|
| 185 |
+
|
geocoder/geo_level11.py
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
Created on Tue Aug 2 12:38:31 2022
|
| 5 |
+
|
| 6 |
+
@author: syed
|
| 7 |
+
"""
|
| 8 |
+
import regex_spatial
|
| 9 |
+
from utils import geoutil
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
north = ["north", "N'", "North", "NORTH"]
|
| 13 |
+
south = ["south", "S'", "South", "SOUTH"]
|
| 14 |
+
east = ["east", "E'", "East", "EAST"]
|
| 15 |
+
west = ["west", "W'", "West", "WEST"]
|
| 16 |
+
northeast = ["north-east", "NE'", "north east", "NORTH-EAST", "North East", "NORTH EAST"]
|
| 17 |
+
southeast = ["south-east", "SE'", "south east", "SOUTH-EAST", "South East", "SOUTH EAST"]
|
| 18 |
+
northwest = ["north-west", "NW'", "north west", "NORTH-WEST", "North West", "NORTH WEST"]
|
| 19 |
+
southwest = ["south-west", "SW'", "south west", "SOUTH-WEST", "South West", "SOUTH WEST"]
|
| 20 |
+
center = ["center","central", "downtown","midtown"]
|
| 21 |
+
def get_min_max(direction):
|
| 22 |
+
regex = regex_spatial.get_directional_regex()
|
| 23 |
+
direction_list = regex.split("|")
|
| 24 |
+
if direction in direction_list:
|
| 25 |
+
if direction in north:
|
| 26 |
+
return (337, 22)
|
| 27 |
+
if direction in northeast:
|
| 28 |
+
return (22, 67)
|
| 29 |
+
if direction in east:
|
| 30 |
+
return (67, 112)
|
| 31 |
+
if direction in southeast:
|
| 32 |
+
return (112, 157)
|
| 33 |
+
if direction in south:
|
| 34 |
+
return (157, 202)
|
| 35 |
+
if direction in southwest:
|
| 36 |
+
return (202, 247)
|
| 37 |
+
if direction in west:
|
| 38 |
+
return (247, 292)
|
| 39 |
+
if direction in northwest:
|
| 40 |
+
return (292, 337)
|
| 41 |
+
|
| 42 |
+
return None
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def get_directional_coordinates_by_angle(coordinates, direction, minimum, maximum):
|
| 46 |
+
direction_coordinates = []
|
| 47 |
+
for p in coordinates:
|
| 48 |
+
if direction in north:
|
| 49 |
+
if p[2] >= minimum or p[2] <= maximum:
|
| 50 |
+
direction_coordinates.append(p)
|
| 51 |
+
|
| 52 |
+
else:
|
| 53 |
+
if p[2] >= minimum and p[2] <= maximum:
|
| 54 |
+
direction_coordinates.append(p)
|
| 55 |
+
return direction_coordinates
|
| 56 |
+
|
| 57 |
+
def get_directional_coordinates(coordinates, direction, centroid , minimum, maximum, is_midmid):
|
| 58 |
+
direction_coordinates = get_directional_coordinates_by_angle(coordinates, direction, minimum, maximum)
|
| 59 |
+
|
| 60 |
+
midmid1, midmid2= geoutil.get_midmid_point(centroid, direction_coordinates[0],direction_coordinates[-1], is_midmid)
|
| 61 |
+
if direction in south:
|
| 62 |
+
maxi = max(p[2] for p in direction_coordinates)
|
| 63 |
+
mini = min(p[2] for p in direction_coordinates)
|
| 64 |
+
index_mini = 0
|
| 65 |
+
index_maxi = 0
|
| 66 |
+
for idx,p in enumerate(direction_coordinates):
|
| 67 |
+
if p[2] == mini:
|
| 68 |
+
index_mini = idx
|
| 69 |
+
if p[2] == maxi:
|
| 70 |
+
index_maxi = idx
|
| 71 |
+
|
| 72 |
+
direction_coordinates.insert(index_maxi+1, midmid2)
|
| 73 |
+
direction_coordinates.insert(index_mini+1, midmid1)
|
| 74 |
+
else:
|
| 75 |
+
direction_coordinates.append(midmid2)
|
| 76 |
+
direction_coordinates.append(midmid1)
|
| 77 |
+
|
| 78 |
+
return direction_coordinates, midmid1, midmid2
|
| 79 |
+
|
| 80 |
+
def get_level1_coordinates(coordinates, centroid, direction, is_midmid):
|
| 81 |
+
min_max = get_min_max(direction)
|
| 82 |
+
if min_max is not None:
|
| 83 |
+
coordinates, mid1, mid2 = get_directional_coordinates(coordinates, direction, centroid,
|
| 84 |
+
min_max[0], min_max[1],is_midmid)
|
| 85 |
+
#centroid = geoutil.get_centroid(coordinates, centroid,min_max[0], min_max[1])
|
| 86 |
+
return coordinates, centroid, mid1, mid2
|
| 87 |
+
elif direction.lower() in center:
|
| 88 |
+
return get_central(coordinates, centroid, direction, is_midmid), centroid, None, None
|
| 89 |
+
else :
|
| 90 |
+
return coordinates, centroid, None, None
|
| 91 |
+
def get_central(coordinates, centroid, direction, is_midmid):
|
| 92 |
+
|
| 93 |
+
n_min_max = get_min_max("north")
|
| 94 |
+
n_coordinates=get_directional_coordinates_by_angle(coordinates, "north", n_min_max[0], n_min_max[1])
|
| 95 |
+
n_mid1, n_mid2 = geoutil.get_midmid_point(centroid,n_coordinates[0],n_coordinates[-1], is_midmid)
|
| 96 |
+
|
| 97 |
+
ne_min_max = get_min_max("north east")
|
| 98 |
+
ne_coordinates=get_directional_coordinates_by_angle(coordinates, "north east", ne_min_max[0], ne_min_max[1])
|
| 99 |
+
ne_mid1, ne_mid2 = geoutil.get_midmid_point(centroid,ne_coordinates[0],ne_coordinates[-1], is_midmid)
|
| 100 |
+
|
| 101 |
+
e_min_max = get_min_max("east")
|
| 102 |
+
e_coordinates=get_directional_coordinates_by_angle(coordinates, "east", e_min_max[0], e_min_max[1])
|
| 103 |
+
e_mid1, e_mid2 = geoutil.get_midmid_point(centroid,e_coordinates[0],e_coordinates[-1], is_midmid)
|
| 104 |
+
|
| 105 |
+
se_min_max = get_min_max("south east")
|
| 106 |
+
se_coordinates=get_directional_coordinates_by_angle(coordinates, "south east", se_min_max[0], se_min_max[1])
|
| 107 |
+
se_mid1, se_mid2 = geoutil.get_midmid_point(centroid,se_coordinates[0],se_coordinates[-1], is_midmid)
|
| 108 |
+
|
| 109 |
+
s_min_max = get_min_max("south")
|
| 110 |
+
s_coordinates=get_directional_coordinates_by_angle(coordinates, "south", s_min_max[0], s_min_max[1])
|
| 111 |
+
s_mid1, s_mid2 = geoutil.get_midmid_point(centroid,s_coordinates[0],s_coordinates[-1], is_midmid)
|
| 112 |
+
|
| 113 |
+
sw_min_max = get_min_max("south west")
|
| 114 |
+
sw_coordinates=get_directional_coordinates_by_angle(coordinates, "south west", sw_min_max[0], sw_min_max[1])
|
| 115 |
+
sw_mid1, sw_mid2 = geoutil.get_midmid_point(centroid,sw_coordinates[0],sw_coordinates[-1], is_midmid)
|
| 116 |
+
|
| 117 |
+
w_min_max = get_min_max("west")
|
| 118 |
+
w_coordinates=get_directional_coordinates_by_angle(coordinates, "west", w_min_max[0], w_min_max[1])
|
| 119 |
+
w_mid1, w_mid2 = geoutil.get_midmid_point(centroid,w_coordinates[0],w_coordinates[-1], is_midmid)
|
| 120 |
+
|
| 121 |
+
nw_min_max = get_min_max("north west")
|
| 122 |
+
nw_coordinates=get_directional_coordinates_by_angle(coordinates, "north west", nw_min_max[0], nw_min_max[1])
|
| 123 |
+
nw_mid1, nw_mid2 = geoutil.get_midmid_point(centroid,nw_coordinates[0],nw_coordinates[-1], is_midmid)
|
| 124 |
+
|
| 125 |
+
central_coordindates =[n_mid1, n_mid2, ne_mid1, ne_mid2, e_mid1, e_mid2,
|
| 126 |
+
se_mid1, se_mid2, s_mid1, s_mid2, sw_mid1, sw_mid2,
|
| 127 |
+
w_mid1, w_mid2, nw_mid1, nw_mid2]
|
| 128 |
+
return central_coordindates
|
| 129 |
+
|
| 130 |
+
|
geocoder/geo_level2.py
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
Created on Tue Aug 2 12:38:31 2022
|
| 5 |
+
|
| 6 |
+
@author: syed
|
| 7 |
+
"""
|
| 8 |
+
import regex_spatial
|
| 9 |
+
from utils import geoutil
|
| 10 |
+
import geopandas as gpd
|
| 11 |
+
import pandas as pd
|
| 12 |
+
import re
|
| 13 |
+
from shapely.geometry import Polygon,mapping
|
| 14 |
+
import numpy as np
|
| 15 |
+
from shapely.geometry import Polygon, MultiPoint
|
| 16 |
+
from shapely.geometry.base import geom_factory
|
| 17 |
+
from shapely.geos import lgeos
|
| 18 |
+
from geocoder import geo_level1
|
| 19 |
+
|
| 20 |
+
#def get_common_coordinates(coordinates, level2):
|
| 21 |
+
#gdp.
|
| 22 |
+
|
| 23 |
+
def get_near(level2):
|
| 24 |
+
near = re.search(regex_spatial.get_near_regex(), level2)
|
| 25 |
+
if near is not None:
|
| 26 |
+
return near.group()
|
| 27 |
+
return None
|
| 28 |
+
|
| 29 |
+
def get_surrounding(level2):
|
| 30 |
+
surrounding = re.search(regex_spatial.get_surrounding_regex(), level2)
|
| 31 |
+
if surrounding is not None:
|
| 32 |
+
return surrounding.group()
|
| 33 |
+
return None
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
def sort_west(coords1, poly2, centroid):
|
| 37 |
+
#coords1 = mapping(poly1)["features"][0]["geometry"]["coordinates"]
|
| 38 |
+
coords2 = mapping(poly2)["features"][0]["geometry"]["coordinates"]
|
| 39 |
+
coord1 = []
|
| 40 |
+
coord2 = []
|
| 41 |
+
coord = []
|
| 42 |
+
for c in coords1:
|
| 43 |
+
pol = list(c[::-1])
|
| 44 |
+
coord1.extend(pol)
|
| 45 |
+
for c in coords2:
|
| 46 |
+
pol = list(c[::-1])
|
| 47 |
+
coord2.extend(pol)
|
| 48 |
+
coo1 = []
|
| 49 |
+
coo2 = []
|
| 50 |
+
for p in coord1:
|
| 51 |
+
angle = geoutil.calculate_bearing(centroid, p)
|
| 52 |
+
if angle >= 157 and angle <= 202:
|
| 53 |
+
coo1.append((p[0], p[1], angle))
|
| 54 |
+
for p in coord2:
|
| 55 |
+
angle = geoutil.calculate_bearing(centroid, p)
|
| 56 |
+
if angle >= 157 and angle <= 202:
|
| 57 |
+
coo2.append((p[0], p[1], angle))
|
| 58 |
+
coo1.extend(coo2)
|
| 59 |
+
return coo1
|
| 60 |
+
|
| 61 |
+
def get_directional_coordinates_by_angle(coordinates, centroid, direction, minimum, maximum):
|
| 62 |
+
direction_coordinates = []
|
| 63 |
+
for p in coordinates:
|
| 64 |
+
angle = geoutil.calculate_bearing(centroid, p)
|
| 65 |
+
if direction in geo_level1.east:
|
| 66 |
+
if angle >= minimum or angle <= maximum:
|
| 67 |
+
direction_coordinates.append(p)
|
| 68 |
+
|
| 69 |
+
else:
|
| 70 |
+
if angle >= minimum and angle <= maximum:
|
| 71 |
+
direction_coordinates.append(p)
|
| 72 |
+
#if(direction in geo_level1.west):
|
| 73 |
+
# direction_coordinates.sort(key=lambda k: k[2], reverse=True)
|
| 74 |
+
|
| 75 |
+
return direction_coordinates
|
| 76 |
+
|
| 77 |
+
def get_direction_coordinates(coordinates, centroid, level1):
|
| 78 |
+
min_max = geo_level1.get_min_max(level1)
|
| 79 |
+
if min_max is not None:
|
| 80 |
+
coord = get_directional_coordinates_by_angle(coordinates, centroid, level1, min_max[0], min_max[1])
|
| 81 |
+
return coord
|
| 82 |
+
return coordinates
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
def get_level2_coordinates(coordinates, centroid, level_2, level_1):
|
| 86 |
+
near = get_near(level_2)
|
| 87 |
+
surrounding = get_surrounding(level_2)
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
poly1 = Polygon(coordinates)
|
| 91 |
+
polygon1 = gpd.GeoSeries(poly1)
|
| 92 |
+
if near is not None:
|
| 93 |
+
poly2 = polygon1.buffer(0.0095, join_style=2)
|
| 94 |
+
if surrounding is not None:
|
| 95 |
+
poly2 = polygon1.buffer(0.012, join_style=2)
|
| 96 |
+
|
| 97 |
+
poly = poly2.difference(polygon1)
|
| 98 |
+
coords = mapping(poly)["features"][0]["geometry"]["coordinates"]
|
| 99 |
+
|
| 100 |
+
coord = []
|
| 101 |
+
for c in coords:
|
| 102 |
+
pol = list(c[::-1])
|
| 103 |
+
coord.extend(pol)
|
| 104 |
+
|
| 105 |
+
if level_1 is not None and level_1.lower() not in geo_level1.center:
|
| 106 |
+
coord = get_direction_coordinates(coord, centroid, level_1)
|
| 107 |
+
if level_1 in geo_level1.west:
|
| 108 |
+
coord = sort_west(coordinates,poly2, centroid)
|
| 109 |
+
|
| 110 |
+
print("Level 2 Coordinates")
|
| 111 |
+
for idx, p in enumerate(coord):
|
| 112 |
+
print(idx, p)
|
| 113 |
+
|
| 114 |
+
return coord, centroid
|
| 115 |
+
|
| 116 |
+
|
| 117 |
+
|
geocoder/geo_level3.py
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
Created on Tue Aug 2 12:38:31 2022
|
| 5 |
+
|
| 6 |
+
@author: syed
|
| 7 |
+
"""
|
| 8 |
+
import regex_spatial
|
| 9 |
+
from utils import geoutil
|
| 10 |
+
import geopandas as gpd
|
| 11 |
+
import pandas as pd
|
| 12 |
+
import re
|
| 13 |
+
from shapely.geometry import Polygon,mapping
|
| 14 |
+
import numpy as np
|
| 15 |
+
from shapely.geometry import Polygon, MultiPoint, LineString, Point
|
| 16 |
+
from shapely.geometry.base import geom_factory
|
| 17 |
+
from shapely.geos import lgeos
|
| 18 |
+
from geocoder import geo_level1
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def get_level3(level3):
|
| 23 |
+
digits = re.findall('[0-9]+', level3)[0]
|
| 24 |
+
unit = re.findall('[A-Za-z]+', level3)[0]
|
| 25 |
+
return digits, unit
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def get_directional_coordinates_by_angle(coordinates, centroid, direction, minimum, maximum):
|
| 29 |
+
direction_coordinates = []
|
| 30 |
+
for p in coordinates:
|
| 31 |
+
angle = geoutil.calculate_bearing(centroid, p)
|
| 32 |
+
p2= (p[0],p[1],angle)
|
| 33 |
+
if direction in geo_level1.east:
|
| 34 |
+
if angle >= minimum or angle <= maximum:
|
| 35 |
+
direction_coordinates.append(p2)
|
| 36 |
+
|
| 37 |
+
else:
|
| 38 |
+
if angle >= minimum and angle <= maximum:
|
| 39 |
+
direction_coordinates.append(p2)
|
| 40 |
+
#print(type(direction_coordinates[0]))
|
| 41 |
+
#if(direction in geo_level1.west):
|
| 42 |
+
# direction_coordinates.sort(key=lambda k: k[2], reverse=True)
|
| 43 |
+
|
| 44 |
+
return direction_coordinates
|
| 45 |
+
|
| 46 |
+
def sort_west(poly1, poly2, centroid):
|
| 47 |
+
coords1 = mapping(poly1)["features"][0]["geometry"]["coordinates"]
|
| 48 |
+
coords2 = mapping(poly2)["features"][0]["geometry"]["coordinates"]
|
| 49 |
+
coord1 = []
|
| 50 |
+
coord2 = []
|
| 51 |
+
coord = []
|
| 52 |
+
for c in coords1:
|
| 53 |
+
pol = list(c[::-1])
|
| 54 |
+
coord1.extend(pol)
|
| 55 |
+
for c in coords2:
|
| 56 |
+
pol = list(c[::-1])
|
| 57 |
+
coord2.extend(pol)
|
| 58 |
+
coo1 = []
|
| 59 |
+
coo2 = []
|
| 60 |
+
for p in coord1:
|
| 61 |
+
angle = geoutil.calculate_bearing(centroid, p)
|
| 62 |
+
if angle >= 157 and angle <= 202:
|
| 63 |
+
coo1.append((p[0], p[1], angle))
|
| 64 |
+
for p in coord2:
|
| 65 |
+
angle = geoutil.calculate_bearing(centroid, p)
|
| 66 |
+
if angle >= 157 and angle <= 202:
|
| 67 |
+
coo2.append((p[0], p[1], angle))
|
| 68 |
+
coo1.extend(coo2)
|
| 69 |
+
return coo1
|
| 70 |
+
|
| 71 |
+
def get_direction_coordinates(coordinates, centroid, level1):
|
| 72 |
+
min_max = geo_level1.get_min_max(level1)
|
| 73 |
+
if min_max is not None:
|
| 74 |
+
coord = get_directional_coordinates_by_angle(coordinates, centroid, level1, min_max[0], min_max[1])
|
| 75 |
+
return coord
|
| 76 |
+
return coordinates
|
| 77 |
+
|
| 78 |
+
def get_level3_coordinates(coordinates, centroid, level_3, level1):
|
| 79 |
+
distance, unit = get_level3(level_3)
|
| 80 |
+
|
| 81 |
+
kms = geoutil.get_kilometers(distance, unit)
|
| 82 |
+
print(distance, unit, kms, 'duk')
|
| 83 |
+
|
| 84 |
+
coord = []
|
| 85 |
+
|
| 86 |
+
poly1 = Polygon(coordinates)
|
| 87 |
+
polygon1 = gpd.GeoSeries(poly1)
|
| 88 |
+
poly2 = polygon1.buffer(0.0095*kms, join_style=2) # 扩大小面积
|
| 89 |
+
poly3 = polygon1.buffer(0.013*kms, join_style=2) # 扩大大面积
|
| 90 |
+
poly = poly3.difference(poly2) # 合二为一成为环状
|
| 91 |
+
coords = mapping(poly)["features"][0]["geometry"]["coordinates"] # 改为坐标格式
|
| 92 |
+
# print(mapping(poly2)["features"][0]["geometry"]["coordinates"], 'cmcm')
|
| 93 |
+
# print(mapping(poly3)["features"][0]["geometry"]["coordinates"], 'cmcm')
|
| 94 |
+
# print(coords, 'cmcm')
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
for c in coords:
|
| 98 |
+
pol = list(c[::-1])
|
| 99 |
+
coord.extend(pol)
|
| 100 |
+
if level1 is not None:
|
| 101 |
+
coord = get_direction_coordinates(coord, centroid, level1)
|
| 102 |
+
if level1 in geo_level1.west:
|
| 103 |
+
coord = sort_west(poly3, poly2, centroid)
|
| 104 |
+
print("Level 3 Coordinates")
|
| 105 |
+
for idx, p in enumerate(coord):
|
| 106 |
+
print(idx, p)
|
| 107 |
+
return coord, centroid
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
def get_between_coordinates(coordinates1, coordinates2, centroid1, centroid2):
|
| 111 |
+
# 创建多边形对象
|
| 112 |
+
poly1 = Polygon(coordinates1)
|
| 113 |
+
poly2 = Polygon(coordinates2)
|
| 114 |
+
|
| 115 |
+
# 计算中心点连线
|
| 116 |
+
center_line = LineString([centroid1, centroid2])
|
| 117 |
+
|
| 118 |
+
def max_perpendicular_distance(poly, line):
|
| 119 |
+
max_dist = 0
|
| 120 |
+
farthest_points = None
|
| 121 |
+
|
| 122 |
+
for point in poly.exterior.coords:
|
| 123 |
+
p = Point(point)
|
| 124 |
+
# 计算点到中心线的垂直距离
|
| 125 |
+
dist = p.distance(line)
|
| 126 |
+
if dist > max_dist:
|
| 127 |
+
max_dist = dist
|
| 128 |
+
farthest_points = p
|
| 129 |
+
|
| 130 |
+
return max_dist * 2 # 计算直径(双倍最大垂直距离)
|
| 131 |
+
|
| 132 |
+
# 计算两个区域的最大垂线距离
|
| 133 |
+
diameter1 = max_perpendicular_distance(poly1, center_line)
|
| 134 |
+
diameter2 = max_perpendicular_distance(poly2, center_line)
|
| 135 |
+
|
| 136 |
+
# 计算平均直径 R
|
| 137 |
+
R = (diameter1 + diameter2) / 2
|
| 138 |
+
|
| 139 |
+
# 计算圆心(两个中心点的中点)
|
| 140 |
+
midpoint = ((centroid1[0] + centroid2[0]) / 2, (centroid1[1] + centroid2[1]) / 2)
|
| 141 |
+
|
| 142 |
+
# 生成圆形区域
|
| 143 |
+
circle = Point(midpoint).buffer(R / 2, resolution=100)
|
| 144 |
+
|
| 145 |
+
# 获取圆的坐标
|
| 146 |
+
circle_coords = list(circle.exterior.coords)
|
| 147 |
+
|
| 148 |
+
return [circle_coords], midpoint
|
| 149 |
+
|
| 150 |
+
|
geocoder/llm_coding.py
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import requests
|
| 2 |
+
import urllib3
|
| 3 |
+
import json
|
| 4 |
+
from utils import geoutil
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
def get_coordinates(ent, ase, level_1, level_2, level_3, midmid):
|
| 10 |
+
request_url = 'https://nominatim.openstreetmap.org/search.php?q= ' +ase +'&polygon_geojson=1&accept-language=en&format=jsonv2'
|
| 11 |
+
headers = {
|
| 12 |
+
"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"
|
| 13 |
+
}
|
| 14 |
+
page = requests.get(request_url, headers=headers, verify=False)
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
json_content = json.loads(page.content)
|
| 19 |
+
# json_content = json.loads(aa)
|
| 20 |
+
print(json_content, 'jjjjj')
|
| 21 |
+
all_coordinates = json_content[0]['geojson']['coordinates'][0]
|
| 22 |
+
centroid = (float(json_content[0]['lon']), float(json_content[0]['lat']))
|
| 23 |
+
for p in all_coordinates:
|
| 24 |
+
p2 = (p[0], p[1])
|
| 25 |
+
angle = geoutil.calculate_bearing(centroid, p2)
|
| 26 |
+
p.append(angle)
|
| 27 |
+
mid1 = None
|
| 28 |
+
mid2 = None
|
| 29 |
+
coordinates = all_coordinates
|
| 30 |
+
# if level_1 is not None:
|
| 31 |
+
#
|
| 32 |
+
# all_coordinates, centroid, mid1, mid2 = geo_level1.get_level1_coordinates(all_coordinates, centroid, level_1, midmid)
|
| 33 |
+
|
| 34 |
+
# if level_2 is not None:
|
| 35 |
+
# if level_1 is not None and level_1.lower() not in geo_level1.center:
|
| 36 |
+
# all_coordinates, centroid = geo_level2.get_level2_coordinates(coordinates, centroid, level_2, level_1)
|
| 37 |
+
# else:
|
| 38 |
+
# print ("Else executed")
|
| 39 |
+
# all_coordinates, centroid = geo_level2.get_level2_coordinates(all_coordinates, centroid, level_2, level_1)
|
| 40 |
+
|
| 41 |
+
if level_3 is not None:
|
| 42 |
+
all_coordinates, centroid = geo_level3.get_level3_coordinates(coordinates, centroid, level_3, level_1)
|
| 43 |
+
|
| 44 |
+
geojson = get_geojson(ent, all_coordinates, centroid)
|
| 45 |
+
|
| 46 |
+
return geojson
|
geocoder/locate_function.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
Created on Tue Aug 2 12:38:31 2022
|
| 5 |
+
|
| 6 |
+
@author: syed
|
| 7 |
+
"""
|
| 8 |
+
import regex_spatial
|
| 9 |
+
from utils import geoutil
|
| 10 |
+
import geopandas as gpd
|
| 11 |
+
import pandas as pd
|
| 12 |
+
import re
|
| 13 |
+
from shapely.geometry import Polygon,mapping
|
| 14 |
+
import numpy as np
|
| 15 |
+
from shapely.geometry import Polygon, MultiPoint, LineString, Point
|
| 16 |
+
from shapely.geometry.base import geom_factory
|
| 17 |
+
from shapely.geos import lgeos
|
| 18 |
+
from geocoder import geo_level1
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
def get_between_coordinates(coordinates1, coordinates2, centroid1, centroid2):
|
| 25 |
+
# 创建多边形对象
|
| 26 |
+
poly1 = Polygon(coordinates1)
|
| 27 |
+
poly2 = Polygon(coordinates2)
|
| 28 |
+
|
| 29 |
+
# 计算中心点连线
|
| 30 |
+
center_line = LineString([centroid1, centroid2])
|
| 31 |
+
|
| 32 |
+
def max_perpendicular_distance(poly, line):
|
| 33 |
+
max_dist = 0
|
| 34 |
+
farthest_points = None
|
| 35 |
+
|
| 36 |
+
for point in poly.exterior.coords:
|
| 37 |
+
p = Point(point)
|
| 38 |
+
# 计算点到中心线的垂直距离
|
| 39 |
+
dist = p.distance(line)
|
| 40 |
+
if dist > max_dist:
|
| 41 |
+
max_dist = dist
|
| 42 |
+
farthest_points = p
|
| 43 |
+
|
| 44 |
+
return max_dist * 2 # 计算直径(双倍最大垂直距离)
|
| 45 |
+
|
| 46 |
+
# 计算两个区域的最大垂线距离
|
| 47 |
+
diameter1 = max_perpendicular_distance(poly1, center_line)
|
| 48 |
+
diameter2 = max_perpendicular_distance(poly2, center_line)
|
| 49 |
+
|
| 50 |
+
# 计算平均直径 R
|
| 51 |
+
R = (diameter1 + diameter2) / 2
|
| 52 |
+
|
| 53 |
+
# 计算圆心(两个中心点的中点)
|
| 54 |
+
midpoint = ((centroid1[0] + centroid2[0]) / 2, (centroid1[1] + centroid2[1]) / 2)
|
| 55 |
+
|
| 56 |
+
# 生成圆形区域
|
| 57 |
+
circle = Point(midpoint).buffer(R / 2, resolution=100)
|
| 58 |
+
|
| 59 |
+
# 获取圆的坐标
|
| 60 |
+
circle_coords = list(circle.exterior.coords)
|
| 61 |
+
|
| 62 |
+
return [circle_coords], midpoint
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
def get_angular_coordinates(coordinates, angle, distance):
|
| 68 |
+
"""
|
| 69 |
+
计算基于输入地点坐标、方向角度和距离的目标点,并返回以该点为圆心的等面积圆形坐标集。
|
| 70 |
+
:param coordinates: 地点的边界坐标列表
|
| 71 |
+
:param angle: 方向角度(以正北为 0 度,顺时针方向)
|
| 72 |
+
:param distance: 目标点距离(单位:公里)
|
| 73 |
+
:return: 以目标点为圆心,等面积半径的圆形坐标集
|
| 74 |
+
"""
|
| 75 |
+
# 计算输入地点的几何中心
|
| 76 |
+
poly = Polygon(coordinates)
|
| 77 |
+
poly_center = poly.centroid
|
| 78 |
+
lat, lon = poly_center.y, poly_center.x # 纬度在前,经度在后
|
| 79 |
+
|
| 80 |
+
# 计算地球上的 1 度经纬度距离(近似值)
|
| 81 |
+
lat_km = 111.32 # 1 度纬度 ≈ 111.32 km
|
| 82 |
+
lon_km = 111.32 * np.cos(np.radians(lat)) # 1 度经度 ≈ 111.32 × cos(纬度)
|
| 83 |
+
|
| 84 |
+
# 计算输入区域的面积(近似 km²,需进一步优化投影转换)
|
| 85 |
+
area_degrees = poly.area # 原始经纬度面积
|
| 86 |
+
area_km2 = area_degrees * (lat_km * lon_km) # 近似转换为 km²
|
| 87 |
+
|
| 88 |
+
# 计算等面积圆的半径 r(单位 km)
|
| 89 |
+
r_km = np.sqrt(area_km2 / np.pi) # 使得 πr² ≈ area_km2
|
| 90 |
+
|
| 91 |
+
# 计算方向向量(基于输入角度)
|
| 92 |
+
angle_rad = np.radians(angle) # 转换为弧度
|
| 93 |
+
d_lat = (np.sin(angle_rad) * distance) / lat_km
|
| 94 |
+
d_lon = (np.cos(angle_rad) * distance) / lon_km
|
| 95 |
+
|
| 96 |
+
# 计算目标点
|
| 97 |
+
target_point = (lon + d_lon, lat + d_lat)
|
| 98 |
+
|
| 99 |
+
# 计算以目标点为圆心,半径 r_km 的圆形坐标集
|
| 100 |
+
circle_points = []
|
| 101 |
+
for theta in np.linspace(0, 360, num=100): # 生成 100 个点构成圆形
|
| 102 |
+
theta_rad = np.radians(theta)
|
| 103 |
+
d_lat = (np.sin(theta_rad) * r_km) / lat_km
|
| 104 |
+
d_lon = (np.cos(theta_rad) * r_km) / lon_km
|
| 105 |
+
circle_points.append((target_point[0] + d_lon, target_point[1] + d_lat))
|
| 106 |
+
|
| 107 |
+
return circle_points
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
|
| 112 |
+
|
geocoder/untitled0.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
Created on Wed Sep 21 21:44:47 2022
|
| 5 |
+
|
| 6 |
+
@author: syed
|
| 7 |
+
"""
|
| 8 |
+
import sys
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
loc_dict = {"east":"This is east", "west": "This is west", "north":"This is north",
|
| 14 |
+
"south":"This is south","up":"This is up","down":"This is down",
|
| 15 |
+
"look":"This is the description", "quit": "To end the game"}
|
| 16 |
+
|
| 17 |
+
user_input = input("Enter your desired location")
|
| 18 |
+
|
| 19 |
+
def findLocation(input, loc_dict):
|
| 20 |
+
if input == "quit":
|
| 21 |
+
sys.exit(f"End of the game with code{input}!")
|
| 22 |
+
else:
|
| 23 |
+
print(loc_dict[input])
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
|