Skip to content

Commit a26a02e

Browse files
committed
Use iloc in nearest - STRTree returns array index
Closes #49
1 parent c6d3190 commit a26a02e

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/snkit/network.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ def nearest(geom: Geometry, gdf: GeoDataFrame) -> "pandas.Series[Any]":
705705
"""Find the element of a GeoDataFrame nearest a shapely geometry"""
706706
try:
707707
match_idx = gdf.sindex.nearest(geom, return_all=False)[1][0]
708-
nearest_geom: "pandas.Series[Any]" = gdf.loc[match_idx]
708+
nearest_geom: "pandas.Series[Any]" = gdf.iloc[match_idx]
709709
return nearest_geom
710710

711711
except TypeError:

tests/test_init.py

+28
Original file line numberDiff line numberDiff line change
@@ -846,3 +846,31 @@ def test_matching_gdf_from_geoms(edge_only):
846846
gdf["b"] = "abc"
847847
actual = snkit.network.matching_gdf_from_geoms(gdf, geoms)
848848
assert_frame_equal(actual, expected)
849+
850+
851+
def test_nearest():
852+
a = Point((0, 0))
853+
b = Point((0, 2))
854+
c = Point((0, 1))
855+
d = Point((1, 1))
856+
ab = LineString([a, b])
857+
cd = LineString([c, d])
858+
gdf = GeoDataFrame(geometry=[ab, cd])
859+
860+
# default RangeIndex
861+
actual = snkit.network.nearest(Point(0.1, -0.1), gdf)
862+
assert actual.geometry == LineString([Point(0, 0), Point(0, 2)])
863+
864+
# set integer index, not running from 0..n
865+
gdf["edge_id"] = [1, 4]
866+
gdf.set_index("edge_id", inplace=True)
867+
actual = snkit.network.nearest(Point(1.0, 0.9), gdf)
868+
assert actual.name == 4
869+
assert actual.geometry == LineString([Point(0, 1), Point(1, 1)])
870+
871+
# set a non-integer index
872+
gdf["edge_id"] = ["ab", "cd"]
873+
gdf.set_index("edge_id", inplace=True)
874+
actual = snkit.network.nearest(Point(1.1, 1.1), gdf)
875+
assert actual.name == "cd"
876+
assert actual.geometry == LineString([Point(0, 1), Point(1, 1)])

0 commit comments

Comments
 (0)