use of org.openstreetmap.atlas.geography.converters.jts.JtsMultiPolygonToMultiPolygonConverter in project atlas by osmlab.
the class RelationToMultiPolygonCommand method finish.
@Override
protected int finish() {
if (this.relationAtlases.isEmpty()) {
this.outputDelegate.printlnErrorMessage("no atlases found with relation");
return 1;
}
final MultiAtlas multiAtlas = new MultiAtlas(this.relationAtlases);
final MultiPolygon relationMultiPolygon;
final org.openstreetmap.atlas.geography.MultiPolygon atlasMultiPolygon;
try {
final RelationOrAreaToMultiPolygonConverter converter = new RelationOrAreaToMultiPolygonConverter();
atlasMultiPolygon = converter.convert(multiAtlas.relation(this.relationId));
if (!atlasMultiPolygon.isOGCValid()) {
this.outputDelegate.printlnWarnMessage("warning: relation multipolygon is not OGC valid!");
if (!atlasMultiPolygon.isOSMValid()) {
this.outputDelegate.printlnErrorMessage("warning: relation multipolygon is not OSM valid, cannot construct WKT!");
return 1;
}
}
final JtsMultiPolygonToMultiPolygonConverter jtsconverter = new JtsMultiPolygonToMultiPolygonConverter();
relationMultiPolygon = jtsconverter.backwardConvert(atlasMultiPolygon);
} catch (final Exception exception) {
this.outputDelegate.printlnErrorMessage("error building valid multipolygon from relation: ");
this.outputDelegate.printlnErrorMessage(exception.getMessage());
return 1;
}
if (relationMultiPolygon.toText().length() < MAX_LENGTH) {
this.outputDelegate.printlnCommandMessage("Relation WKT:");
this.outputDelegate.printlnCommandMessage(relationMultiPolygon.toText());
} else {
this.outputDelegate.printlnWarnMessage("Relation WKT is too large to print!");
}
final Path concatenatedWktPath = Paths.get(getOutputPath().toAbsolutePath().toString(), String.format(OUTPUT_WKT_FORMAT, this.relationId));
final File wktOutputFile = new File(concatenatedWktPath.toAbsolutePath().toString(), this.getFileSystem());
wktOutputFile.writeAndClose(relationMultiPolygon.toText());
if (!this.optionAndArgumentDelegate.hasOption(OUTPUT_WKT_OPTION_LONG)) {
final Path concatenatedPath = Paths.get(getOutputPath().toAbsolutePath().toString(), String.format(OUTPUT_ATLAS_FORMAT, this.relationId));
final File outputFile = new File(concatenatedPath.toAbsolutePath().toString(), this.getFileSystem());
final PackedAtlas outputAtlas = multiAtlas.cloneToPackedAtlas();
outputAtlas.setSaveSerializationFormat(AtlasSerializationFormat.PROTOBUF);
outputAtlas.save(outputFile);
if (this.optionAndArgumentDelegate.hasVerboseOption()) {
this.outputDelegate.printlnCommandMessage("saved atlas to " + concatenatedPath.toString());
}
}
return 0;
}
use of org.openstreetmap.atlas.geography.converters.jts.JtsMultiPolygonToMultiPolygonConverter in project atlas by osmlab.
the class MultiPolygon method isOSMValid.
/**
* @return True if this {@link MultiPolygon} is valid according to the OSM specification. OSM
* allows some inners of the MultiPolygon to touch on more than a single point, to allow
* for one inner to be split in multiple parts tagged differently. Example: a forest
* with an inner, that is one side a meadow, and on the other side some marshland.
*/
public boolean isOSMValid() {
final org.locationtech.jts.geom.MultiPolygon jtsMultiPolygon = new JtsMultiPolygonToMultiPolygonConverter().backwardConvert(this);
final TopologyValidationError topologyValidationError = new IsValidOp(jtsMultiPolygon).getValidationError();
if (topologyValidationError != null) {
// TopologyValidationError to know what to do next.
if (TopologyValidationError.SELF_INTERSECTION == topologyValidationError.getErrorType()) {
final Location errorLocation = new JtsLocationConverter().backwardConvert(topologyValidationError.getCoordinate());
final Rectangle errorExpandedBoundingBox = errorLocation.boxAround(Distance.ONE_METER);
return isOSMValidSelfIntersection(errorExpandedBoundingBox);
}
return false;
} else {
return true;
}
}
Aggregations