Spaces:
Running
Running
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
""" | |
Created on Tue Aug 2 12:38:31 2022 | |
@author: syed | |
""" | |
import regex_spatial | |
from utils import geoutil | |
north = ["north", "N'", "North", "NORTH"] | |
south = ["south", "S'", "South", "SOUTH"] | |
east = ["east", "E'", "East", "EAST"] | |
west = ["west", "W'", "West", "WEST"] | |
northeast = ["north-east", "NE'", "north east", "NORTH-EAST", "North East", "NORTH EAST"] | |
southeast = ["south-east", "SE'", "south east", "SOUTH-EAST", "South East", "SOUTH EAST"] | |
northwest = ["north-west", "NW'", "north west", "NORTH-WEST", "North West", "NORTH WEST"] | |
southwest = ["south-west", "SW'", "south west", "SOUTH-WEST", "South West", "SOUTH WEST"] | |
center = ["center","central", "downtown","midtown"] | |
def get_min_max(direction): | |
regex = regex_spatial.get_directional_regex() | |
direction_list = regex.split("|") | |
if direction in direction_list: | |
if direction in north: | |
return (337, 22) | |
if direction in northeast: | |
return (22, 67) | |
if direction in east: | |
return (67, 112) | |
if direction in southeast: | |
return (112, 157) | |
if direction in south: | |
return (157, 202) | |
if direction in southwest: | |
return (202, 247) | |
if direction in west: | |
return (247, 292) | |
if direction in northwest: | |
return (292, 337) | |
return None | |
def get_directional_coordinates_by_angle(coordinates, direction, minimum, maximum): | |
direction_coordinates = [] | |
for p in coordinates: | |
if direction in north: | |
if p[2] >= minimum or p[2] <= maximum: | |
direction_coordinates.append(p) | |
else: | |
if p[2] >= minimum and p[2] <= maximum: | |
direction_coordinates.append(p) | |
return direction_coordinates | |
def get_directional_coordinates(coordinates, direction, centroid , minimum, maximum, is_midmid): | |
direction_coordinates = get_directional_coordinates_by_angle(coordinates, direction, minimum, maximum) | |
midmid1, midmid2= geoutil.get_midmid_point(centroid, direction_coordinates[0],direction_coordinates[-1], is_midmid) | |
if direction in south: | |
maxi = max(p[2] for p in direction_coordinates) | |
mini = min(p[2] for p in direction_coordinates) | |
index_mini = 0 | |
index_maxi = 0 | |
for idx,p in enumerate(direction_coordinates): | |
if p[2] == mini: | |
index_mini = idx | |
if p[2] == maxi: | |
index_maxi = idx | |
direction_coordinates.insert(index_maxi+1, midmid2) | |
direction_coordinates.insert(index_mini+1, midmid1) | |
else: | |
direction_coordinates.append(midmid2) | |
direction_coordinates.append(midmid1) | |
return direction_coordinates, midmid1, midmid2 | |
def get_level1_coordinates(coordinates, centroid, direction, is_midmid): | |
min_max = get_min_max(direction) | |
if min_max is not None: | |
coordinates, mid1, mid2 = get_directional_coordinates(coordinates, direction, centroid, | |
min_max[0], min_max[1],is_midmid) | |
#centroid = geoutil.get_centroid(coordinates, centroid,min_max[0], min_max[1]) | |
return coordinates, centroid, mid1, mid2 | |
elif direction.lower() in center: | |
return get_central(coordinates, centroid, direction, is_midmid), centroid, None, None | |
else : | |
return coordinates, centroid, None, None | |
def get_central(coordinates, centroid, direction, is_midmid): | |
n_min_max = get_min_max("north") | |
n_coordinates=get_directional_coordinates_by_angle(coordinates, "north", n_min_max[0], n_min_max[1]) | |
n_mid1, n_mid2 = geoutil.get_midmid_point(centroid,n_coordinates[0],n_coordinates[-1], is_midmid) | |
ne_min_max = get_min_max("north east") | |
ne_coordinates=get_directional_coordinates_by_angle(coordinates, "north east", ne_min_max[0], ne_min_max[1]) | |
ne_mid1, ne_mid2 = geoutil.get_midmid_point(centroid,ne_coordinates[0],ne_coordinates[-1], is_midmid) | |
e_min_max = get_min_max("east") | |
e_coordinates=get_directional_coordinates_by_angle(coordinates, "east", e_min_max[0], e_min_max[1]) | |
e_mid1, e_mid2 = geoutil.get_midmid_point(centroid,e_coordinates[0],e_coordinates[-1], is_midmid) | |
se_min_max = get_min_max("south east") | |
se_coordinates=get_directional_coordinates_by_angle(coordinates, "south east", se_min_max[0], se_min_max[1]) | |
se_mid1, se_mid2 = geoutil.get_midmid_point(centroid,se_coordinates[0],se_coordinates[-1], is_midmid) | |
s_min_max = get_min_max("south") | |
s_coordinates=get_directional_coordinates_by_angle(coordinates, "south", s_min_max[0], s_min_max[1]) | |
s_mid1, s_mid2 = geoutil.get_midmid_point(centroid,s_coordinates[0],s_coordinates[-1], is_midmid) | |
sw_min_max = get_min_max("south west") | |
sw_coordinates=get_directional_coordinates_by_angle(coordinates, "south west", sw_min_max[0], sw_min_max[1]) | |
sw_mid1, sw_mid2 = geoutil.get_midmid_point(centroid,sw_coordinates[0],sw_coordinates[-1], is_midmid) | |
w_min_max = get_min_max("west") | |
w_coordinates=get_directional_coordinates_by_angle(coordinates, "west", w_min_max[0], w_min_max[1]) | |
w_mid1, w_mid2 = geoutil.get_midmid_point(centroid,w_coordinates[0],w_coordinates[-1], is_midmid) | |
nw_min_max = get_min_max("north west") | |
nw_coordinates=get_directional_coordinates_by_angle(coordinates, "north west", nw_min_max[0], nw_min_max[1]) | |
nw_mid1, nw_mid2 = geoutil.get_midmid_point(centroid,nw_coordinates[0],nw_coordinates[-1], is_midmid) | |
central_coordindates =[n_mid1, n_mid2, ne_mid1, ne_mid2, e_mid1, e_mid2, | |
se_mid1, se_mid2, s_mid1, s_mid2, sw_mid1, sw_mid2, | |
w_mid1, w_mid2, nw_mid1, nw_mid2] | |
return central_coordindates | |