Package org.locationtech.udig.tools.jgrass.profile

Source Code of org.locationtech.udig.tools.jgrass.profile.FeatureOnCoverageProfileOperation

/*
* uDig - User Friendly Desktop Internet GIS client
* (C) HydroloGIS - www.hydrologis.com
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* (http://www.eclipse.org/legal/epl-v10.html), and the HydroloGIS BSD
* License v1.0 (http://udig.refractions.net/files/hsd3-v10.html).
*/
package org.locationtech.udig.tools.jgrass.profile;

import static java.lang.Math.abs;

import java.util.ArrayList;
import java.util.List;

import org.locationtech.udig.catalog.IGeoResource;
import org.locationtech.udig.project.ILayer;
import org.locationtech.udig.style.sld.SLD;
import org.locationtech.udig.ui.ExceptionDetailsDialog;
import org.locationtech.udig.ui.operations.IOp;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.data.FeatureSource;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.opengis.coverage.grid.GridCoverage;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.type.GeometryDescriptor;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;

import org.locationtech.udig.tools.jgrass.JGrassToolsPlugin;
import org.locationtech.udig.tools.jgrass.profile.borrowedfromjgrasstools.CoverageUtilities;
import org.locationtech.udig.tools.jgrass.profile.borrowedfromjgrasstools.ProfilePoint;
import org.locationtech.udig.tools.jgrass.profile.borrowedfromjgrasstools.RegionMap;

/**
* Operation to create a profile of a line feature over a coverage.
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public class FeatureOnCoverageProfileOperation implements IOp {
    private ProfileView chartView;
    private GridCoverage2D coverage = null;
    private SimpleFeature lineFeature = null;
    private double step;

    public void op( final Display display, Object target, IProgressMonitor monitor ) throws Exception {
        ILayer[] layers = (ILayer[]) target;

        for( ILayer iLayer : layers ) {
            final IGeoResource geoResource = iLayer.getGeoResource();
            if (geoResource.canResolve(FeatureSource.class)) {
                SimpleFeatureSource lineSource = (SimpleFeatureSource) geoResource.resolve(FeatureSource.class, monitor);
                SimpleFeatureCollection featureCollection = lineSource.getFeatures(iLayer.getFilter());
                GeometryDescriptor geometryDescriptor = featureCollection.getSchema().getGeometryDescriptor();
                if (!SLD.isLine(geometryDescriptor)) {
                    break;
                }
                SimpleFeatureIterator featureIterator = featureCollection.features();
                if (featureIterator.hasNext()) {
                    lineFeature = featureIterator.next();
                }

            }
            if (geoResource.canResolve(GridCoverage.class)) {
                coverage = (GridCoverage2D) geoResource.resolve(GridCoverage.class, monitor);
                RegionMap regionMap = CoverageUtilities.getRegionParamsFromGridCoverage(coverage);
                double xres = regionMap.getXres();
                double yres = regionMap.getYres();
                step = Math.min(xres, yres);
            }
        }

        if (lineFeature == null || coverage == null) {
            display.asyncExec(new Runnable(){
                public void run() {
                    MessageDialog.openWarning(display.getActiveShell(), "Wrong layers error",
                            "This operation works only if a line layer and a coverage layer are selected in the layers view.");
                }
            });
            return;
        }
        display.syncExec(new Runnable(){
            public void run() {
                try {
                    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(ProfileView.ID);
                    chartView = ((ProfileView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                            .findView(ProfileView.ID));
                    chartView.clearSeries();
                    chartView.clearMarkers();

                    Geometry geometry = (Geometry) lineFeature.getDefaultGeometry();
                    Coordinate[] coordinates = geometry.getCoordinates();

                    List<ProfilePoint> profile = CoverageUtilities.doProfile(coverage, step, coordinates);

                    for( ProfilePoint profilePoint : profile ) {
                        double elevation = profilePoint.getElevation();
                        if (!Double.isNaN(elevation)) {
                            chartView.addToSeries(profilePoint.getProgressive(), elevation);
                        } else {
                            chartView.addToSeries(profilePoint.getProgressive(), 0.0);
                        }
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    String message = "An error occurred while extracting the profile data";
                    ExceptionDetailsDialog.openError(null, message, IStatus.ERROR, JGrassToolsPlugin.PLUGIN_ID, e);
                }
            }
        });

    }

}
TOP

Related Classes of org.locationtech.udig.tools.jgrass.profile.FeatureOnCoverageProfileOperation

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.