Search in sources :

Example 1 with JtsMultiPolygonToMultiPolygonConverter

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;
}
Also used : Path(java.nio.file.Path) MultiAtlas(org.openstreetmap.atlas.geography.atlas.multi.MultiAtlas) MultiPolygon(org.locationtech.jts.geom.MultiPolygon) RelationOrAreaToMultiPolygonConverter(org.openstreetmap.atlas.geography.atlas.items.complex.RelationOrAreaToMultiPolygonConverter) PackedAtlas(org.openstreetmap.atlas.geography.atlas.packed.PackedAtlas) JtsMultiPolygonToMultiPolygonConverter(org.openstreetmap.atlas.geography.converters.jts.JtsMultiPolygonToMultiPolygonConverter) File(org.openstreetmap.atlas.streaming.resource.File)

Example 2 with JtsMultiPolygonToMultiPolygonConverter

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;
    }
}
Also used : JtsLocationConverter(org.openstreetmap.atlas.geography.converters.jts.JtsLocationConverter) IsValidOp(org.locationtech.jts.operation.valid.IsValidOp) JtsMultiPolygonToMultiPolygonConverter(org.openstreetmap.atlas.geography.converters.jts.JtsMultiPolygonToMultiPolygonConverter) TopologyValidationError(org.locationtech.jts.operation.valid.TopologyValidationError)

Aggregations

JtsMultiPolygonToMultiPolygonConverter (org.openstreetmap.atlas.geography.converters.jts.JtsMultiPolygonToMultiPolygonConverter)2 Path (java.nio.file.Path)1 MultiPolygon (org.locationtech.jts.geom.MultiPolygon)1 IsValidOp (org.locationtech.jts.operation.valid.IsValidOp)1 TopologyValidationError (org.locationtech.jts.operation.valid.TopologyValidationError)1 RelationOrAreaToMultiPolygonConverter (org.openstreetmap.atlas.geography.atlas.items.complex.RelationOrAreaToMultiPolygonConverter)1 MultiAtlas (org.openstreetmap.atlas.geography.atlas.multi.MultiAtlas)1 PackedAtlas (org.openstreetmap.atlas.geography.atlas.packed.PackedAtlas)1 JtsLocationConverter (org.openstreetmap.atlas.geography.converters.jts.JtsLocationConverter)1 File (org.openstreetmap.atlas.streaming.resource.File)1