package iamrescue.belief.spatial; import iamrescue.util.SpatialUtils; import java.util.List; import java.util.Map; import rescuecore2.standard.entities.StandardEntity; import rescuecore2.standard.entities.StandardWorldModel; import rescuecore2.worldmodel.EntityID; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.index.ItemVisitor; public class SpatialObjectVisitor implements ItemVisitor { private final Geometry queryGeometry; private final boolean usingRepresentativePoints; private final double distance; private final Class<? extends StandardEntity> queryClass; private List<StandardEntity> list; private Map<EntityID, Geometry> geometries; private StandardWorldModel worldModel; public SpatialObjectVisitor(SpatialQuery query, List<StandardEntity> listToFill, Map<EntityID, Geometry> geometries, StandardWorldModel worldModel) { this.queryGeometry = query.getGeometry(); this.usingRepresentativePoints = query .isUsingOnlyRepresentativePoints(); this.distance = query.getDistance(); this.queryClass = query.getQueryClass(); this.geometries = geometries; this.worldModel = worldModel; this.list = listToFill; } public void visitItem(Object object) { StandardEntity spObj = (StandardEntity) object; if (queryClass.isAssignableFrom(spObj.getClass())) { Geometry objectGeometry; if (usingRepresentativePoints) { objectGeometry = SpatialUtils.convertApexes(spObj .getLocation(worldModel)); } else { objectGeometry = geometries.get(spObj.getID()); if (objectGeometry == null) { objectGeometry = SpatialUtils.createGeometry(spObj, worldModel); geometries.put(spObj.getID(), objectGeometry); } } if (queryGeometry.intersects(objectGeometry) || queryGeometry.distance(objectGeometry) <= distance) { list.add(spObj); } } } }