/* * Created on 11.02.2005 for PIROL * * SVN header information: * $Author: michaudm $ * $Rev: 1670 $ * $Date: 2009-02-25 00:33:13 +0100 (Mi, 25. Feb 2009) $ * $Id: SelectionTools.java 1670 2009-02-24 23:33:13Z michaudm $ */ package org.openjump.core.apitools; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jump.feature.Feature; import com.vividsolutions.jump.feature.FeatureCollection; import com.vividsolutions.jump.feature.FeatureCollectionWrapper; import com.vividsolutions.jump.workbench.model.FenceLayerFinder; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.plugin.PlugInContext; import com.vividsolutions.jump.workbench.ui.SelectionManager; /** * Class to easily handle selections and selection tools. Also has methods to * find features by given geometries. * * @author Ole Rahn * * FH Osnabrück - University of Applied Sciences Osnabrück * Project PIROL 2005 * Daten- und Wissensmanagement * */ public class SelectionTools extends ToolToMakeYourLifeEasier { protected PlugInContext context = null; public SelectionTools(PlugInContext context){ super(); this.context = context; } /** * create a selection out of the given features that is visible in the Jump map *@param features features to be selected */ public void selectFeatures( List features ){ SelectionTools.selectFeatures(features, this.context); } public static void selectLayer(PlugInContext context, Layer layer ){ // TODO: how to select a layer??? } public static void selectFeatures( List features, PlugInContext context ){ SelectionManager sm = context.getLayerViewPanel().getSelectionManager(); sm.clear(); Map layer2FeatList = LayerTools.getLayer2FeatureMap(features, context); Layer[] layersWithFeatures = (Layer[])layer2FeatList.keySet().toArray(new Layer[0]); for ( int i=0; i<layersWithFeatures.length; i++ ){ sm.getFeatureSelection().selectItems(layersWithFeatures[i], (ArrayList)layer2FeatList.get(layersWithFeatures[i])); } } public static List<Feature> getSelectedFeaturesFromLayer(PlugInContext context, Layer layer){ return new ArrayList<Feature>( context.getLayerViewPanel().getSelectionManager().getFeaturesWithSelectedItems(layer) ); } public static List<Feature> getSelectedFeatures(PlugInContext context){ return new ArrayList<Feature>( context.getLayerViewPanel().getSelectionManager().getFeaturesWithSelectedItems() ); } public List<Feature> getSelectedFeatures(){ return SelectionTools.getSelectedFeatures(this.context); } /** * *@param context current PlugIn context *@return the geometry of the current fence, or null if there is currently no fence */ public static Geometry getFenceGeometry(PlugInContext context){ Layer fence = new FenceLayerFinder(context.getLayerViewPanel()).getLayer(); if (fence==null) return null; FeatureCollectionWrapper fenceCollWrap = fence.getFeatureCollectionWrapper(); Feature fencePolygon = (Feature)fenceCollWrap.getUltimateWrappee().getFeatures().get(0); return fencePolygon.getGeometry(); } /** *@return the geometry of the current fence, or null if there is currently no fence */ public Geometry getFenceGeometry(){ return SelectionTools.getFenceGeometry(this.context); } public List getFeaturesInFence(){ Geometry fenceGeometry = this.getFenceGeometry(); return this.getFeaturesInGeometry(fenceGeometry); } public List getFeaturesInGeometry(Geometry fenceGeometry){ ArrayList featsInFence = new ArrayList(); List layers = this.context.getLayerManager().getVisibleLayers(false); Iterator iter = layers.iterator(); Layer tmp; while (iter.hasNext()){ tmp = (Layer)iter.next(); featsInFence.addAll(SelectionTools.getFeaturesInFenceInLayerAsList(tmp,fenceGeometry)); } return featsInFence; } /** * Get a list of those features from the given layer that are included by the given fence geometry. * @param layer - Layer to search in * @param fenceGeometry - Geometry to search in */ public static Feature[] getFeaturesInFenceInLayer( Layer layer, Geometry fenceGeometry ){ return SelectionTools.getFeaturesOnTheSameSpot( layer, fenceGeometry, false ); } /** * Get a list of those features from the given layer that are included by the given fence geometry. * @param layer - Layer to search in * @param fenceGeometry - Geometry to search in */ public static List getFeaturesInFenceInLayerAsList( Layer layer, Geometry fenceGeometry ){ Feature[] featureArray = SelectionTools.getFeaturesOnTheSameSpot( layer, fenceGeometry, false ); ArrayList result = new ArrayList(); for (int i=0; i<featureArray.length; i++){ result.add(featureArray[i]); } return result; } /** * Get a list of features (a sub list of the given array) that are included by the given fence geometry. * @param featArray - Array of features to search in * @param fenceGeometry - Geometry to search in */ public static Feature[] getFeaturesInFenceInLayer( Feature[] featArray, Geometry fenceGeometry ){ return SelectionTools.getFeaturesOnTheSameSpot( featArray, fenceGeometry, false ); } /** * Get a list of those features from the given layer that are included by the given fence geometry. * @param layer - Layer to search in * @param fenceGeometry - Geometry to search in * @param bothWays - sets if it's also a hit if the feature's geometry includes the fence geometry */ public static Feature[] getFeaturesOnTheSameSpot( Layer layer, Geometry fenceGeometry, boolean bothWays ){ FeatureCollection featColl = layer.getFeatureCollectionWrapper().getUltimateWrappee(); return SelectionTools.getFeaturesOnTheSameSpot( FeatureCollectionTools.FeatureCollection2FeatureArray(featColl), fenceGeometry, bothWays); } /** * Get a list of features (a sub list of the given array) that are included by the given fence geometry. * @param featArray - Array of features to search in * @param fenceGeometry - Geometry to search in * @param bothWays - sets if it's also a hit if the feature's geometry includes the fence geometry */ public static Feature[] getFeaturesOnTheSameSpot( Feature[] featArray, Geometry fenceGeometry, boolean bothWays ){ ArrayList featuresInsideTheFence = new ArrayList(); // Envelope fenceEnv = fenceGeometry.getEnvelopeInternal(); // Envelope featEnv; Geometry featGeom = null; Feature feat; int numFeats = featArray.length; for (int i=0; i<numFeats; i++){ feat = featArray[i]; featGeom = feat.getGeometry(); /* featEnv = featGeom.getEnvelopeInternal(); // quick test, first: if (!fenceEnv.contains(featEnv) && !fenceEnv.intersects(featEnv) && !bothWays){ continue; } else if (bothWays){ if (!fenceEnv.contains(featEnv) && !fenceEnv.intersects(featGeom.getEnvelopeInternal()) && !featEnv.contains(fenceEnv) ) continue; } */ if (!fenceGeometry.disjoint(featGeom)){ featuresInsideTheFence.add(feat); } else if (bothWays){ if (!featGeom.disjoint(fenceGeometry)){ featuresInsideTheFence.add(feat); } } } return (Feature[])featuresInsideTheFence.toArray(new Feature[0]); } }