add polygon index intersection utility

polygon-index-intersection
Mike Barry 2024-04-10 06:27:00 -04:00
rodzic ed373ff3d3
commit a3d0f9e961
2 zmienionych plików z 24 dodań i 0 usunięć

Wyświetl plik

@ -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.

Wyświetl plik

@ -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