Thanks for the clarification Stefan. It seems you are always several
steps ahead of me. :]
SS
On 8/13/07, Stefan Steiniger <[EMAIL PROTECTED]> wrote:
> no.. it was a fix sended
>
> Sunburned Surveyor schrieb:
> > Stefan,
> >
> > I am sorry it is taking me so long to respond to this e-mail. Is this
> > something that we need a patch for?
> >
> > If so I can make the needed changes in the SVN.
> >
> > Let me know.
> >
> > The Sunburned Surveyor
> >
> > On 7/24/07, Stefan Steiniger <[EMAIL PROTECTED]> wrote:
> >> forwad for Malte as I accidently delted his message from the pending
> >> request list
> >>
> >> Dear OpenJump Enthusiast,
> >>
> >> I've tried to make a copy of a FeatureCollection containing Features
> >> with null values.
> >> I used the cloneFeatureCollection-Method of the FeatureCollectionTools
> >> Class from the Pirol Project (now implemented in the OJ beta, too) and
> >> got a NPE.
> >>
> >> I think a Feature should have Attributes containing null values, so I
> >> fixed this.
> >> The fixed class is attached.
> >>
> >> Greetings from cloudy Hanover,
> >> Malte
> >>
> >>
> >>
> >>
> >>
> >> /*
> >> * Created on 12.01.2005
> >> *
> >> * SVN header information:
> >> * $Author: mentaer $
> >> * $Rev: 2509 $
> >> * $Date: 2007/02/03 14:19:04 $
> >> * $Id: FeatureCollectionTools.java,v 1.2 2007/02/03 14:19:04 mentaer Exp
> >> $s
> >> */
> >> package de.fho.jump.pirol.utilities.apiTools;
> >>
> >> import java.util.ArrayList;
> >> import java.util.Date;
> >> import java.util.HashMap;
> >> import java.util.HashSet;
> >> import java.util.List;
> >> import java.util.Map;
> >> import java.util.Set;
> >>
> >> import com.vividsolutions.jts.geom.Coordinate;
> >> import com.vividsolutions.jts.geom.Envelope;
> >> import com.vividsolutions.jts.geom.Geometry;
> >> import com.vividsolutions.jts.geom.GeometryFactory;
> >> import com.vividsolutions.jump.feature.AttributeType;
> >> import com.vividsolutions.jump.feature.BasicFeature;
> >> import com.vividsolutions.jump.feature.Feature;
> >> import com.vividsolutions.jump.feature.FeatureCollection;
> >> import com.vividsolutions.jump.feature.FeatureDataset;
> >> import com.vividsolutions.jump.feature.FeatureSchema;
> >> import com.vividsolutions.jump.workbench.model.Layer;
> >> import com.vividsolutions.jump.workbench.plugin.PlugInContext;
> >> import com.vividsolutions.jump.workbench.ui.EditTransaction;
> >>
> >> import
> >> de.fho.jump.pirol.utilities.FeatureCollection.PirolFeatureCollection;
> >> import de.fho.jump.pirol.utilities.FormulaParsing.FormulaValue;
> >> import de.fho.jump.pirol.utilities.attributes.AttributeInfo;
> >> import de.fho.jump.pirol.utilities.comparisonAndSorting.ObjectComparator;
> >> import de.fho.jump.pirol.utilities.debugOutput.DebugUserIds;
> >> import de.fho.jump.pirol.utilities.debugOutput.PersonalLogger;
> >> import de.fho.jump.pirol.utilities.metaData.MetaInformationHandler;
> >>
> >> /**
> >> * Class to speed up handling of FeatureCollections (or lists of features)
> >> during progamming by implementing
> >> * a set of common tasks.
> >> * Most functions can be used in a static way, but on the other hand for
> >> each FeatureCollection a instance of this class can be invoked.
> >> * This might be more convenient, if there is more than one thing to do
> >> with the same feature collection.
> >> *
> >> * @author Ole Rahn
> >> * <br>
> >> * <br>FH Osnabrück - University of Applied Sciences Osnabrück,
> >> * <br>Project: PIROL (2005),
> >> * <br>Subproject: Daten- und Wissensmanagement
> >> *
> >> * @version $Rev: 2509 $
> >> */
> >>
> >> public class FeatureCollectionTools extends ToolToMakeYourLifeEasier {
> >>
> >> protected FeatureCollection fc = null;
> >> protected List<Feature> featureList;
> >> private HashMap<Integer, Feature> fid2Object = new HashMap<Integer,
> >> Feature>();
> >>
> >> protected static PersonalLogger logger = new
> >> PersonalLogger(DebugUserIds.ALL);
> >>
> >> public FeatureCollectionTools( FeatureCollection fc ){
> >> super();
> >> this.fc = fc;
> >> this.featureList = this.fc.getFeatures();
> >> }
> >>
> >> public FeatureCollectionTools( List<Feature> fcl ){
> >> super();
> >> this.featureList = fcl;
> >> }
> >>
> >> /**
> >> * gets the Feature with the given FID.
> >> [EMAIL PROTECTED] fid FID to look for
> >> [EMAIL PROTECTED] the feature
> >> */
> >> public Feature getFeature( int fid ){
> >> Integer FID = new Integer(fid);
> >> if (!this.fid2Object.containsKey(FID)){
> >>
> >> this.fid2Object.put(FID,FeatureCollectionTools.getFeatureFromCollection(this.featureList,
> >> fid));
> >> }
> >>
> >> return (Feature)this.fid2Object.get(FID);
> >> }
> >>
> >>
> >> /**
> >> * Get the feature with the specified ID from the List
> >> [EMAIL PROTECTED] features array with Feature objects
> >> [EMAIL PROTECTED] fid the feature ID we are looking for
> >> [EMAIL PROTECTED] feature with specified FID if exists, else null
> >> */
> >> public static Feature getFeatureFromCollection( List<Feature> features,
> >> int fid ){
> >> return
> >> FeatureCollectionTools.getFeatureFromCollection((Feature[])features.toArray(new
> >> Feature[0]), fid);
> >> }
> >>
> >> /**
> >> * Get the feature with the specified ID from the array
> >> [EMAIL PROTECTED] features array with Feature objects
> >> [EMAIL PROTECTED] fid the feature ID we are looking for
> >> [EMAIL PROTECTED] feature with specified FID if exists, else null
> >> */
> >> public static Feature getFeatureFromCollection( Feature[] features, int
> >> fid ){
> >> Feature feat;
> >>
> >> for ( int i=0; i < features.length; i++ ){
> >> feat = features[i];
> >>
> >> if (feat.getID() == fid){
> >> return feat;
> >> }
> >> }
> >> return null;
> >> }
> >>
> >> /**
> >> * deep copies a the FeatureSchema, the Features and their Geometries
> >> * @param fc the FeatureCollection to copy
> >> * @return the new copied FeatureCollection
> >> */
> >> public final static PirolFeatureCollection
> >> cloneFeatureCollection(FeatureCollection fc){
> >> FeatureSchema clonedSchema =
> >> (FeatureSchema)fc.getFeatureSchema().clone();
> >> FeatureDataset newFc = new FeatureDataset(clonedSchema);
> >>
> >> Feature[] featuresToCopy = FeatureCollection2FeatureArray(fc);
> >> Feature newFeat = null;
> >> AttributeType attrType = null;
> >>
> >> for (int i=0; i<featuresToCopy.length; i++){
> >> newFeat = new BasicFeature(clonedSchema);
> >>
> >> for (int attr=0; attr<clonedSchema.getAttributeCount();
> >> attr++){
> >> attrType = clonedSchema.getAttributeType(attr);
> >> /**
> >> * FIX for Null Values.
> >> * Added by mweller 24.07.2007
> >> */
> >> if(featuresToCopy[i].getAttribute(attr) != null){
> >> if (attrType.equals(AttributeType.DOUBLE)){
> >> newFeat.setAttribute(attr, new
> >> Double(((Double)featuresToCopy[i].getAttribute(attr)).doubleValue()) );
> >> } else if (attrType.equals(AttributeType.INTEGER)){
> >> newFeat.setAttribute(attr, new
> >> Integer(((Integer)featuresToCopy[i].getAttribute(attr)).intValue()) );
> >> } else if (attrType.equals(AttributeType.STRING)){
> >> newFeat.setAttribute(attr,
> >> ((String)featuresToCopy[i].getAttribute(attr)).trim() );
> >> } else if (attrType.equals(AttributeType.GEOMETRY)){
> >> newFeat.setAttribute(attr,
> >> ((Geometry)featuresToCopy[i].getAttribute(attr)).clone() );
> >> } else if (attrType.equals(AttributeType.DATE)){
> >> newFeat.setAttribute(attr,
> >> ((Date)featuresToCopy[i].getAttribute(attr)).clone() );
> >> } else if (attrType.equals(AttributeType.OBJECT)){
> >> logger.printError("not implemented!");
> >> newFeat.setAttribute(attr,
> >> (featuresToCopy[i].getAttribute(attr)) );
> >> }
> >> }
> >> else{
> >> newFeat.setAttribute(attr, null );
> >> }
> >> }
> >>
> >> newFc.add(newFeat);
> >> }
> >> return MetaInformationHandler.createPirolFeatureCollection(newFc);
> >> }
> >>
> >> /**
> >> * Get the feature with the specified ID from the FeatureCollection
> >> [EMAIL PROTECTED] features array with Feature objects
> >> [EMAIL PROTECTED] fid the feature ID we are looking for
> >> [EMAIL PROTECTED] feature with specified FID if exists, else null
> >> */
> >> public static Feature getFeatureFromCollection( FeatureCollection
> >> features, int fid ){
> >> return
> >> FeatureCollectionTools.getFeatureFromCollection(features.getFeatures(),
> >> fid);
> >> }
> >>
> >> /**
> >> [EMAIL PROTECTED] features list of features to calculate the mean for
> >> [EMAIL PROTECTED] attr name of attribute to calculate the mean for
> >> [EMAIL PROTECTED] the mean (double because a mean of integers will
> >> very likely be a double)
> >> */
> >> public static double getAritmeticMiddleForAttribute( Feature[]
> >> features, String attr ){
> >>
> >> if (features == null || features.length==0) return Double.NaN;
> >>
> >> Feature f = features[0];
> >> FeatureSchema fs = f.getSchema();
> >> int attrInd = fs.getAttributeIndex(attr);
> >> return FeatureCollectionTools.getAritmeticMiddleForAttribute(
> >> features, attrInd );
> >> }
> >>
> >> /**
> >> * Method to calculate means (or modes) for the attributes given. If
> >> means or modes
> >> * are calulated depends on the attribute type of each given given
> >> attribute.
> >> * This method is hopefully faster, than calculation each mean (mode)
> >> in an extra loop,
> >> * if there are more means (modes) to calculate than one...
> >> [EMAIL PROTECTED] features list of features to calculate mean/modes for
> >> [EMAIL PROTECTED] attrs array of attribute names to calculate
> >> mean/modes for
> >> [EMAIL PROTECTED] array of objects, representing means (or modes) -->
> >> e.g. Double, Integer or String objects.
> >> */
> >> public static Object[] getMeanOrModeForAttributes( Feature[] features,
> >> String[] attrs ){
> >> if (features==null || features.length==0) return null;
> >>
> >> int numVals = features.length;
> >> int numAttrs = attrs.length;
> >>
> >> FeatureSchema fs = features[0].getSchema();
> >> Object[] meansOrModes = new Object[numAttrs];
> >> AttributeType[] ats = new AttributeType[numAttrs];
> >>
> >> Object[] sumsOrMaps = new Object[numAttrs];
> >> boolean[] atIsNumeric = new boolean[numAttrs];
> >>
> >> for (int i=0; i<numAttrs; i++){
> >> ats[i] = fs.getAttributeType(attrs[i]);
> >> atIsNumeric[i] =
> >> FeatureCollectionTools.isAttributeTypeNumeric(ats[i]);
> >> if (atIsNumeric[i]){
> >> sumsOrMaps[i] = new Double(0);
> >> } else {
> >> // Map; no. of max. occurances; modus value
> >> sumsOrMaps[i] = new Object[]{ new HashMap(), new
> >> Integer(0), null };
> >> }
> >> }
> >>
> >> Feature currFeat;
> >> Double sum;
> >> Object value, modus;
> >> Map<Object,Object> map;
> >>
> >> Feature[] featArray = features;
> >>
> >> Integer maxOcc;
> >> int occ = 0;
> >>
> >> for (int i=0; i<featArray.length; i++){
> >> currFeat = featArray[i];
> >> for (int j=0; j<numAttrs; j++){
> >> if (atIsNumeric[j]){
> >> sum = ((Double)sumsOrMaps[j]);
> >> if (currFeat.getAttribute(attrs[j]) != null){
> >> sumsOrMaps[j] = new Double(sum.doubleValue() +
> >> ObjectComparator.getDoubleValue(currFeat.getAttribute(attrs[j])));
> >> } else {
> >> // value is skipped
> >>
> >> FeatureCollectionTools.logger.printMinorError("skipped a value (NULL),
> >> when calculating mean for " + attrs[j]);
> >> }
> >> } else {
> >> value = currFeat.getAttribute(attrs[j]);
> >>
> >> if (value.getClass().equals(String.class)){
> >> ((String)value).trim();
> >> }
> >>
> >> map = (Map)((Object[])sumsOrMaps[j])[0];
> >> maxOcc = (Integer)((Object[])sumsOrMaps[j])[1];
> >> modus = ((Object[])sumsOrMaps[j])[2];
> >>
> >> if ( map.containsKey(value) ){
> >> occ = ((Integer)map.get(value)).intValue();
> >> occ += 1;
> >> map.remove(value);
> >> } else {
> >> occ = 1;
> >> }
> >> map.put(value,new Integer(occ));
> >>
> >> if (occ > maxOcc.intValue()){
> >> maxOcc = new Integer(occ);
> >> modus = value;
> >> }
> >>
> >> sumsOrMaps[j] = new Object[]{map,maxOcc,modus};
> >>
> >> }
> >> }
> >> }
> >>
> >> for ( int i=0; i<meansOrModes.length; i++ ){
> >> if (atIsNumeric[i]){
> >> meansOrModes[i] = new Double(
> >> ((Double)sumsOrMaps[i]).doubleValue()/((double)numVals) );
> >> } else {
> >> meansOrModes[i] = ((Object[])sumsOrMaps[i])[2];
> >> }
> >> }
> >>
> >> return meansOrModes;
> >> }
> >>
> >> /**
> >> * Creates an envelope object for the features in the given array. This
> >> is an easy way
> >> * to get an envelope for a subset of a layer's features.
> >> [EMAIL PROTECTED] features array of Feature object to create an
> >> envelope for
> >> [EMAIL PROTECTED] the envelope containing the given features
> >> */
> >> public static Envelope getEnvelopeForFeatures(Feature[] features){
> >> Envelope env = null;
> >> Feature feat;
> >>
> >> for (int i=0; i<features.length; i++){
> >> feat = features[i];
> >> if (env==null){
> >> env = new Envelope(feat.getGeometry().getCoordinate());
> >> } else {
> >> env.expandToInclude(feat.getGeometry().getCoordinate());
> >> }
> >> }
> >>
> >> return env;
> >> }
> >>
> >> /**
> >> [EMAIL PROTECTED] features list of features to calculate the mean for
> >> [EMAIL PROTECTED] attr index of attribute to calculate the mean for
> >> [EMAIL PROTECTED] the mean (double because a mean of integers will
> >> very likely be a double)
> >> */
> >> public static double getAritmeticMiddleForAttribute( List<Feature>
> >> features, int attr ){
> >> return
> >> FeatureCollectionTools.getAritmeticMiddleForAttribute((Feature[])features.toArray(new
> >> Feature[0]), attr);
> >> }
> >>
> >> /**
> >> [EMAIL PROTECTED] featArray array of features to calculate the mean for
> >> [EMAIL PROTECTED] attr index of attribute to calculate the mean for
> >> [EMAIL PROTECTED] the mean (double because a mean of integers will
> >> very likely be a double)
> >> */
> >> public static double getAritmeticMiddleForAttribute( Feature[]
> >> featArray, int attr ){
> >> double sumVals = 0;
> >> int numVals = 0;
> >>
> >> if (featArray.length==0) {
> >> logger.printWarning("no features in list - return value will be
> >> NAN!");
> >> return Double.NaN;
> >> }
> >>
> >> Feature f = featArray[0];
> >> FeatureSchema fs = f.getSchema();
> >>
> >> if (
> >> FeatureCollectionTools.isAttributeTypeNumeric(fs.getAttributeType(attr)) ){
> >>
> >> //Iterator iter = features.iterator();
> >> Feature feat;
> >> double value;
> >>
> >> for (int i=0; i<featArray.length; i++){
> >> feat = featArray[i];
> >> value =
> >> ObjectComparator.getDoubleValue(feat.getAttribute(attr));
> >>
> >> sumVals += value;
> >> numVals ++;
> >> }
> >> }
> >>
> >> return (sumVals/(double)numVals);
> >> }
> >>
> >> /**
> >> * Calculates the center of mass for the gives features' geometries.
> >> * It's like getCentroid(), but puts out one center of mass for N
> >> features instead of N centers for N features.
> >> [EMAIL PROTECTED] features the features
> >> [EMAIL PROTECTED] the point, representing the center of mass
> >> */
> >> public static Geometry getCenterOfMass( Feature[] features ){
> >> double sumX = 0, sumY = 0;
> >> GeometryFactory gf = new GeometryFactory();
> >>
> >> if (features==null || features.length==0) return null;
> >>
> >> Feature feat;
> >>
> >> for (int i=0; i<features.length; i++){
> >> feat = features[i];
> >> sumX += feat.getGeometry().getCoordinate().x;
> >> sumY += feat.getGeometry().getCoordinate().y;
> >> }
> >>
> >> double newX = sumX / (double)features.length;
> >> double newY = sumY / (double)features.length;
> >>
> >> return gf.createPoint(new Coordinate(newX, newY));
> >> }
> >>
> >> /**
> >> [EMAIL PROTECTED] features list of features
> >> [EMAIL PROTECTED] attr name of attribute
> >> [EMAIL PROTECTED] number of differnt values in the given features
> >> attributes or -1 if an error occurs
> >> */
> >> public static Set getSetOfDifferentAttributeValues( Feature[] features,
> >> String attr ){
> >> Feature f = features[0];
> >> FeatureSchema fs = f.getSchema();
> >> int attrInd = fs.getAttributeIndex(attr);
> >> return FeatureCollectionTools.getSetOfDifferentAttributeValues(
> >> features, attrInd );
> >> }
> >>
> >> /**
> >> [EMAIL PROTECTED] features list of features
> >> [EMAIL PROTECTED] attr index of attribute
> >> [EMAIL PROTECTED] number of differnt values in the given features
> >> attributes or -1 if an error occurs
> >> */
> >> public static Set<Object> getSetOfDifferentAttributeValues( Feature[]
> >> features, int attr ){
> >> Feature[] featArray = features;
> >> int numFeats = featArray.length;
> >>
> >> HashSet<Object> differentValues = new HashSet<Object>();
> >> Object val;
> >>
> >> for (int i=numFeats-1; i>=0; i--){
> >>
> >> val = featArray[i].getAttribute(attr);
> >> //if (!differentValues.contains(val))
> >> differentValues.add(val);
> >> }
> >>
> >> return differentValues;
> >> }
> >>
> >> /**
> >> [EMAIL PROTECTED] features list of features
> >> [EMAIL PROTECTED] attr name of attribute
> >> [EMAIL PROTECTED] number of differnt values in the given features
> >> attributes or -1 if an error occurs
> >> */
> >> public static int getNumOfDifferentAttributeValues( Feature[] features,
> >> String attr ){
> >> Feature f = features[0];
> >> FeatureSchema fs = f.getSchema();
> >> int attrInd = fs.getAttributeIndex(attr);
> >> return FeatureCollectionTools.getNumOfDifferentAttributeValues(
> >> features, attrInd );
> >> }
> >>
> >> /**
> >> [EMAIL PROTECTED] features list of features
> >> [EMAIL PROTECTED] attr index of attribute
> >> [EMAIL PROTECTED] number of differnt values in the given features
> >> attributes or -1 if an error occurs
> >> */
> >> public static int getNumOfDifferentAttributeValues( Feature[] features,
> >> int attr ){
> >> return
> >> FeatureCollectionTools.getSetOfDifferentAttributeValues(features,attr).size();
> >> }
> >>
> >> /**
> >> [EMAIL PROTECTED] features list of features to calculate the mode for
> >> [EMAIL PROTECTED] attr name of attribute to calculate the mode for
> >> [EMAIL PROTECTED] the mode
> >> */
> >> public static Object getModusForAttribute( Feature[] features, String
> >> attr ){
> >> Feature f = features[0];
> >> FeatureSchema fs = f.getSchema();
> >> int attrInd = fs.getAttributeIndex(attr);
> >> return FeatureCollectionTools.getModusForAttribute( features,
> >> attrInd );
> >> }
> >>
> >>
> >> /**
> >> * Counts the number of appearances of each value of the given
> >> attributes within the given features.
> >> * (Somewhat like a histogram for each given attribute, but each
> >> histogram class is just a single value.)
> >> * @param features array of Features to count value appearances for
> >> * @param attrs array of attribute indices of attributes to count value
> >> appearances for
> >> * @return Array of mappings of values to number of appearances
> >> */
> >> public final static HashMap<Object,Integer>[] getValueAppearancesCount(
> >> Feature[] features, int[] attrs ){
> >> HashMap<Object,Integer>[] value2NumAppearanceMaps = new
> >> HashMap[attrs.length];
> >>
> >> for (int i=0; i<attrs.length; i++){
> >> value2NumAppearanceMaps[i] = new HashMap<Object,Integer>();
> >> }
> >>
> >> Feature feat;
> >> Object value;
> >>
> >> for (int i=0; i<features.length; i++){
> >> feat = features[i];
> >>
> >> for (int attInd=0; attInd<attrs.length; attInd++){
> >> value = feat.getAttribute(attrs[attInd]);
> >>
> >> if (!value2NumAppearanceMaps[attInd].containsKey(value)){
> >> value2NumAppearanceMaps[attInd].put(value, 1);
> >> } else {
> >> value2NumAppearanceMaps[attInd].put(value,
> >> value2NumAppearanceMaps[attInd].get(value).intValue()+1);
> >> }
> >>
> >> }
> >>
> >> }
> >>
> >> return value2NumAppearanceMaps;
> >> }
> >>
> >> /**
> >> [EMAIL PROTECTED] features list of features to calculate the mode for
> >> [EMAIL PROTECTED] attr index of attribute to calculate the mode for
> >> [EMAIL PROTECTED] the mode
> >> */
> >> public static Object getModusForAttribute( Feature[] features, int attr
> >> ){
> >> HashMap<Object,Integer> map = new HashMap<Object,Integer>();
> >> Object modus = null;
> >> int maxNr = 0;
> >>
> >> if (features==null || features.length==0) return null;
> >>
> >> Feature[] featArray = features;
> >> Feature feat;
> >> Object value;
> >> int occ, numFeats = featArray.length;
> >>
> >> for (int i=0; i<numFeats; i++){
> >> feat = featArray[i];
> >>
> >> value = feat.getAttribute(attr);
> >>
> >> if (value.getClass().getName().equals(String.class.getName())){
> >> ((String)value).trim();
> >> }
> >>
> >> if ( map.containsKey(value) ){
> >> occ = ((Integer)map.get(value)).intValue();
> >> occ += 1;
> >> map.remove(value);
> >> } else {
> >> occ = 1;
> >> }
> >> map.put(value,new Integer(occ));
> >>
> >> if (occ > maxNr){
> >> maxNr = occ;
> >> modus = value;
> >> }
> >> }
> >>
> >> return modus;
> >> }
> >>
> >> /**
> >> * deletes the given features from the map. It thereby creates an
> >> EditTransaction that
> >> * enables the user to undo the deletion.
> >> [EMAIL PROTECTED] features features to be deleted
> >> [EMAIL PROTECTED] context curr. PlugIn context
> >> */
> >> public static void deleteFeatures( List<Feature> features,
> >> PlugInContext context ){
> >> Map layer2FeatList = LayerTools.getLayer2FeatureMap(features,
> >> context);
> >>
> >> Layer[] layersWithFeatures =
> >> (Layer[])layer2FeatList.keySet().toArray(new Layer[0]);
> >> Feature[] selFeatsOfLayer;
> >>
> >> for ( int i=0; i<layersWithFeatures.length; i++ ){
> >> EditTransaction edtr = new EditTransaction(new ArrayList(),
> >> "delete features", layersWithFeatures[i], true, true,
> >> context.getLayerViewPanel());
> >>
> >> selFeatsOfLayer =
> >> (Feature[])((List)layer2FeatList.get(layersWithFeatures[i])).toArray(new
> >> Feature[0]);
> >>
> >> for (int j=0; j<selFeatsOfLayer.length; j++){
> >> edtr.deleteFeature(selFeatsOfLayer[j]);
> >> }
> >>
> >> edtr.commit();
> >> edtr.clearEnvelopeCaches();
> >> }
> >> }
> >>
> >> /**
> >> * "deep copys" the given Feature
> >> [EMAIL PROTECTED] feat the feature to be copied
> >> [EMAIL PROTECTED] copy of the feature
> >> */
> >> public static Feature copyFeature( Feature feat ){
> >> Feature newFeat = new BasicFeature(feat.getSchema());
> >>
> >> int numAttr = feat.getSchema().getAttributeCount();
> >>
> >> for ( int i=0; i<numAttr; i++ ){
> >> newFeat.setAttribute( feat.getSchema().getAttributeName(i),
> >> feat.getAttribute(i) );
> >> }
> >>
> >> newFeat.setGeometry((Geometry)feat.getGeometry());
> >>
> >> return newFeat;
> >> }
> >>
> >> /**
> >> * "deep copys" the given Feature and thereby sets the given feature
> >> schema
> >> [EMAIL PROTECTED] feat the feature to be copied
> >> [EMAIL PROTECTED] newFs the new feature schema
> >> [EMAIL PROTECTED] copy of the feature
> >> */
> >> public static Feature copyFeatureAndSetFeatureSchema( Feature feat,
> >> FeatureSchema newFs ){
> >> feat = feat.clone(true);
> >> FeatureSchema fs = feat.getSchema();
> >>
> >> Feature newFeat = new BasicFeature(newFs);
> >> int numAttr = feat.getSchema().getAttributeCount();
> >>
> >> for ( int i=0; i<numAttr; i++ ){
> >> newFeat.setAttribute( fs.getAttributeName(i),
> >> feat.getAttribute(fs.getAttributeName(i)) );
> >> }
> >>
> >> newFeat.setGeometry((Geometry)feat.getGeometry());
> >>
> >> return newFeat;
> >> }
> >>
> >> public String getUniqueAttributeName(String attr){
> >> return FeatureCollectionTools.getUniqueAttributeName( this.fc, attr
> >> );
> >> }
> >>
> >> public static String getUniqueAttributeName(FeatureCollection fc,
> >> String attr){
> >> FeatureSchema fs = fc.getFeatureSchema();
> >> String newName = new String(attr);
> >> String suffix = "";
> >>
> >> for ( int i=2; FeatureCollectionTools.attributeExistsInSchema(fs,
> >> newName+suffix); i++ ){
> >> suffix = " ("+i+")";
> >> }
> >>
> >> return newName+suffix;
> >> }
> >>
> >> protected static boolean attributeExistsInSchema(FeatureSchema fs,
> >> String attr){
> >> try {
> >> int index = fs.getAttributeIndex(attr);
> >> return (index>=0);
> >> } catch (RuntimeException e) {
> >> return false;
> >> }
> >> }
> >>
> >> public PirolFeatureCollection addAttributeToFeatureCollection( String
> >> attr, AttributeType at, Object defaultVal ){
> >> if (this.fc != null)
> >> return FeatureCollectionTools.addAttributeToFeatureCollection(
> >> this.fc, attr, at, defaultVal, true );
> >> return null;
> >> }
> >>
> >> public static boolean isAttributeTypeNumeric( AttributeType at ){
> >> return ( at.equals(AttributeType.DOUBLE) ||
> >> at.equals(AttributeType.INTEGER) );
> >> }
> >>
> >> /**
> >> * Method to apply a given formula to the given, new attribute of the
> >> given featureCollection
> >> [EMAIL PROTECTED] oldFc old FeatureCollection that will be replaced by
> >> the new one
> >> [EMAIL PROTECTED] attrInfo information for the new attribute
> >> [EMAIL PROTECTED] formula the parsed formula
> >> [EMAIL PROTECTED] FeatureCollection containing the new attribute
> >> */
> >> public static PirolFeatureCollection applyFormulaToFeatureCollection(
> >> FeatureCollection oldFc, AttributeInfo attrInfo, FormulaValue formula,
> >> boolean clearOldFeatureCollection ){
> >>
> >> PirolFeatureCollection newFc =
> >> FeatureCollectionTools.addAttributeToFeatureCollection( oldFc, attrInfo,
> >> clearOldFeatureCollection );
> >>
> >> Feature[] features = (Feature[])newFc.getFeatures().toArray(new
> >> Feature[0]);
> >> Feature feat;
> >> int numFeats = features.length, attrInd =
> >> newFc.getFeatureSchema().getAttributeIndex(attrInfo.getUniqueAttributeName());
> >>
> >> for (int i=0; i<numFeats; i++){
> >> feat = features[i];
> >> feat.setAttribute(attrInd, new Double(formula.getValue(feat)));
> >>
> >> if (i%500 == 0)
> >> logger.printDebug("done: " + i);
> >> }
> >> return newFc;
> >> }
> >>
> >> public static PirolFeatureCollection addAttributeToFeatureCollection(
> >> FeatureCollection fc, AttributeInfo attrInfo ){
> >> return FeatureCollectionTools.addAttributeToFeatureCollection(fc,
> >> attrInfo.getUniqueAttributeName(), attrInfo.getAttributeType(),
> >> attrInfo.getNullValue(), true);
> >> }
> >>
> >> public static PirolFeatureCollection addAttributeToFeatureCollection(
> >> FeatureCollection fc, AttributeInfo attrInfo, boolean
> >> clearOldFeatureCollection ){
> >> return FeatureCollectionTools.addAttributeToFeatureCollection(fc,
> >> attrInfo.getUniqueAttributeName(), attrInfo.getAttributeType(),
> >> attrInfo.getNullValue(), clearOldFeatureCollection);
> >> }
> >>
> >> /**
> >> * Method to add a new attribute to an existing FeatureCollection.
> >> Since there is no "legal" way to
> >> * add an attribute to a FeatureCollection, this method creates (and
> >> returns) a new FeatureCollection with a new
> >> * FeatureSchema to do this operation. If a layer is to be manipulated
> >> the new FeatureCollection has to be set
> >> * as THE FeatureCollection for the layer...
> >> [EMAIL PROTECTED] fc the old feature collection
> >> [EMAIL PROTECTED] attr name of the new attribute
> >> [EMAIL PROTECTED] at type of the new attribute
> >> [EMAIL PROTECTED] defaultVal the initial value for the attribute,
> >> since we do not want NULL values in the attribute table
> >> [EMAIL PROTECTED] clearOldFeatureCollection if true the old feature
> >> collection will be erased to save RAM
> >> [EMAIL PROTECTED] new FeatureCollection with a new FeatureSchema
> >> including the new attribute
> >> */
> >> public static PirolFeatureCollection addAttributeToFeatureCollection(
> >> FeatureCollection fc, String attr, AttributeType at, Object defaultVal,
> >> boolean clearOldFeatureCollection ){
> >> FeatureSchema fs = (FeatureSchema)fc.getFeatureSchema().clone();
> >> fs.addAttribute(attr,at);
> >>
> >> MetaInformationHandler mih = new
> >> MetaInformationHandler(MetaInformationHandler.createPirolFeatureCollection(fc));
> >>
> >> PirolFeatureCollection newFc =
> >> MetaInformationHandler.createPirolFeatureCollection(new
> >> FeatureDataset(fs));
> >>
> >> if (mih.containsMetaInformation()){
> >> newFc.setMetaInformation(mih.getExistentMetaInformationMap());
> >> }
> >> mih = null;
> >>
> >> Feature feat, newFeat;
> >>
> >> if (at.equals(AttributeType.INTEGER)){
> >> if (Double.class.isInstance(defaultVal)){
> >> defaultVal = new Integer( ((Double)defaultVal).intValue() );
> >> }
> >> }
> >>
> >> Feature[] featArray = (Feature[])fc.getFeatures().toArray(new
> >> Feature[0]);
> >>
> >> if (clearOldFeatureCollection)
> >> fc.clear();
> >>
> >> int featuresDone = 0;
> >>
> >> for ( int i=featArray.length-1; i>=0; i--, featuresDone++ ){
> >> feat = featArray[i];
> >>
> >> newFeat =
> >> FeatureCollectionTools.copyFeatureAndSetFeatureSchema(feat,fs);
> >> newFeat.setAttribute(attr, defaultVal);
> >> newFc.add(newFeat);
> >>
> >> if (i%10000 == 0 && i!=0){
> >> featArray =
> >> (Feature[])FeatureCollectionTools.resizeArray(featArray, featArray.length
> >> - featuresDone);
> >> featuresDone = 0;
> >> if (i%50000 == 0){
> >> System.gc();
> >> }
> >> }
> >> }
> >>
> >> featArray = null;
> >>
> >> return newFc;
> >> }
> >>
> >> /**
> >> * Method to add a new attribute to an existing FeatureCollection.
> >> Since there is no "legal" way to
> >> * add an attribute to a FeatureCollection, this method creates (and
> >> returns) a new FeatureCollection with a new
> >> * FeatureSchema to do this operation. If a layer is to be manipulated
> >> the new FeatureCollection has to be set
> >> * as THE FeatureCollection for the layer...
> >> [EMAIL PROTECTED] fc the old feature collection
> >> [EMAIL PROTECTED] attr name of the new attribute
> >> [EMAIL PROTECTED] at type of the new attribute
> >> [EMAIL PROTECTED] defaultVal the initial value for the attribute,
> >> since we do not want NULL values in the attribute table
> >> [EMAIL PROTECTED] new FeatureCollection with a new FeatureSchema
> >> including the new attribute
> >> */
> >> public static PirolFeatureCollection addAttributeToFeatureCollection(
> >> FeatureCollection fc, String attr, AttributeType at, Object defaultVal ){
> >> return FeatureCollectionTools.addAttributeToFeatureCollection(fc,
> >> attr, at, defaultVal, true);
> >> }
> >>
> >> /**
> >> * Adds multiple attributes to the FeatureCollection
> >> [EMAIL PROTECTED] attributeInfos list containing the attributes (as
> >> AttributeInfo objects) to be added
> >> [EMAIL PROTECTED] a new FeatureCollection containing the old and the
> >> new attributes
> >> *
> >> [EMAIL PROTECTED] AttributeInfo
> >> */
> >> public PirolFeatureCollection addAttributesToFeatureCollection( List
> >> attributeInfos ){
> >> return
> >> FeatureCollectionTools.addAttributesToFeatureCollection(this.fc,
> >> attributeInfos);
> >> }
> >>
> >> /**
> >> * Adds multiple attributes to a FeatureCollection
> >> [EMAIL PROTECTED] fc the source feature collection
> >> [EMAIL PROTECTED] attributeInfos list containing the attributes (as
> >> AttributeInfo objects) to be added
> >> [EMAIL PROTECTED] a new FeatureCollection containing the old and the
> >> new attributes
> >> *
> >> [EMAIL PROTECTED] AttributeInfo
> >> */
> >> public static PirolFeatureCollection addAttributesToFeatureCollection(
> >> FeatureCollection fc, List<AttributeInfo> attributeInfos ){
> >> return FeatureCollectionTools.addAttributesToFeatureCollection(fc,
> >> (AttributeInfo[])attributeInfos.toArray(new AttributeInfo[0]));
> >> }
> >>
> >> public static PirolFeatureCollection addAttributesToFeatureCollection(
> >> FeatureCollection fc, AttributeInfo[] attributeInfos ){
> >> return FeatureCollectionTools.addAttributesToFeatureCollection(fc,
> >> attributeInfos, true);
> >> }
> >>
> >> /**
> >> * Adds multiple attributes to a FeatureCollection
> >> [EMAIL PROTECTED] fc the source feature collection
> >> [EMAIL PROTECTED] attributeInfos array containing the attributes to be
> >> added
> >> [EMAIL PROTECTED] clearOriginalFeatureCollection set true, if you want
> >> to save RAM by
> >> *clearing the original FeatureCollection, false if you still want to
> >> use it.
> >> [EMAIL PROTECTED] a new FeatureCollection containing the old and the
> >> new attributes
> >> */
> >> public static PirolFeatureCollection addAttributesToFeatureCollection(
> >> FeatureCollection fc, AttributeInfo[] attributeInfos, boolean
> >> clearOriginalFeatureCollection ){
> >> FeatureSchema fs = (FeatureSchema)fc.getFeatureSchema().clone();
> >>
> >> MetaInformationHandler mih = new
> >> MetaInformationHandler(MetaInformationHandler.createPirolFeatureCollection(fc));
> >>
> >>
> >> AttributeInfo attrInfo;
> >>
> >> for (int i=0; i<attributeInfos.length; i++){
> >> attrInfo = attributeInfos[i];
> >> fs.addAttribute(attrInfo.getUniqueAttributeName(),
> >> attrInfo.getAttributeType());
> >> }
> >>
> >> PirolFeatureCollection newFc =
> >> MetaInformationHandler.createPirolFeatureCollection(new
> >> FeatureDataset(fs));
> >>
> >> if (mih.containsMetaInformation()){
> >> newFc.setMetaInformation(mih.getExistentMetaInformationMap());
> >> }
> >> mih = null;
> >>
> >> Feature feat, newFeat;
> >>
> >> Feature[] featArray = (Feature[])fc.getFeatures().toArray(new
> >> Feature[0]);
> >>
> >> if (clearOriginalFeatureCollection)
> >> fc.clear();
> >>
> >> int featuresDone = 0;
> >>
> >> for ( int i=featArray.length-1; i>=0; i--, featuresDone++ ){
> >> feat = featArray[i];
> >>
> >> newFeat =
> >> FeatureCollectionTools.copyFeatureAndSetFeatureSchema(feat,fs);
> >>
> >>
> >> for (int j=0; j<attributeInfos.length; j++){
> >> attrInfo = attributeInfos[j];
> >> newFeat.setAttribute(attrInfo.getUniqueAttributeName(),
> >> attrInfo.getNullValue());
> >> }
> >>
> >> newFc.add(newFeat);
> >>
> >> if (i%10000 == 0 && i!=0){
> >> featArray =
> >> (Feature[])FeatureCollectionTools.resizeArray(featArray, featArray.length
> >> - featuresDone);
> >> featuresDone = 0;
> >> if (i%50000 == 0){
> >> System.gc();
> >> }
> >> logger.printDebug("adding attribute, features left to do "
> >> + i);
> >> }
> >> }
> >> featArray = null;
> >>
> >> return newFc;
> >> }
> >>
> >> /**
> >> * Reallocates an array with a new size, and copies the contents
> >> * of the old array to the new array.
> >> * @param oldArray the old array, to be reallocated.
> >> * @param newSize the new array size.
> >> * @return A new array with the same contents.
> >> */
> >> public static Object resizeArray (Object oldArray, int newSize) {
> >> int oldSize = java.lang.reflect.Array.getLength(oldArray);
> >> Class elementType = oldArray.getClass().getComponentType();
> >> Object newArray = java.lang.reflect.Array.newInstance(
> >> elementType,newSize);
> >> int preserveLength = Math.min(oldSize,newSize);
> >> if (preserveLength > 0)
> >> System.arraycopy (oldArray,0,newArray,0,preserveLength);
> >> return newArray;
> >> }
> >>
> >> public static double[] getMinMaxAttributeValue( Feature[] featArray,
> >> FeatureSchema fs, String attr ){
> >> double[] minmax = new double[]{ Double.MAX_VALUE, -Double.MAX_VALUE
> >> };
> >>
> >>
> >> if (fs.getAttributeType(attr) == AttributeType.INTEGER ||
> >> fs.getAttributeType(attr) == AttributeType.DOUBLE){
> >>
> >> Feature feat;
> >> double value;
> >>
> >> for ( int i=featArray.length-1; i>=0; i-- ){
> >> feat = featArray[i];
> >>
> >> if (feat.getAttribute(attr) != null){
> >> value =
> >> ObjectComparator.getDoubleValue(feat.getAttribute(attr));
> >>
> >> if (value<minmax[0]){
> >> minmax[0] = value;
> >> }
> >> if (value>minmax[1]){
> >> minmax[1] = value;
> >> }
> >> } else {
> >> FeatureCollectionTools.logger.printMinorError("skipped
> >> value (NULL), when checking min./max. values for Attribute " + attr);
> >> }
> >> }
> >> }
> >>
> >> return minmax;
> >> }
> >>
> >> public static double[] getMinMaxAttributeValue( FeatureCollection
> >> features, String attr ){
> >> return
> >> FeatureCollectionTools.getMinMaxAttributeValue(FeatureCollectionTools.FeatureCollection2FeatureArray(features),
> >> features.getFeatureSchema(), attr);
> >> }
> >>
> >>
> >> /**
> >> * Converts a given FeatureCollection into an array of Feature, that
> >> can - by far - be faster iterated.
> >> [EMAIL PROTECTED] fc the feature Collection
> >> [EMAIL PROTECTED] an array of the features of the feature collection
> >> */
> >> public static Feature[] FeatureCollection2FeatureArray(
> >> FeatureCollection fc ){
> >> return (Feature[])fc.getFeatures().toArray(new Feature[0]);
> >> }
> >>
> >> /**
> >> * Converts a given list of features into an array of Feature, that can
> >> - by far - be faster iterated.
> >> [EMAIL PROTECTED] features list of features
> >> [EMAIL PROTECTED] an array of the features of the feature list
> >> */
> >> public static Feature[] FeatureCollection2FeatureArray( List<Feature>
> >> features ){
> >> return (Feature[])features.toArray(new Feature[0]);
> >> }
> >> }
> >>
> >> -------------------------------------------------------------------------
> >> This SF.net email is sponsored by: Splunk Inc.
> >> Still grepping through log files to find problems? Stop.
> >> Now Search log events and configuration files using AJAX and a browser.
> >> Download your FREE copy of Splunk now >> http://get.splunk.com/
> >> _______________________________________________
> >> Jump-pilot-devel mailing list
> >> [email protected]
> >> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel
> >>
> >>
> >
> > -------------------------------------------------------------------------
> > This SF.net email is sponsored by: Splunk Inc.
> > Still grepping through log files to find problems? Stop.
> > Now Search log events and configuration files using AJAX and a browser.
> > Download your FREE copy of Splunk now >> http://get.splunk.com/
> > _______________________________________________
> > Jump-pilot-devel mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel
> >
> >
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems? Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >> http://get.splunk.com/
> _______________________________________________
> Jump-pilot-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Jump-pilot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel