kopia lustrzana https://github.com/onthegomap/planetiler
add polygon index intersection utility
rodzic
ed373ff3d3
commit
a3d0f9e961
|
@ -57,6 +57,13 @@ public class PolygonIndex<T> {
|
|||
return postFilterContaining(point, items);
|
||||
}
|
||||
|
||||
/** Returns the data associated with all polygons containing {@code point}. */
|
||||
public List<T> getIntersecting(Geometry geom) {
|
||||
build();
|
||||
List<?> items = index.query(geom.getEnvelopeInternal());
|
||||
return postFilterIntersecting(geom, items);
|
||||
}
|
||||
|
||||
private List<T> postFilterContaining(Point point, List<?> items) {
|
||||
List<T> result = new ArrayList<>(items.size());
|
||||
for (Object item : items) {
|
||||
|
@ -68,6 +75,17 @@ public class PolygonIndex<T> {
|
|||
return result;
|
||||
}
|
||||
|
||||
private List<T> postFilterIntersecting(Geometry geom, List<?> items) {
|
||||
List<T> result = new ArrayList<>(items.size());
|
||||
for (Object item : items) {
|
||||
if (item instanceof GeomWithData<?> value && value.poly.intersects(geom)) {
|
||||
@SuppressWarnings("unchecked") T t = (T) value.data;
|
||||
result.add(t);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the data associated with either the polygons that contain {@code point} or if none are found than the
|
||||
* nearest polygon to {@code point} with an envelope that contains point.
|
||||
|
|
|
@ -21,10 +21,13 @@ class PolygonIndexTest {
|
|||
void testSingle() {
|
||||
index.put(rectangle(0, 1), 1);
|
||||
assertListsContainSameElements(List.of(1), index.getContaining(newPoint(0.5, 0.5)));
|
||||
assertListsContainSameElements(List.of(1), index.getIntersecting(newPoint(0.5, 0.5)));
|
||||
assertListsContainSameElements(List.of(1), index.getIntersecting(rectangle(1, 2)));
|
||||
assertListsContainSameElements(List.of(1), index.getContainingOrNearest(newPoint(0.5, 0.5)));
|
||||
|
||||
assertListsContainSameElements(List.of(), index.getContaining(newPoint(1.5, 1.5)));
|
||||
assertListsContainSameElements(List.of(), index.getContainingOrNearest(newPoint(1.5, 1.5)));
|
||||
assertListsContainSameElements(List.of(), index.getIntersecting(rectangle(2, 3)));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -33,6 +36,9 @@ class PolygonIndexTest {
|
|||
index.put(rectangle(0, 1), 2);
|
||||
assertListsContainSameElements(List.of(1, 2), index.getContaining(newPoint(0.5, 0.5)));
|
||||
assertListsContainSameElements(List.of(1, 2), index.getContainingOrNearest(newPoint(0.5, 0.5)));
|
||||
assertListsContainSameElements(List.of(1, 2), index.getIntersecting(rectangle(0.5, 1.5)));
|
||||
assertListsContainSameElements(List.of(1, 2), index.getIntersecting(rectangle(1, 2)));
|
||||
assertListsContainSameElements(List.of(), index.getIntersecting(rectangle(2, 3)));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
Ładowanie…
Reference in New Issue