package it.geosolutions.android.map.wfs.geojson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import java.lang.reflect.Type; /** * Serialize Geometry object to GeoJson * @author Lorenzo Natali (lorenzo.natali at geo-solutions.it) * */ public class GeometryJsonSerializer implements JsonSerializer<Geometry> { public JsonElement serialize(Geometry geometry, Type type, JsonSerializationContext jsonSerializationContext) { JsonObject json = new JsonObject(); json.addProperty("type", geometry.getGeometryType()); String geometryType = geometry.getGeometryType(); if (geometryType.equals("Point")) { JsonArray coordinates = pointCoordinates((Point) geometry); json.add("coordinates", coordinates); } else if (geometryType.equals("MultiPoint")) { JsonArray coordinates = new JsonArray(); for (int i = 0; i < geometry.getNumGeometries(); i++) { Point child = (Point) geometry.getGeometryN(i); coordinates.add(pointCoordinates(child)); } json.add("coordinates", coordinates); } else if (geometryType.equals("LineString")) { JsonArray coordinates = lineStringCoordinates((LineString) geometry); json.add("coordinates", coordinates); } else if (geometryType.equals("MultiLineString")) { JsonArray coordinates = new JsonArray(); for (int i = 0; i < geometry.getNumGeometries(); i++) { LineString child = (LineString) geometry.getGeometryN(i); coordinates.add(lineStringCoordinates(child)); } json.add("coordinates", coordinates); } else if (geometryType.equals("Polygon")) { JsonArray coordinates = polygonCoordinates((Polygon) geometry); json.add("coordinates", coordinates); } else if (geometryType.equals("MultiPolygon")) { JsonArray coordinates = new JsonArray(); for (int i = 0; i < geometry.getNumGeometries(); i++) { Polygon child = (Polygon) geometry.getGeometryN(i); coordinates.add(polygonCoordinates(child)); } json.add("coordinates", coordinates); } else if (geometryType.equals("GeometryCollection")) { JsonArray geometries = new JsonArray(); for (int i = 0; i < geometry.getNumGeometries(); i++) { Geometry child = geometry.getGeometryN(i); geometries.add(jsonSerializationContext.serialize(child)); } json.add("geometries", geometries); } else { throw new IllegalArgumentException("Unknown geometry type " + geometry.getGeometryType()); } return json; } JsonArray pointCoordinates(Point geometry) { return toJson(geometry.getCoordinate()); } JsonArray lineStringCoordinates(LineString geometry) { return toJson(geometry.getCoordinates()); } JsonArray polygonCoordinates(Polygon polygon) { JsonArray result = new JsonArray(); result.add(toJson(polygon.getExteriorRing().getCoordinates())); for (int i = 0; i < polygon.getNumInteriorRing(); i++) { result.add(toJson(polygon.getInteriorRingN(i).getCoordinates())); } return result; } JsonArray toJson(Coordinate[] coordinates) { JsonArray result = new JsonArray(); for (Coordinate coordinate : coordinates) { result.add(toJson(coordinate)); } return result; } JsonArray toJson(Coordinate coordinate) { JsonArray result = new JsonArray(); result.add(new JsonPrimitive(coordinate.x)); result.add(new JsonPrimitive(coordinate.y)); if (!Double.isNaN(coordinate.z)) { result.add(new JsonPrimitive(coordinate.z)); } return result; } }