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 > >> Jump-pilot-devel@lists.sourceforge.net > >> 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 > > Jump-pilot-devel@lists.sourceforge.net > > 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 > Jump-pilot-devel@lists.sourceforge.net > 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 Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel