Skip to content

Commit baffc5e

Browse files
committed
Update the snap function using KDTree
1 parent 21c362b commit baffc5e

File tree

1 file changed

+23
-3
lines changed

1 file changed

+23
-3
lines changed

src/pam/operations/snap.py

+23-3
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
from pathlib import Path
44

55
import geopandas as gp
6+
import numpy as np
67

78
from pam.core import Population
89
from pam.read import read_matsim
910
from pam.write import write_matsim
11+
from scipy.spatial import cKDTree
1012

1113

1214
def snap_facilities_to_network(
@@ -19,11 +21,29 @@ def snap_facilities_to_network(
1921
network (gp.GeoDataFrame): A network geometry shapefile.
2022
link_id_field (str, optional): The link ID field to use in the network shapefile. Defaults to "id".
2123
"""
22-
link_ids = network[link_id_field]
24+
if network.geometry.geom_type[0] == 'Point':
25+
coordinates = np.array(list(zip(network.geometry.x, network.geometry.y)))
26+
else:
27+
coordinates = np.array(list(zip(network.geometry.centroid.x, network.geometry.centroid.y)))
28+
29+
tree = cKDTree(coordinates)
30+
link_ids = network[link_id_field].values
31+
32+
activity_points = []
33+
activities_info = []
2334
for _, _, person in population.people():
2435
for act in person.activities:
25-
link_id = link_ids[network.distance(act.location.loc).argmin()]
26-
act.location.link = link_id
36+
point = act.location.loc
37+
if not hasattr(point, 'x') or not hasattr(point, 'y'):
38+
point = point.centroid
39+
activity_points.append((point.x, point.y))
40+
activities_info.append(act)
41+
42+
activity_points = np.array(activity_points)
43+
distances, indices = tree.query(activity_points)
44+
45+
for act, index in zip(activities_info, indices):
46+
act.location.link = link_ids[index]
2747

2848

2949
def run_facility_link_snapping(

0 commit comments

Comments
 (0)