diff --git a/src/main/java/eu/simstadt/regionchooser/RegionExtractor.java b/src/main/java/eu/simstadt/regionchooser/RegionExtractor.java index 192513cdb3071ae79b6ae999fad762fcac9009ff..90991971839088ae4a28ce21a9d29d4c36941c8f 100644 --- a/src/main/java/eu/simstadt/regionchooser/RegionExtractor.java +++ b/src/main/java/eu/simstadt/regionchooser/RegionExtractor.java @@ -11,6 +11,7 @@ import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.Polygon; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; import com.ximpleware.NavException; @@ -54,7 +55,7 @@ static int selectRegionDirectlyFromCityGML(String wktPolygon, String srsName, Wr int cityObjectsCount = 0; int foundBuildingsCount = 0; int otherObjectsCount = 0; - Geometry polygon = WKT_READER.read(wktPolygon); + Geometry selectionPolygon = WKT_READER.read(wktPolygon); CityGmlIterator citygml = null; for (int i = 0; i < citygmlPaths.length; i++) { @@ -64,13 +65,13 @@ static int selectRegionDirectlyFromCityGML(String wktPolygon, String srsName, Wr citygml = new CityGmlIterator(citygmlPath); for (CityObjectMember cityObjectNode : citygml) { if (cityObjectsCount == 0) { - sb.append(replaceEnvelopeInHeader(citygml.getHeader(), polygon.getEnvelopeInternal(), srsName)); + sb.append(replaceEnvelopeInHeader(citygml.getHeader(), selectionPolygon.getEnvelopeInternal(), srsName)); } cityObjectsCount += 1; if (cityObjectNode.hasCoordinates()) { boolean isBuilding = cityObjectNode.isBuilding(); - boolean shouldBeIncluded = isBuilding ? isBuildingCenterInPolygon(cityObjectNode, polygon) - : isBoundingBoxTouching(cityObjectNode, polygon); + boolean shouldBeIncluded = isBuilding ? isBuildingCenterInPolygon(cityObjectNode, selectionPolygon) + : isBoundingBoxTouching(cityObjectNode, selectionPolygon); if (shouldBeIncluded) { if (isBuilding) { foundBuildingsCount++; @@ -108,10 +109,15 @@ static int selectRegionDirectlyFromCityGML(String wktPolygon, String srsName, Wr * which might be desirable for roads or landuse. */ private static boolean isBoundingBoxTouching(CityObjectMember cityObjectNode, Geometry polygon) { - return point(cityObjectNode.xMax, cityObjectNode.yMax).within(polygon) || - point(cityObjectNode.xMax, cityObjectNode.yMin).within(polygon) || - point(cityObjectNode.xMin, cityObjectNode.yMin).within(polygon) || - point(cityObjectNode.xMin, cityObjectNode.yMax).within(polygon); + Coordinate[] boundingBoxCoordinates = { + new Coordinate(cityObjectNode.xMax, cityObjectNode.yMax), + new Coordinate(cityObjectNode.xMin, cityObjectNode.yMax), + new Coordinate(cityObjectNode.xMin, cityObjectNode.yMin), + new Coordinate(cityObjectNode.xMax, cityObjectNode.yMin), + new Coordinate(cityObjectNode.xMax, cityObjectNode.yMax), + }; + Polygon boundingBox = GEOMETRY_FACTORY.createPolygon(boundingBoxCoordinates); + return boundingBox.intersects(polygon); }