package com.revolsys.geometry.index.quadtree; import com.revolsys.collection.map.WeakKeyValueMap; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.vertex.Vertex; import com.revolsys.geometry.util.BoundingBoxUtil; import com.revolsys.util.Property; import com.revolsys.util.number.Doubles; public class GeometryVertexQuadTree extends IdObjectQuadTree<Vertex> { public static final String GEOMETRY_VERTEX_INDEX = "_GeometryVertexQuadTree"; private static final long serialVersionUID = 1L; private static final WeakKeyValueMap<Geometry, GeometryVertexQuadTree> CACHE = new WeakKeyValueMap<>(); public static GeometryVertexQuadTree get(final Geometry geometry) { if (Property.hasValue(geometry)) { GeometryVertexQuadTree index = CACHE.get(geometry); if (index == null) { try { index = new GeometryVertexQuadTree(geometry); CACHE.put(geometry, index); } catch (final Error e) { System.out.println(geometry); throw e; } } return index; } else { return null; } } private final Geometry geometry; public GeometryVertexQuadTree(final Geometry geometry) { super(geometry.getGeometryFactory()); this.geometry = geometry; if (geometry != null) { setGeometryFactory(geometry.getGeometryFactory()); for (final Vertex vertex : geometry.vertices()) { final double x = vertex.getX(); final double y = vertex.getY(); insertItem(x, y, vertex); } } } @Override protected Object getId(final Vertex vertex) { return vertex.getVertexId(); } @Override protected Vertex getItem(final Object id) { final int[] vertexId = (int[])id; return this.geometry.getVertex(vertexId); } @Override protected boolean intersectsBounds(final Object id, final double x, final double y) { final Vertex vertex = getItem(id); if (vertex == null) { return false; } else { if (Doubles.equal(x, vertex.getX())) { if (Doubles.equal(y, vertex.getY())) { return true; } } return false; } } @Override protected boolean intersectsBounds(final Object id, final double minX, final double minY, final double maxX, final double maxY) { final Vertex vertex = getItem(id); if (vertex == null) { return false; } else { final double x = vertex.getX(); final double y = vertex.getY(); return BoundingBoxUtil.intersects(minX, minY, maxX, maxY, x, y); } } }