net.refractions.udig.transformtool.LayerTransform.java Source code

Java tutorial

Introduction

Here is the source code for net.refractions.udig.transformtool.LayerTransform.java

Source

/*
 *    uDig - User Friendly Desktop Internet GIS client
 *    http://udig.refractions.net
 *    (C) 2004, Refractions Research Inc.
 *
 *    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;
 *    version 2.1 of the License.
 *
 *    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.
 *
 */
package net.refractions.udig.transformtool;

import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.Iterator;

import net.refractions.udig.catalog.IGeoResource;
import net.refractions.udig.project.internal.Map;
import net.refractions.udig.project.internal.impl.LayerImpl;
import net.refractions.udig.project.ui.ApplicationGIS;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.geotools.data.FeatureSource;
import org.geotools.data.FeatureStore;
import org.geotools.data.memory.MemoryFeatureCollection;
import org.geotools.feature.Feature;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.SimpleFeature;
import org.geotools.feature.SimpleFeatureType;
import org.opengis.referencing.operation.MathTransform;

/**
 * The transformation is made here.
 *
 * @author jezekjan
 */
public class LayerTransform implements IRunnableWithProgress {
    LayerImpl sourceLayer;
    MathTransform transform;

    LayerTransform(LayerImpl sourceLayer, MathTransform transform) {
        this.sourceLayer = sourceLayer;
        this.transform = transform;
    }

    /**
     * Transforms the {@link #sourceLayer} by {@link #transform}.
     *
     * @param monitor
     *
     * @throws InvocationTargetException
     * @throws InterruptedException
     */
    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        try {
            FeatureSource source = (FeatureSource) sourceLayer.getResource(FeatureSource.class, null);

            FeatureCollection collection = new MemoryFeatureCollection(source.getSchema());

            Iterator ii = source.getFeatures().iterator();
            monitor.beginTask("Transforming...", source.getFeatures().size());

            TransformFilter tf = new TransformFilter(transform);
            Map map = (Map) ApplicationGIS.getActiveMap();
            monitor.subTask("Applying specified transformation...");
            collection.addAll(source.getFeatures());
            for (Iterator j = collection.iterator(); j.hasNext();) {
                ((Feature) j.next()).getDefaultGeometry().apply(tf);
                monitor.worked(1);

                /*
                 * monitor.subTask("Transforming " + i + ". of " +
                 * source.getFeatures().size() + " features."); i++;
                 */
                if (monitor.isCanceled()) {
                    throw new InterruptedException("The transformation operation was cancelled.");
                }
            }

            monitor.subTask("Adding features to new layer...");
            IGeoResource resource = (new DialogUtility()).createResource(sourceLayer.getName() + "_trans",
                    sourceLayer.getSchema().getAttributeTypes());
            resource.resolve(FeatureStore.class, null).addFeatures(collection);
            ApplicationGIS.addLayersToMap(map, Collections.singletonList(resource), 0);

            monitor.done();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}