//$HeadURL$ /*---------------- FILE HEADER ------------------------------------------ This file is part of deegree. Copyright (C) 2001-2008 by: Department of Geography, University of Bonn http://www.giub.uni-bonn.de/deegree/ lat/lon GmbH http://www.lat-lon.de This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Andreas Poth lat/lon GmbH Aennchenstr. 19 53177 Bonn Germany E-Mail: poth@lat-lon.de Prof. Dr. Klaus Greve Department of Geography University of Bonn Meckenheimer Allee 166 53115 Bonn Germany E-Mail: greve@giub.uni-bonn.de ---------------------------------------------------------------------------*/ package org.deegree.igeo.commands.geoprocessing; import static java.util.Collections.singletonList; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.UUID; import org.deegree.datatypes.QualifiedName; import org.deegree.framework.log.ILogger; import org.deegree.framework.log.LoggerFactory; import org.deegree.igeo.commands.CommandHelper; import org.deegree.igeo.config.EnvelopeType; import org.deegree.igeo.config.MemoryDatasourceType; import org.deegree.igeo.config.LayerType.MetadataURL; import org.deegree.igeo.dataadapter.DataAccessAdapter; import org.deegree.igeo.dataadapter.FeatureAdapter; import org.deegree.igeo.mapmodel.Datasource; import org.deegree.igeo.mapmodel.Layer; import org.deegree.igeo.mapmodel.MapModel; import org.deegree.igeo.mapmodel.MemoryDatasource; import org.deegree.kernel.AbstractCommand; import org.deegree.kernel.Command; import org.deegree.model.Identifier; import org.deegree.model.feature.Feature; import org.deegree.model.feature.FeatureCollection; import org.deegree.model.feature.FeatureFactory; import org.deegree.model.feature.FeatureProperty; import org.deegree.model.spatialschema.Envelope; import org.deegree.model.spatialschema.Geometry; import org.deegree.model.spatialschema.JTSAdapter; import org.deegree.model.spatialschema.MultiSurface; import org.deegree.model.spatialschema.Surface; import com.vividsolutions.jts.algorithm.InteriorPointArea; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Point; /** * {@link Command} implementation for creating a representativ point for each polygon contained in a layer. The result * will be added as new layer * * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> * * @author last edited by: $Author$ * * @version $Revision$, $Date$ * */ public class PointForPolygonCommand extends AbstractCommand { public static final QualifiedName name = new QualifiedName( "Point for Polygon" ); private static final ILogger LOG = LoggerFactory.getLogger( PointForPolygonCommand.class ); private Layer layer; private String newLayerName; private QualifiedName geomProperty; private Layer newLayer; private boolean performed; /** * * @param layer * @param newLayerName * @param geomProperty */ public PointForPolygonCommand( Layer layer, String newLayerName, QualifiedName geomProperty ) { this.layer = layer; this.newLayerName = newLayerName; this.geomProperty = geomProperty; } /* * (non-Javadoc) * * @see org.deegree.kernel.Command#execute() */ public void execute() throws Exception { performed = false; MapModel mm = layer.getOwner(); List<Feature> featureList = new ArrayList<Feature>( 5000 ); List<DataAccessAdapter> dada = layer.getDataAccess(); for ( DataAccessAdapter dataAccessAdapter : dada ) { if ( dataAccessAdapter instanceof FeatureAdapter ) { FeatureCollection fc = ( (FeatureAdapter) dataAccessAdapter ).getFeatureCollection(); int cnt = fc.size(); for ( int i = 0; i < cnt; i++ ) { featureList.add( fc.getFeature( i ) ); } } } try { if ( processMonitor != null ) { processMonitor.setMaximumValue( featureList.size() ); } FeatureCollection fc = FeatureFactory.createFeatureCollection( UUID.randomUUID().toString(), featureList.size() ); if ( geomProperty == null ) { geomProperty = CommandHelper.findGeomProperty( featureList.get( 0 ) ); } int cnt = 0; GeometryFactory gf = new GeometryFactory(); Iterator<Feature> iterator = featureList.iterator(); while ( iterator.hasNext() ) { if ( processMonitor != null ) { processMonitor.updateStatus( cnt++, "" ); } Feature feature = (Feature) ( (Feature) iterator.next() ).clone(); FeatureProperty fp = feature.getDefaultProperty( geomProperty ); if ( fp.getValue() instanceof Surface || fp.getValue() instanceof MultiSurface ) { Geometry geom = (Geometry) fp.getValue(); com.vividsolutions.jts.geom.Geometry g = JTSAdapter.export( geom ); InteriorPointArea ipa = new InteriorPointArea( g ); Point po = gf.createPoint( ipa.getInteriorPoint() ); org.deegree.model.spatialschema.Point p = (org.deegree.model.spatialschema.Point) JTSAdapter.wrap( po ); fp.setValue( p ); fc.add( feature ); } } Envelope env = fc.getBoundedBy(); MemoryDatasourceType mdst = new MemoryDatasourceType(); EnvelopeType et = new EnvelopeType(); et.setMinx( env.getMin().getX() ); et.setMiny( env.getMin().getY() ); et.setMaxx( env.getMax().getX() ); et.setMaxy( env.getMax().getY() ); et.setCrs( mm.getEnvelope().getCoordinateSystem().getPrefixedName() ); mdst.setExtent( et ); mdst.setMinScaleDenominator( 0d ); mdst.setMaxScaleDenominator( 100000000d ); Datasource ds = new MemoryDatasource( mdst, null, null, fc ); newLayer = new Layer( mm, new Identifier( newLayerName ), newLayerName, newLayerName, singletonList( ds ), Collections.<MetadataURL> emptyList() ); newLayer.setEditable( true ); mm.insert( newLayer, layer.getParent(), layer, false ); } catch ( Exception e ) { LOG.logError( "Unknown error", e ); throw e; } finally { if ( processMonitor != null ) { processMonitor.cancel(); } } performed = true; } /* * (non-Javadoc) * * @see org.deegree.kernel.Command#getName() */ public QualifiedName getName() { return name; } /* * (non-Javadoc) * * @see org.deegree.kernel.Command#getResult() */ public Object getResult() { return newLayer; } @Override public boolean isUndoSupported() { return true; } @Override public void undo() throws Exception { if ( performed ) { newLayer.getOwner().remove( newLayer ); performed = false; } } }