Skip to content

Commit 3bc928f

Browse files
fix returned index
1 parent 741b1a7 commit 3bc928f

2 files changed

Lines changed: 56 additions & 14 deletions

File tree

shapely/strtree.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -116,28 +116,34 @@ def __init__(
116116
# unzip the list of tuples
117117
geoms, items = list(zip(*geoms))
118118

119-
has_custom_items = items is not None
120-
if not has_custom_items:
121-
items = list(range(len(geoms)))
119+
# Keep references to geoms
120+
self._geoms = list(geoms)
121+
# Default enumeration index to store in the tree
122+
self._idxs = list(range(len(self._geoms)))
122123

124+
# handle items
125+
self._has_custom_items = items is not None
126+
if not self._has_custom_items:
127+
items = self._idxs
123128
self._items = items
124-
self._has_custom_items = has_custom_items
125-
# filter empty geometries out of the input
126-
geoms = [geom for geom in geoms if not geom.is_empty]
127-
self._n_geoms = len(geoms)
128-
self._init_tree(geoms)
129129

130-
# Keep references to geoms.
131-
self._geoms = list(geoms)
130+
self._init_tree(geoms)
132131

133132
def _init_tree(self, geoms):
134133
self._tree = lgeos.GEOSSTRtree_create(self.node_capacity)
135-
self._idxs = list(range(len(geoms)))
134+
i = 0
136135
for idx, geom in zip(self._idxs, geoms):
137-
lgeos.GEOSSTRtree_insert(self._tree, geom._geom, ctypes.py_object(idx))
136+
# filter empty geometries out of the input
137+
if geom is not None and not geom.is_empty:
138+
lgeos.GEOSSTRtree_insert(self._tree, geom._geom, ctypes.py_object(idx))
139+
i += 1
140+
self._n_geoms = i
138141

139142
def __reduce__(self):
140-
return STRtree, (self._geoms, self._items)
143+
if self._has_custom_items:
144+
return STRtree, (self._geoms, self._items)
145+
else:
146+
return STRtree, (self._geoms, )
141147

142148
def __del__(self):
143149
if self._tree is not None:

tests/test_strtree.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,19 @@
77
import pytest
88

99
from shapely.errors import ShapelyDeprecationWarning
10-
from shapely.geometry import Point, Polygon
10+
from shapely.geometry import Point, Polygon, box
1111
from shapely.geos import geos_version
1212
from shapely import strtree
1313
from shapely.strtree import STRtree
14+
from shapely import wkt
1415

1516
from .conftest import requires_geos_342
1617

1718

19+
point = Point(2, 3)
20+
empty = wkt.loads("GEOMETRYCOLLECTION EMPTY")
21+
22+
1823
@requires_geos_342
1924
@pytest.mark.parametrize("geoms", [[Point(i, i) for i in range(10)]])
2025
@pytest.mark.parametrize(
@@ -42,6 +47,37 @@ def test_query_enumeration_idx(geoms, query_geom, expected):
4247
assert sorted(results) == sorted(expected)
4348

4449

50+
@requires_geos_342
51+
@pytest.mark.parametrize("geoms", [[Point(i, i) for i in range(5)]])
52+
@pytest.mark.parametrize("items", [None, list(range(1, 6)), list("abcde")])
53+
@pytest.mark.parametrize(
54+
"query_geom,expected",
55+
[(Point(2, 2).buffer(0.99), [2]), (Point(2, 2).buffer(1.0), [1, 2, 3])],
56+
)
57+
def test_query_items(geoms, items, query_geom, expected):
58+
"""Store enumeration idx"""
59+
with pytest.warns(ShapelyDeprecationWarning):
60+
tree = STRtree(geoms, items)
61+
results = tree.query_items(query_geom)
62+
expected = [items[idx] for idx in expected] if items is not None else expected
63+
assert sorted(results) == sorted(expected)
64+
65+
66+
@pytest.mark.parametrize(
67+
"tree_geometry, geometry,expected",
68+
[
69+
([point], box(0, 0, 10, 10), [0]),
70+
# None/empty is ignored in the tree, but the index of the valid geometry
71+
# should be retained.
72+
([None, point], box(0, 0, 10, 10), [1]),
73+
([None, empty, point], box(0, 0, 10, 10), [2]),
74+
],
75+
)
76+
def test_query_items_with_empty(tree_geometry, geometry, expected):
77+
with pytest.warns(ShapelyDeprecationWarning):
78+
tree = STRtree(tree_geometry)
79+
assert tree.query_items(geometry) == expected
80+
4581
@requires_geos_342
4682
def test_insert_empty_geometry():
4783
"""

0 commit comments

Comments
 (0)