@Override public Iterator<Polygon> iterator() { return new MultiIterable<>(outers(), inners()).iterator(); }
public Iterable<LocationIterableProperties> asLocationIterableProperties() { final Iterable<LocationIterableProperties> outers = Iterables.translate(outers(), polygon -> { final Map<String, String> tags = new HashMap<>(); tags.put("MultiPolygon", "outer"); return new LocationIterableProperties(polygon, tags); }); final Iterable<LocationIterableProperties> inners = Iterables.translate(inners(), polygon -> { final Map<String, String> tags = new HashMap<>(); tags.put("MultiPolygon", "inner"); return new LocationIterableProperties(polygon, tags); }); return new MultiIterable<>(outers, inners); }
public boolean intersects(final PolyLine polyLine) { for (final Polygon outer : this.outers()) { if (outer.intersects(polyLine)) { return true; } } for (final Polygon inner : this.inners()) { if (inner.intersects(polyLine)) { return true; } } return false; }
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 surface() { Surface result = Surface.MINIMUM; for (final Polygon outer : this.outers()) { result = result.add(outer.surface()); } for (final Polygon inner : this.inners()) { result = result.subtract(inner.surface()); } return result; }
@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; }
private void populateGeometry() { final AtlasEntity source = getSource(); if (source instanceof Relation) { final Relation relation = (Relation) source; final String type = relation.tag(RelationTypeTag.KEY); if (RelationTypeTag.MULTIPOLYGON_TYPE.equals(type)) { final MultiPolygon multiPolygon = RELATION_OR_AREA_TO_MULTI_POLYGON_CONVERTER .convert(relation); // All the inland islands are inner polygons within the outer water boundaries final MultiMap<Polygon, Polygon> outerToInners = new MultiMap<>(); for (final Polygon inner : multiPolygon.inners()) { outerToInners.put(inner, new ArrayList<Polygon>()); } this.multiPolygon = new MultiPolygon(outerToInners); return; } } throw new CoreException("Geometry is not set for {}", source); } }
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; }
@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 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 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 testReadingMultiPolygon() { final GeoJsonReader reader = new GeoJsonReader(new InputStreamResource( GeoJsonReaderTest.class.getResourceAsStream("geojson-multipolygon.json"))); Assert.assertTrue(reader.hasNext()); final PropertiesLocated located = reader.next(); final MultiPolygon multiPolygon = (MultiPolygon) located.getItem(); Assert.assertEquals(2, multiPolygon.outers().size()); Assert.assertEquals(1, multiPolygon.inners().size()); // test non-duplicated first point for (final Polygon polygon : multiPolygon) { Assert.assertTrue(polygon.finalHeading().isPresent()); } logger.info(located.toString()); }