diff --git a/src/eu/simstadt/regionchooser/RegionChooserFX.java b/src/eu/simstadt/regionchooser/RegionChooserFX.java index b2a11a819ccc881a79353b8c320a7949c6d404b5..2972c40bae0e466aecc2f0b52256e142a3ab7141 100644 --- a/src/eu/simstadt/regionchooser/RegionChooserFX.java +++ b/src/eu/simstadt/regionchooser/RegionChooserFX.java @@ -6,21 +6,15 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Enumeration; import java.util.logging.Logger; import java.util.prefs.Preferences; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; import eu.simstadt.nf4j.ExportJobFromJavaFXRegionChooser; @@ -121,7 +115,7 @@ public void extractZIPtoGML(String zipFilename) throws IOException { public void downloadRegionFromCityGML(String wktPolygon, String project, String citygml) throws IOException, ParseException { - StringBuffer sb = selectRegionDirectlyFromCityGML(citygmlPath(project, citygml), wktPolygon); + StringBuffer sb = RegionExtractor.selectRegionDirectlyFromCityGML(citygmlPath(project, citygml), wktPolygon); File buildingIdsFile = selectSaveFileWithDialog(project, citygml, "selected_region"); if (buildingIdsFile != null) { @@ -131,49 +125,6 @@ public void downloadRegionFromCityGML(String wktPolygon, String project, String } } - public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, String wktPolygon) throws IOException, - ParseException { - //TODO: Write directly to file - // Instant start = Instant.now(); - Geometry poly = wktReader.read(wktPolygon); - final GeometryFactory gf = new GeometryFactory(); - String s = new String(Files.readAllBytes(citygmlPath), Charset.defaultCharset()); - - Pattern cityObjectPattern = Pattern - .compile("(?s)<(core:)?cityObjectMember>.*?<\\/(core:)?cityObjectMember>\\s*"); - Pattern gsk3CoordinatesPattern = Pattern - .compile("(?<![\\d\\.])(3\\d\\d\\d\\d\\d\\d[\\.\\d]*) (5\\d\\d\\d\\d\\d\\d[\\.\\d]*)"); - Matcher cityObjectMatcher = cityObjectPattern.matcher(s); - StringBuffer sb = new StringBuffer(); - int i = 0; - while (cityObjectMatcher.find()) { - cityObjectMatcher.appendReplacement(sb, ""); - String cityObject = cityObjectMatcher.group(); - Matcher gsk3CoordinatesMatcher = gsk3CoordinatesPattern.matcher(cityObject); - int coordinatesCount = 0; - double xTotal = 0; - double yTotal = 0; - while (gsk3CoordinatesMatcher.find()) { - coordinatesCount++; - xTotal += Double.valueOf(gsk3CoordinatesMatcher.group(1)); - yTotal += Double.valueOf(gsk3CoordinatesMatcher.group(2)); - } - double x = xTotal / coordinatesCount; - double y = yTotal / coordinatesCount; - Coordinate coord = new Coordinate(x, y); - Point point = gf.createPoint(coord); - if (point.within(poly)) { - i++; - sb.append(cityObject); - } - } - System.out.println("Buildings found in selected region " + i); - cityObjectMatcher.appendTail(sb); - // System.out.println(Duration.between(start, Instant.now())); - return sb; - - } - private File selectSaveFileWithDialog(String project, String citygml, String suffix) { Stage mainStage = (Stage) Browser.this.getScene().getWindow(); FileChooser fileChooser = new FileChooser(); diff --git a/src/eu/simstadt/regionchooser/RegionExtractor.java b/src/eu/simstadt/regionchooser/RegionExtractor.java new file mode 100644 index 0000000000000000000000000000000000000000..103c618e32f496139ba50b742907eb598447f2cc --- /dev/null +++ b/src/eu/simstadt/regionchooser/RegionExtractor.java @@ -0,0 +1,63 @@ +package eu.simstadt.regionchooser; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; + + +public class RegionExtractor +{ + static private WKTReader wktReader = new WKTReader(); + + static public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, String wktPolygon) + throws IOException, ParseException { + //TODO: Write directly to file + // Instant start = Instant.now(); + Geometry poly = wktReader.read(wktPolygon); + final GeometryFactory gf = new GeometryFactory(); + String s = new String(Files.readAllBytes(citygmlPath), Charset.defaultCharset()); + + Pattern cityObjectPattern = Pattern + .compile("(?s)<(core:)?cityObjectMember>.*?<\\/(core:)?cityObjectMember>\\s*"); + Pattern gsk3CoordinatesPattern = Pattern + .compile("(?<![\\d\\.])(3\\d\\d\\d\\d\\d\\d[\\.\\d]*) (5\\d\\d\\d\\d\\d\\d[\\.\\d]*)"); + Matcher cityObjectMatcher = cityObjectPattern.matcher(s); + StringBuffer sb = new StringBuffer(); + int i = 0; + while (cityObjectMatcher.find()) { + cityObjectMatcher.appendReplacement(sb, ""); + String cityObject = cityObjectMatcher.group(); + Matcher gsk3CoordinatesMatcher = gsk3CoordinatesPattern.matcher(cityObject); + int coordinatesCount = 0; + double xTotal = 0; + double yTotal = 0; + while (gsk3CoordinatesMatcher.find()) { + coordinatesCount++; + xTotal += Double.valueOf(gsk3CoordinatesMatcher.group(1)); + yTotal += Double.valueOf(gsk3CoordinatesMatcher.group(2)); + } + double x = xTotal / coordinatesCount; + double y = yTotal / coordinatesCount; + Coordinate coord = new Coordinate(x, y); + Point point = gf.createPoint(coord); + if (point.within(poly)) { + i++; + sb.append(cityObject); + } + } + System.out.println("Buildings found in selected region " + i); + cityObjectMatcher.appendTail(sb); + // System.out.println(Duration.between(start, Instant.now())); + return sb; + } + +}