package uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json.geojson; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.MultiPolygon; import com.vividsolutions.jts.geom.Polygon; import java.util.List; /** * A DTO for "MultiPolygon Geometry" objects. * Structured to reflect the fields that should be serialized in GeoJSON server response. * Implements the specification available from http://geojson.org/geojson-spec.html#multipolygon * @param <TCrs> The type of Coordinate Reference System. * Copyright (c) 2014 University of Oxford */ public final class GeoJsonMultiPolygonGeometry<TCrs extends GeoJsonCrs> extends GeoJsonGeometry<TCrs, GeoJsonMultiPolygonCoordinateSet> { public GeoJsonMultiPolygonGeometry() { } public GeoJsonMultiPolygonGeometry(MultiPolygon multiPolygon, TCrs crs, List<Double> bbox) { super(GeoJsonGeometryType.MULTI_POLYGON, extractCoordinates(multiPolygon), crs, bbox); } private static GeoJsonMultiPolygonCoordinateSet extractCoordinates(MultiPolygon multiPolygon) { GeoJsonMultiPolygonCoordinateSet multiPolygonCoordinateSet = new GeoJsonMultiPolygonCoordinateSet(); for (int i = 0; i < multiPolygon.getNumGeometries(); i++) { Polygon polygon = (Polygon) multiPolygon.getGeometryN(i); GeoJsonPolygonCoordinateSet polygonCoordinateSet = new GeoJsonPolygonCoordinateSet(); GeoJsonRingCoordinateSet exteriorRingCoordinateSet = getExteriorRingCoordinateSet(polygon); polygonCoordinateSet.add(exteriorRingCoordinateSet); for (int j = 0; j < polygon.getNumInteriorRing(); j++) { GeoJsonRingCoordinateSet interiorRingCoordinateSet = getInteriorRingCoordinateSet(polygon, j); polygonCoordinateSet.add(interiorRingCoordinateSet); } multiPolygonCoordinateSet.add(polygonCoordinateSet); } return multiPolygonCoordinateSet; } private static GeoJsonRingCoordinateSet getExteriorRingCoordinateSet(Polygon polygon) { GeoJsonRingCoordinateSet ringCoordinateSet = new GeoJsonRingCoordinateSet(); LineString exteriorRing = polygon.getExteriorRing(); for (Coordinate coordinate : exteriorRing.getCoordinates()) { double x = coordinate.x; double y = coordinate.y; ringCoordinateSet.add(new GeoJsonCoordinate(x, y)); } return ringCoordinateSet; } private static GeoJsonRingCoordinateSet getInteriorRingCoordinateSet(Polygon polygon, Integer j) { GeoJsonRingCoordinateSet ringCoordinateSet = new GeoJsonRingCoordinateSet(); LineString interiorRing = polygon.getInteriorRingN(j); for (Coordinate coordinate : interiorRing.getCoordinates()) { double x = coordinate.x; double y = coordinate.y; ringCoordinateSet.add(new GeoJsonCoordinate(x, y)); } return ringCoordinateSet; } }