Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/utils/GeometryUtils.java @ 2089:0da8874bd378
Added initial state to map artifact to be able to advance and step back.
The map artifact overrides describe() to have the complete UI information in the
describe response document.
flys-artifacts/trunk@3613 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Fri, 06 Jan 2012 12:02:10 +0000 |
parents | cbeeaaad1056 |
children | 33aa37e6d98f |
line wrap: on
line source
package de.intevation.flys.utils; import java.io.IOException; import java.io.File; import java.io.Serializable; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.geotools.data.DataStoreFactorySpi; import org.geotools.data.FeatureStore; import org.geotools.data.DefaultTransaction; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; import org.geotools.feature.FeatureIterator; import org.geotools.feature.FeatureCollection; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.geojson.feature.FeatureJSON; import org.geotools.referencing.CRS; import de.intevation.flys.model.RiverAxis; public class GeometryUtils { private static final Logger logger = Logger.getLogger(GeometryUtils.class); private GeometryUtils() { } public static Envelope getRiverBoundary(String rivername) { List<RiverAxis> axes = RiverAxis.getRiverAxis(rivername); if (axes != null && axes.size() > 0) { Envelope max = null; for (RiverAxis axis: axes) { // TODO Take the correct EPSG into account. Maybe, we need to // reproject the geometry. Envelope env = axis.getGeom().getEnvelopeInternal(); if (max == null) { max = env; } else { max.expandToInclude(env); } } return max; } return null; } public static String getRiverBounds(String rivername) { Envelope env = getRiverBoundary(rivername); if (env == null) { return jtsBoundsToOLBounds(env); } return null; } /** * Returns the boundary of Envelope <i>env</i> in OpenLayers * representation. * * @param env The envelope of a geometry. * * @return the OpenLayers boundary of <i>env</i>. */ public static String jtsBoundsToOLBounds(Envelope env) { return "" + env.getMinX() + " " + env.getMinY() + " " + env.getMaxX() + " " + env.getMaxY(); } public static String createOLBounds(Geometry a, Geometry b) { Coordinate[] ca = a.getCoordinates(); Coordinate[] cb = b.getCoordinates(); double lowerX = Double.MAX_VALUE; double lowerY = Double.MAX_VALUE; double upperX = -Double.MAX_VALUE; double upperY = -Double.MAX_VALUE; for (Coordinate c: ca) { lowerX = lowerX < c.x ? lowerX : c.x; lowerY = lowerY < c.y ? lowerY : c.y; upperX = upperX > c.x ? upperX : c.x; upperY = upperY > c.y ? upperY : c.y; } for (Coordinate c: cb) { lowerX = lowerX < c.x ? lowerX : c.x; lowerY = lowerY < c.y ? lowerY : c.y; upperX = upperX > c.x ? upperX : c.x; upperY = upperY > c.y ? upperY : c.y; } return "" + lowerX + " " + lowerY + " " + upperX + " " + upperY; } public static SimpleFeatureType buildFeatureType( String name, String srs, Class geometryType) { return buildFeatureType(name, srs, geometryType, null); } /** * Creates a new SimpleFeatureType using a SimpleFeatureTypeBuilder. * * @param name The name of the FeatureType. * @param srs The SRS (e.g. "EPSG:31466"). * @param geometryType The geometry type's class (e.g. Polygon.class). * @param attrs Optional. An object with attribute-name/attribute-class * pairs where index 0 specifies the name as string and index 1 the type * as class. * * @return a new SimpleFeatureType. */ public static SimpleFeatureType buildFeatureType( String name, String srs, Class geometryType, Object[][] attrs) { try { SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder(); CoordinateReferenceSystem crs = CRS.decode(srs); builder.setName("flys"); builder.setNamespaceURI("http://www.intevation.de/"); builder.setCRS(crs); builder.setSRS(srs); builder.add("geometry", geometryType, crs); if (attrs != null) { for (Object[] attr: attrs) { builder.add((String) attr[0], (Class) attr[1]); } } return builder.buildFeatureType(); } catch (NoSuchAuthorityCodeException nsae) { } catch (FactoryException fe) { } return null; } public static List<SimpleFeature> parseGeoJSON( String geojson, SimpleFeatureType ft ) { List<SimpleFeature> collection = new ArrayList<SimpleFeature>(); try { FeatureJSON fjson = new FeatureJSON(); fjson.setFeatureType(ft); FeatureIterator<SimpleFeature> iterator = fjson.streamFeatureCollection(geojson); while (iterator.hasNext()) { collection.add(iterator.next()); } } catch (IOException ioe) { // TODO handle exception } return collection; } public static boolean writeShapefile( File shape, SimpleFeatureType featureType, FeatureCollection collection ) { if (collection.isEmpty()) { logger.warn("Shapefile is not written - no features given!"); return false; } Transaction transaction = null; try { Map<String, Serializable> params = new HashMap<String, Serializable>(); params.put("url", shape.toURI().toURL()); params.put("create spatial index", Boolean.TRUE); DataStoreFactorySpi dataStoreFactory = new ShapefileDataStoreFactory(); ShapefileDataStore newDataStore = (ShapefileDataStore)dataStoreFactory.createNewDataStore(params); newDataStore.createSchema(featureType); transaction = new DefaultTransaction("create"); String typeName = newDataStore.getTypeNames()[0]; FeatureStore<SimpleFeatureType, SimpleFeature> featureStore = (FeatureStore<SimpleFeatureType, SimpleFeature>) newDataStore.getFeatureSource(typeName); featureStore.setTransaction(transaction); featureStore.addFeatures(collection); transaction.commit(); return true; } catch (MalformedURLException mue) { logger.error("Unable to prepare shapefile: " + mue.getMessage()); } catch (IOException ioe) { logger.error("Unable to write shapefile: " + ioe.getMessage()); } finally { if (transaction != null) { try { logger.debug("XXX CLOSE TRANSACTION!"); transaction.close(); } catch (IOException ioe) { /* do nothing */ } } } return false; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :