/** * @return whether this Multipolygon can be represented as a {@link Polygon} */ public boolean isSimplePolygon() { return this.outers().size() == 1; }
@Override public boolean fullyGeometricallyEncloses(final MultiPolygon multiPolygon) { return multiPolygon.outers().stream().allMatch(this::fullyGeometricallyEncloses); }
/** * @return Optional of {@link Polygon} representation if possible */ public Optional<Polygon> asSimplePolygon() { if (this.isSimplePolygon()) { return outers().stream().findFirst(); } logger.warn("Trying to read complex MultiPolygon as simple Polygon"); return Optional.empty(); }
@Override public Iterator<Polygon> iterator() { return new MultiIterable<>(outers(), inners()).iterator(); }
public void removeOuter(final Polygon outerToRemove) { final MultiMap<Polygon, Polygon> outersToInners = new MultiMap<>(); this.outline.outers().forEach(outer -> { final List<Polygon> innersForThisOuter = this.outline.innersOf(outer); outersToInners.put(outer, innersForThisOuter); }); outersToInners.remove(outerToRemove); setOutline(new MultiPolygon(outersToInners)); }
public GeoJsonObject asGeoJsonFeatureCollection() { final GeoJsonBuilder builder = new GeoJsonBuilder(); return builder.createFeatureCollection(Iterables.translate(outers(), outerPolygon -> builder.createOneOuterMultiPolygon( new MultiIterable<>(Collections.singleton(outerPolygon), this.outerToInners.get(outerPolygon))))); }
public static void saveMultipolygon(final Iterable<MultiPolygon> geometries, final WritableResource destination) { final Iterable<Polygon> outers = Iterables.translateMulti(geometries, multiPolygon -> multiPolygon.outers()); final Iterable<Polygon> inners = Iterables.translateMulti(geometries, multiPolygon -> multiPolygon.inners()); final Iterable<Polygon> multi = new MultiIterable<>(outers, inners); save(multi, destination); }
@Override public Surface surfaceOnSphere() { Surface result = Surface.MINIMUM; for (final Polygon outer : this.outers()) { result = result.add(outer.surfaceOnSphere()); } for (final Polygon inner : this.inners()) { result = result.subtract(inner.surfaceOnSphere()); } return result; }
public SnappedLocation snap(final Location origin, final MultiPolygon shape) { SnappedLocation best = null; for (final Polygon member : new MultiIterable<>(shape.outers(), shape.inners())) { final SnappedLocation candidate = snap(origin, member); if (best == null || candidate.getDistance().isLessThan(best.getDistance())) { best = candidate; } } return best; }
@Override protected int onRun(final CommandMap command) { final Atlas atlas = (Atlas) command.get(ATLAS_FOLDER); final File output = (File) command.get(OUTPUT); final Iterable<Polygon> shapes = Iterables.translateMulti( new ComplexBuildingFinder().find(atlas), building -> building.getOutline().outers()); GeoJsonSaver.save(shapes, output); return 0; }
@Test public void testPolygonAnd() { final MultiPolygon clipped = SUBJECT.clip(CLIPPING, ClipType.AND).getClipMultiPolygon(); Assert.assertEquals(2, clipped.outers().size()); Assert.assertEquals(0, clipped.inners().size()); }
@Test public void testPolygonNot() { final MultiPolygon clipped = SUBJECT.clip(CLIPPING, ClipType.NOT).getClipMultiPolygon(); Assert.assertEquals(3, clipped.outers().size()); Assert.assertEquals(0, clipped.inners().size()); }
@Test public void testMultiPolygonNot() { final MultiPolygon clipped = SUBJECT_MULTIPOLYGON.clip(CLIPPING, ClipType.NOT) .getClipMultiPolygon(); Assert.assertEquals(2, clipped.outers().size()); Assert.assertEquals(0, clipped.inners().size()); }
@Test public void testMultiPolygonOr() { final MultiPolygon clipped = SUBJECT_MULTIPOLYGON.clip(CLIPPING, ClipType.OR) .getClipMultiPolygon(); Assert.assertEquals(1, clipped.outers().size()); Assert.assertEquals(0, clipped.inners().size()); }
@Test public void testMultiPolygonXor() { final MultiPolygon clipped = SUBJECT_MULTIPOLYGON.clip(CLIPPING, ClipType.XOR) .getClipMultiPolygon(); Assert.assertEquals(4, clipped.outers().size()); Assert.assertEquals(0, clipped.inners().size()); }
@Test public void testMultiPolygonAnd() { final MultiPolygon clipped = SUBJECT_MULTIPOLYGON.clip(CLIPPING, ClipType.AND) .getClipMultiPolygon(); Assert.assertEquals(1, clipped.outers().size()); Assert.assertEquals(2, clipped.inners().size()); }
@Test public void testPolygonOr() { final MultiPolygon clipped = SUBJECT.clip(CLIPPING, ClipType.OR).getClipMultiPolygon(); Assert.assertEquals(1, clipped.outers().size()); Assert.assertEquals(2, clipped.inners().size()); }
@Test public void testPolygonXor() { final MultiPolygon clipped = SUBJECT.clip(CLIPPING, ClipType.XOR).getClipMultiPolygon(); Assert.assertEquals(5, clipped.outers().size()); Assert.assertEquals(0, clipped.inners().size()); }
@Test public void testComplexIslands() { int islands = 0; for (final ComplexIsland island : new ComplexIslandFinder().find(this.atlas, Finder::ignore)) { Assert.assertTrue(island.getSource() instanceof Relation); islands += island.getGeometry().outers().size(); } Assert.assertEquals("Number of islands should be equal to number of inner polygons", 2, islands); }