package com.revolsys.geometry.algorithm; import com.revolsys.collection.map.WeakKeyValueMap; import com.revolsys.geometry.algorithm.locate.IndexedPointInAreaLocator; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.geometry.model.Location; import com.revolsys.util.Property; public class GeometryFactoryIndexedPointInAreaLocator extends IndexedPointInAreaLocator { private static final WeakKeyValueMap<Geometry, GeometryFactoryIndexedPointInAreaLocator> CACHE = new WeakKeyValueMap<>(); public static GeometryFactoryIndexedPointInAreaLocator get(final Geometry geometry) { if (Property.hasValue(geometry)) { GeometryFactoryIndexedPointInAreaLocator locator = CACHE.get(geometry); if (locator == null) { locator = new GeometryFactoryIndexedPointInAreaLocator(geometry); CACHE.put(geometry, locator); } return locator; } else { return null; } } public GeometryFactoryIndexedPointInAreaLocator(final Geometry geometry) { super(geometry); } @Override public Location locate(final double x, final double y) { final GeometryFactory geometryFactory = getGeometryFactory(); final double resolutionY = geometryFactory.getResolutionY(); final double minY = y - resolutionY; final double maxY = y + resolutionY; final PointInArea visitor = new PointInArea(geometryFactory, x, y); getIndex().query(minY, maxY, visitor); return visitor.getLocation(); } }