Package com.orci.geotools.data.LineMergerPostgis

Source Code of com.orci.geotools.data.LineMergerPostgis.LineMergerFeatureReader

package com.orci.geotools.data.LineMergerPostgis;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.logging.Logger;

import org.geotools.data.FeatureReader;
import org.geotools.feature.Feature;
import org.geotools.feature.FeatureType;
import org.geotools.feature.IllegalAttributeException;

import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.operation.linemerge.LineMerger;

/**
* This class is used to create OpenTMSDataStore objects
* Copyright (c) 2005, Open Roads Consulting, Inc.
*/
public class LineMergerFeatureReader implements FeatureReader {
    private static final Logger LOG = org.geotools.util.logging.Logging.getLogger(LineMergerFeatureReader.class.getName());
   
    protected FeatureReader baseFeatureReader;
    protected String featureUniqueKey;
   
    protected Map<String, Feature> uniqueFeatureMap = new HashMap<String, Feature>();
    protected Map<String, LineMerger> uniqueFeatureMerger = new HashMap<String, LineMerger>();
    protected Iterator<Feature> featureIterator;
   
    /**
     * Constructor.
     * @param baseFeatureReader the base feature reader
     * @param featureUniqueKey the key attribute
     */
    public LineMergerFeatureReader(FeatureReader baseFeatureReader, String featureUniqueKey) {
        this.baseFeatureReader = baseFeatureReader;
        this.featureUniqueKey = featureUniqueKey;
       
        // read and merge the features
        try {
            while (baseFeatureReader.hasNext()) {
                try {
                    Feature feature = baseFeatureReader.next();
                    String uniqueKey = (String)feature.getAttribute(featureUniqueKey);
                    //LOG.info("Read feature " + featureUniqueKey + ": " + uniqueKey);
                    if (!uniqueFeatureMap.containsKey(uniqueKey)) uniqueFeatureMap.put(uniqueKey, feature);
                    if (!uniqueFeatureMerger.containsKey(uniqueKey)) uniqueFeatureMerger.put(uniqueKey, new LineMerger());
                    LineMerger merger = uniqueFeatureMerger.get(uniqueKey);
                    merger.add(feature.getDefaultGeometry());
                } catch (NoSuchElementException e) {
                    LOG.warning("Error reading feature: " + e);
                } catch (IllegalAttributeException e) {
                    LOG.warning("Error reading feature: " + e);
                }
            }
        } catch (IOException e) {
            LOG.warning("Error reading features: " + e);
        }
        for (String uniqueKey : uniqueFeatureMerger.keySet()) {
            //LOG.info("Get merged: " + uniqueKey);
            Feature feature = uniqueFeatureMap.get(uniqueKey);
            LineMerger merger = uniqueFeatureMerger.get(uniqueKey);
            try {
                feature.setDefaultGeometry(new MultiLineString((LineString[])merger.getMergedLineStrings().toArray(new LineString[0]), feature.getDefaultGeometry().getFactory()));
            } catch (IllegalAttributeException e) {
                LOG.warning("Prolem setting new geometry: " + e);
            }
        }
        //LOG.info("Features="+uniqueFeatureMap.size());
        featureIterator = uniqueFeatureMap.values().iterator();
    }

    /**
     * {@inheritDoc}
     */
    public void close() throws IOException {
        if (baseFeatureReader != null) baseFeatureReader.close();
    }

    /**
     * {@inheritDoc}
     */
    public FeatureType getFeatureType() {
        return (baseFeatureReader != null) ? baseFeatureReader.getFeatureType() : null;
    }

    /**
     * {@inheritDoc}
     */
    public boolean hasNext() throws IOException {
        return featureIterator.hasNext();
    }

    /**
     * {@inheritDoc}
     */
    public Feature next() throws IOException, IllegalAttributeException {
        return featureIterator.next();
    }

}
TOP

Related Classes of com.orci.geotools.data.LineMergerPostgis.LineMergerFeatureReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.