better clusters
This commit is contained in:
parent
85f70d835a
commit
c5a08125f6
@ -12,6 +12,10 @@ from ..utils.get_time_separation import get_distance
|
|||||||
from ..constants import OSM_CACHE_DIR
|
from ..constants import OSM_CACHE_DIR
|
||||||
|
|
||||||
|
|
||||||
|
# silence the overpass logger
|
||||||
|
logging.getLogger('OSMPythonTools').setLevel(level=logging.CRITICAL)
|
||||||
|
|
||||||
|
|
||||||
class Cluster(BaseModel):
|
class Cluster(BaseModel):
|
||||||
""""
|
""""
|
||||||
A class representing an interesting area for shopping or sightseeing.
|
A class representing an interesting area for shopping or sightseeing.
|
||||||
@ -102,7 +106,6 @@ class ClusterManager:
|
|||||||
points.append(coords)
|
points.append(coords)
|
||||||
|
|
||||||
self.all_points = np.array(points)
|
self.all_points = np.array(points)
|
||||||
self.valid = True
|
|
||||||
|
|
||||||
# Apply DBSCAN to find clusters. Choose different settings for different cities.
|
# Apply DBSCAN to find clusters. Choose different settings for different cities.
|
||||||
if self.cluster_type == 'shopping' and len(self.all_points) > 200 :
|
if self.cluster_type == 'shopping' and len(self.all_points) > 200 :
|
||||||
@ -114,12 +117,17 @@ class ClusterManager:
|
|||||||
|
|
||||||
labels = dbscan.fit_predict(self.all_points)
|
labels = dbscan.fit_predict(self.all_points)
|
||||||
|
|
||||||
# Separate clustered points and noise points
|
# Check that there are at least 2 different clusters
|
||||||
self.cluster_points = self.all_points[labels != -1]
|
if len(set(labels)) > 2 :
|
||||||
self.cluster_labels = labels[labels != -1]
|
self.logger.debug(f"Found {len(set(labels))} different clusters.")
|
||||||
|
# Separate clustered points and noise points
|
||||||
|
self.cluster_points = self.all_points[labels != -1]
|
||||||
|
self.cluster_labels = labels[labels != -1]
|
||||||
|
self.filter_clusters() # ValueError here sometimes. I dont know why. # Filter the clusters to keep only the largest ones.
|
||||||
|
self.valid = True
|
||||||
|
|
||||||
# filter the clusters to keep only the largest ones
|
else :
|
||||||
self.filter_clusters()
|
self.valid = False
|
||||||
|
|
||||||
|
|
||||||
def generate_clusters(self) -> list[Landmark]:
|
def generate_clusters(self) -> list[Landmark]:
|
||||||
@ -224,6 +232,9 @@ class ClusterManager:
|
|||||||
for elem in result.elements():
|
for elem in result.elements():
|
||||||
location = (elem.centerLat(), elem.centerLon())
|
location = (elem.centerLat(), elem.centerLon())
|
||||||
|
|
||||||
|
# Skip if element has neither name or location
|
||||||
|
if elem.tag('name') is None :
|
||||||
|
continue
|
||||||
if location[0] is None :
|
if location[0] is None :
|
||||||
location = (elem.lat(), elem.lon())
|
location = (elem.lat(), elem.lon())
|
||||||
if location[0] is None :
|
if location[0] is None :
|
||||||
@ -277,6 +288,6 @@ class ClusterManager:
|
|||||||
filtered_cluster_labels.append(np.full((label_counts[label],), label)) # Replicate the label
|
filtered_cluster_labels.append(np.full((label_counts[label],), label)) # Replicate the label
|
||||||
|
|
||||||
# update the cluster points and labels with the filtered data
|
# update the cluster points and labels with the filtered data
|
||||||
self.cluster_points = np.vstack(filtered_cluster_points)
|
self.cluster_points = np.vstack(filtered_cluster_points) # ValueError here
|
||||||
self.cluster_labels = np.concatenate(filtered_cluster_labels)
|
self.cluster_labels = np.concatenate(filtered_cluster_labels)
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ class LandmarkManager:
|
|||||||
# caution, when applying a list of selectors, overpass will search for elements that match ALL selectors simultaneously
|
# caution, when applying a list of selectors, overpass will search for elements that match ALL selectors simultaneously
|
||||||
# we need to split the selectors into separate queries and merge the results
|
# we need to split the selectors into separate queries and merge the results
|
||||||
for sel in dict_to_selector_list(amenity_selector):
|
for sel in dict_to_selector_list(amenity_selector):
|
||||||
self.logger.debug(f"Current selector: {sel}")
|
# self.logger.debug(f"Current selector: {sel}")
|
||||||
|
|
||||||
# query_conditions = ['count_tags()>5']
|
# query_conditions = ['count_tags()>5']
|
||||||
# if landmarktype == 'shopping' : # use this later for shopping clusters
|
# if landmarktype == 'shopping' : # use this later for shopping clusters
|
||||||
@ -232,7 +232,7 @@ class LandmarkManager:
|
|||||||
includeCenter = True,
|
includeCenter = True,
|
||||||
out = 'center'
|
out = 'center'
|
||||||
)
|
)
|
||||||
self.logger.debug(f"Query: {query}")
|
# self.logger.debug(f"Query: {query}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = self.overpass.query(query)
|
result = self.overpass.query(query)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user