/* * Copyright (C) 2010-2012 Stichting Akvo (Akvo Foundation) * * This file is part of Akvo FLOW. * * Akvo FLOW is free software: you can redistribute it and modify it under the terms of * the GNU Affero General Public License (AGPL) as published by the Free Software Foundation, * either version 3 of the License or any later version. * * Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License included below for more details. * * The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>. */ package org.waterforpeople.mapping.app.web; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import org.json.JSONObject; import org.waterforpeople.mapping.app.util.DtoMarshaller; import org.waterforpeople.mapping.app.web.dto.ExternalGISRequest; import org.waterforpeople.mapping.app.web.dto.OGRFeatureDto; import org.waterforpeople.mapping.app.web.dto.OGRFeatureRestResponse; import com.gallatinsystems.framework.rest.AbstractRestApiServlet; import com.gallatinsystems.framework.rest.RestRequest; import com.gallatinsystems.framework.rest.RestResponse; import com.gallatinsystems.gis.map.dao.OGRFeatureDao; import com.gallatinsystems.gis.map.domain.Geometry; import com.gallatinsystems.gis.map.domain.Geometry.GeometryType; import com.gallatinsystems.gis.map.domain.OGRFeature; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.MultiPolygon; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; public class ExternalGISDataServlet extends AbstractRestApiServlet { private static final Logger log = Logger .getLogger(ExternalGISDataServlet.class.getName()); /** * */ private static final long serialVersionUID = -521412331243490340L; @Override protected RestRequest convertRequest() throws Exception { HttpServletRequest req = getRequest(); RestRequest restRequest = new ExternalGISRequest(); restRequest.populateFromHttpRequest(req); return restRequest; } @Override protected RestResponse handleRequest(RestRequest req) throws Exception { ExternalGISRequest importReq = (ExternalGISRequest) convertRequest(); RestResponse resp = new RestResponse(); if (req.getAction().equals(ExternalGISRequest.IMPORT_ACTION)) { OGRFeatureDao ogrFeatureDao = new OGRFeatureDao(); OGRFeature ogrFeature = new OGRFeature(); ogrFeature.setCountryCode(importReq.getCountryCode()); ogrFeature.setName(importReq.getName()); ogrFeature.setProjectCoordinateSystemIdentifier(importReq .getGeoCoordinateSystemIdentifier()); ogrFeature.setDatumIdentifier(importReq.getDatumIdentifier()); ogrFeature.setReciprocalOfFlattening(importReq .getReciprocalOfFlattening()); ogrFeature.setSpheroid(importReq.getSpheroid()); ogrFeature.setUnCode(importReq.getUnCode()); ogrFeature.setPop2005(importReq.getPop2005()); ogrFeature.setCentroidLat(importReq.getCentroidLat()); ogrFeature.setCentroidLon(importReq.getCentroidLon()); // Double[] boundingBox = new Double[] { importReq.getX1(), // importReq.getY1(), importReq.getX2(), importReq.getY2() }; // ogrFeature.setBoundingBox(boundingBox); ogrFeature.setFeatureType(importReq.getOgrFeatureType()); ogrFeature.setSub1(importReq.getSub1()); ogrFeature.setSub2(importReq.getSub2()); ogrFeature.setSub3(importReq.getSub3()); ogrFeature.setSub4(importReq.getSub4()); ogrFeature.setSub5(importReq.getSub5()); ogrFeature.setSub6(importReq.getSub6()); ogrFeature.setTotalPopulation(importReq.getTotalPopulation()); ogrFeature.setDensity(importReq.getDensity()); ogrFeature.setFemalePopulation(importReq.getFemalePopulation()); ogrFeature.setMalePopulation(importReq.getMalePopulation()); ogrFeature.setNumberHouseholds(importReq.getNumberHouseholds()); if (importReq.getGeometryString() != null) { try { Geometry geometry = parseGeometryString(importReq .getGeometryString()); ogrFeature.setGeometry(geometry); if (geometry.getCentroidLat() != null && geometry.getCentroidLon() != null) { ogrFeature.setCentroidLat(geometry.getCentroidLat()); ogrFeature.setCentroidLon(geometry.getCentroidLon()); } Double x1; Double y1; Double x2; Double y2; // int length = geometry.getBoundingBox().length; x1 = geometry.getBoundingBox()[1].x; y1 = geometry.getBoundingBox()[1].y; x2 = geometry.getBoundingBox()[3].x; y2 = geometry.getBoundingBox()[3].y; Double[] boundingBox = new Double[] { x1, y1, x2, y2 }; ogrFeature.setBoundingBox(boundingBox); } catch (ParseException pe) { log.log(Level.SEVERE, pe.getMessage()); } } ogrFeatureDao.save(ogrFeature); resp = convertToResponse(null, null, null); } else if (req.getAction().equals( ExternalGISRequest.LIST_MATCHING_OGRFEATURE_ACTION)) { OGRFeatureDao ogrFeatDao = new OGRFeatureDao(); String subLevelValue = null; Integer level = null; if (importReq.getSub1() != null) { subLevelValue = importReq.getSub1(); level = 1; } else if (importReq.getSub2() != null) { subLevelValue = importReq.getSub2(); level = 2; } else if (importReq.getSub3() != null) { subLevelValue = importReq.getSub3(); level = 3; } else if (importReq.getSub4() != null) { subLevelValue = importReq.getSub4(); level = 4; } else if (importReq.getSub5() != null) { subLevelValue = importReq.getSub5(); level = 5; } else if (importReq.getSub6() != null) { subLevelValue = importReq.getSub6(); level = 6; } List<OGRFeature> ogrFeatureList = ogrFeatDao .listBySubLevelCountryName(importReq.getCountryCode(), level, subLevelValue, null, null); resp = convertToResponse(ogrFeatureList, OGRFeatureDao .getCursor(ogrFeatureList), importReq.getCursor()); } return resp; } private RestResponse convertToResponse(List<OGRFeature> ogrList, String cursor, String oldCursor) { OGRFeatureRestResponse resp = new OGRFeatureRestResponse(); if (ogrList != null) { List<OGRFeatureDto> dtoList = new ArrayList<OGRFeatureDto>(); for (OGRFeature item : ogrList) { dtoList.add(marshallDomainToDto(item)); } resp.setOgrFeatures(dtoList); } return resp; } private OGRFeatureDto marshallDomainToDto(OGRFeature item) { OGRFeatureDto dto = new OGRFeatureDto(); DtoMarshaller.copyToDto(item, dto); return dto; } private Geometry parseGeometryString(String geometryString) throws ParseException { GeometryFactory geometryFactory = new GeometryFactory(); WKTReader reader = new WKTReader(geometryFactory); Geometry geo = new Geometry(); geo.setWktText(geometryString); Point centroid = null; if (geometryString.contains("POLYGON")) { if (geometryString.startsWith("POLYGON")) { geo.setType(GeometryType.POLYGON); Polygon mp = (Polygon) reader.read(geometryString); centroid = mp.getCentroid(); } else if (geometryString.startsWith("MULTIPOLYGON")) { geo.setType(GeometryType.MULITPOLYGON); MultiPolygon mp = (MultiPolygon) reader.read(geometryString); centroid = mp.getCentroid(); com.vividsolutions.jts.geom.Geometry e = mp.getEnvelope(); Coordinate[] boundingBox = e.getCoordinates(); geo.setBoundingBox(boundingBox); } if (centroid != null) { geo.setCentroidLat(centroid.getY()); geo.setCentroidLon(centroid.getX()); } } else if (geometryString.startsWith("POINT")) { Point point = (Point) reader.read(geometryString); geo.setType(GeometryType.POINT); Coordinate coord = point.getCoordinate(); geo.addCoordinate(coord.x, coord.y); } return geo; } @Override protected void writeOkResponse(RestResponse resp) throws Exception { getResponse().setStatus(200); OGRFeatureRestResponse piResp = (OGRFeatureRestResponse) resp; JSONObject result = new JSONObject(piResp); getResponse().getWriter().println(result.toString()); } }