Java tutorial
/* * JGrass - Free Open Source Java GIS http://www.jgrass.org * (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 eu.udig.catalog.jgrass.operations; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.List; import net.refractions.udig.project.IBlackboard; import net.refractions.udig.project.ILayer; import net.refractions.udig.project.IMap; import net.refractions.udig.project.ui.ApplicationGIS; import net.refractions.udig.ui.ExceptionDetailsDialog; import net.refractions.udig.ui.PlatformGIS; import org.apache.commons.io.FileUtils; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.action.IAction; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowActionDelegate; import org.eclipse.ui.IWorkbenchWindowPulldownDelegate; import org.geotools.gce.grassraster.JGrassConstants; import org.geotools.gce.grassraster.JGrassMapEnvironment; import org.geotools.gce.grassraster.JGrassRegion; import org.geotools.referencing.CRS; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.vividsolutions.jts.geom.Envelope; import eu.udig.catalog.jgrass.JGrassPlugin; import eu.udig.catalog.jgrass.activeregion.ActiveRegionStyle; import eu.udig.catalog.jgrass.activeregion.ActiveregionStyleContent; import eu.udig.catalog.jgrass.core.JGrassMapGeoResource; /** * Action to set the active region to selected maps. * * @author Andrea Antonello (www.hydrologis.com) */ public class SetActiveRegionToMapsAction implements IObjectActionDelegate, IWorkbenchWindowActionDelegate, IWorkbenchWindowPulldownDelegate { IStructuredSelection selection = null; public void setActivePart(IAction action, IWorkbenchPart targetPart) { } public void run(IAction action) { IRunnableWithProgress operation = new IRunnableWithProgress() { public void run(final IProgressMonitor pm) throws InvocationTargetException, InterruptedException { Display.getDefault().syncExec(new Runnable() { public void run() { final List<?> toList = selection.toList(); Envelope bounds = null; try { pm.beginTask("Set active region to maps bounds...", toList.size()); try { JGrassRegion currentRegion = null; JGrassMapEnvironment grassMapEnvironment = null; for (Object object : toList) { if (object instanceof JGrassMapGeoResource) { JGrassMapGeoResource mr = (JGrassMapGeoResource) object; JGrassRegion fileWindow = mr.getFileWindow(); if (currentRegion == null) { currentRegion = mr.getActiveWindow(); grassMapEnvironment = mr.getjGrassMapEnvironment(); } Envelope envelope = fileWindow.getEnvelope(); if (bounds == null) { bounds = envelope; } else { bounds.expandToInclude(envelope); } } pm.worked(1); } String code = null; try { CoordinateReferenceSystem jGrassCrs = grassMapEnvironment .getCoordinateReferenceSystem(); try { Integer epsg = CRS.lookupEpsgCode(jGrassCrs, true); code = "EPSG:" + epsg; } catch (Exception e) { // try non epsg code = CRS.lookupIdentifier(jGrassCrs, true); } } catch (Exception e) { e.printStackTrace(); } JGrassRegion newActiveRegion = JGrassRegion.adaptActiveRegionToEnvelope(bounds, currentRegion); File windFile = grassMapEnvironment.getWIND(); JGrassRegion.writeWINDToMapset(windFile.getParent(), newActiveRegion); IMap activeMap = ApplicationGIS.getActiveMap(); IBlackboard blackboard = activeMap.getBlackboard(); ActiveRegionStyle style = (ActiveRegionStyle) blackboard .get(ActiveregionStyleContent.ID); if (style == null) { style = ActiveregionStyleContent.createDefault(); } style.north = (float) newActiveRegion.getNorth(); style.south = (float) newActiveRegion.getSouth(); style.east = (float) newActiveRegion.getEast(); style.west = (float) newActiveRegion.getWest(); style.rows = newActiveRegion.getRows(); style.cols = newActiveRegion.getCols(); style.windPath = windFile.getAbsolutePath(); style.crsString = code; blackboard.put(ActiveregionStyleContent.ID, style); ILayer activeRegionMapGraphic = JGrassPlugin.getDefault() .getActiveRegionMapGraphic(); activeRegionMapGraphic.refresh(null); } catch (IOException e) { e.printStackTrace(); String message = "Problems occurred while setting the new active region."; ExceptionDetailsDialog.openError("Information", message, IStatus.ERROR, JGrassPlugin.PLUGIN_ID, e); } } finally { pm.done(); } } }); } }; PlatformGIS.runInProgressDialog("Set active region...", true, operation, true); } /** * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, * org.eclipse.jface.viewers.ISelection) */ public void selectionChanged(IAction action, ISelection selection) { if (selection instanceof IStructuredSelection) this.selection = (IStructuredSelection) selection; } /* * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() */ public void dispose() { } /* * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow) */ public void init(IWorkbenchWindow window) { // do nothing } /* * @see org.eclipse.ui.IWorkbenchWindowPulldownDelegate#getMenu(org.eclipse.swt.widgets.Control) */ public Menu getMenu(Control parent) { return null; } /** * Given the mapsetpath and the mapname, the map is removed with all its accessor files * * @param mapsetPath * @param mapName * @throws IOException */ public void removeGrassRasterMap(String mapsetPath, String mapName) throws IOException { // list of files to remove String mappaths[] = filesOfRasterMap(mapsetPath, mapName); // first delete the list above, which are just files for (int j = 0; j < mappaths.length; j++) { File filetoremove = new File(mappaths[j]); if (filetoremove.exists()) { FileUtils.forceDelete(filetoremove); } } } /** * Returns the list of files involved in the raster map issues. If for example a map has to be * deleted, then all these files have to. * * @param mapsetPath - the path of the mapset * @param mapname -the name of the map * @return the array of strings containing the full path to the involved files */ public String[] filesOfRasterMap(String mapsetPath, String mapname) { String filesOfRaster[] = new String[] { mapsetPath + File.separator + JGrassConstants.FCELL + File.separator + mapname, mapsetPath + File.separator + JGrassConstants.CELL + File.separator + mapname, mapsetPath + File.separator + JGrassConstants.CATS + File.separator + mapname, mapsetPath + File.separator + JGrassConstants.HIST + File.separator + mapname, mapsetPath + File.separator + JGrassConstants.CELLHD + File.separator + mapname, mapsetPath + File.separator + JGrassConstants.COLR + File.separator + mapname, // it is very important that the folder cell_misc/mapname comes // before the files in it mapsetPath + File.separator + JGrassConstants.CELL_MISC + File.separator + mapname, mapsetPath + File.separator + JGrassConstants.CELL_MISC + File.separator + mapname + File.separator + JGrassConstants.CELLMISC_FORMAT, mapsetPath + File.separator + JGrassConstants.CELL_MISC + File.separator + mapname + File.separator + JGrassConstants.CELLMISC_QUANT, mapsetPath + File.separator + JGrassConstants.CELL_MISC + File.separator + mapname + File.separator + JGrassConstants.CELLMISC_RANGE, mapsetPath + File.separator + JGrassConstants.CELL_MISC + File.separator + mapname + File.separator + JGrassConstants.CELLMISC_NULL }; return filesOfRaster; } }