@Override public JsonArray convert(final MultiPolygon object) { final JsonArray result = new JsonArray(); object.outers().forEach(outerPolygon -> { final JsonArray outerLocations = new JsonArray(); outerPolygon.forEach( location -> outerLocations.add(this.coordinateConverter.convert(location))); result.add(outerLocations); object.innersOf(outerPolygon).forEach(innerPolygon -> { final JsonArray innerLocations = new JsonArray(); innerPolygon.forEach( location -> innerLocations.add(this.coordinateConverter.convert(location))); result.add(innerLocations); }); }); return result; }
@Override public Set<com.vividsolutions.jts.geom.Polygon> convert(final MultiPolygon object) { final Set<com.vividsolutions.jts.geom.Polygon> result = new HashSet<>(); for (final Polygon outer : object.outers()) { final List<Polygon> inners = object.innersOf(outer); final LinearRing[] holes = new LinearRing[inners.size()]; int index = 0; for (final Polygon inner : inners) { holes[index++] = LINEAR_RING_CONVERTER.convert(inner); } result.add(new com.vividsolutions.jts.geom.Polygon(LINEAR_RING_CONVERTER.convert(outer), holes, FACTORY)); } return result; } }
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)); }
@Override public boolean overlaps(final MultiPolygon multiPolygon) { for (final Polygon outer : multiPolygon.outers()) { final List<Polygon> inners = multiPolygon.innersOf(outer); if (this.overlaps(outer)) { boolean result = true; for (final Polygon inner : inners) { if (inner.fullyGeometricallyEncloses(this)) { // The feature is fully inside an inner polygon, hence not overlapped result = false; break; } } if (result) { return true; } } } return false; }
for (final Polygon inner : innersOf(outer))
public String toReadableString() { final String separator1 = "\n\t"; final String separator2 = "\n\t\t"; final StringBuilder builder = new StringBuilder(); final StringList outers = new StringList(); for (final Polygon outer : this.outers()) { final StringList inners = new StringList(); for (final Polygon inner : innersOf(outer)) { inners.add("Inner: " + inner.toCompactString()); } outers.add("Outer: " + outer.toCompactString() + separator2 + inners.join(separator2)); } builder.append(outers.join(separator1)); return builder.toString(); }
for (final Polygon inner : multiPolygon.innersOf(outer))
for (final Polygon inner : this.innersOf(outer))
@Override public String backwardConvert(final MultiPolygon object) { final StringList outers = new StringList(); for (final Polygon outer : object.outers()) { final StringList inners = new StringList(); for (final Polygon inner : object.innersOf(outer)) { inners.add(inner.toCompactString()); } outers.add(outer.toCompactString() + OUTER_INNERS_SEPARATOR + inners.join(INNER_SEPARATOR)); } return outers.join(OUTER_SEPARATOR); }
/** * This function only puts the part of the multipolygon with outers intersecting with the * shard * * @param item * to add * @param collection * to add to * @param shard * shard associated with the collection * @return whether it was added successfully */ @Override protected boolean addFunction(final MultiPolygon item, final ArrayList<MultiPolygon> collection, final Shard shard) { final Rectangle shardBounds = shard.bounds(); final MultiMap<Polygon, Polygon> newMultiPolygon = new MultiMap<>(); item.outers().forEach(outer -> { if (outer.overlaps(shardBounds)) { newMultiPolygon.put(outer, item.innersOf(outer)); } }); return collection.add(new MultiPolygon(newMultiPolygon)); }