/*************************************************************** Copyright (C) 2012,2013 by 52 North Initiative for Geospatial Open Source Software GmbH Contact: Andreas Wytzisk 52 North Initiative for Geospatial Open Source Software GmbH Martin-Luther-King-Weg 24 48155 Muenster, Germany info@52north.org This program is free software; you can redistribute and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed WITHOUT ANY WARRANTY; even without the implied WARRANTY OF MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program (see gnu-gpl v2.txt). If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA or visit the Free Software Foundation web page, http://www.fsf.org. ***************************************************************/ package org.n52.wps.ags.workspace; import java.io.File; import java.io.IOException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import com.esri.arcgis.datasourcesfile.ShapefileWorkspaceFactory; import com.esri.arcgis.geodatabase.IFeature; import com.esri.arcgis.geodatabase.IFeatureClass; import com.esri.arcgis.geodatabase.IFeatureCursor; import com.esri.arcgis.geodatabase.Workspace; import com.esri.arcgis.geometry.GeometryBag; import com.esri.arcgis.geometry.IEnumGeometry; import com.esri.arcgis.geometry.IGeometry; import com.esri.arcgis.geometry.IGeometryCollection; import com.esri.arcgis.geometry.IRelationalOperator; import com.esri.arcgis.geometry.ITopologicalOperator; import com.esri.arcgis.geometry.Polygon; import com.esri.arcgis.geoprocessing.GeoProcessor; import com.esri.arcgis.geoprocessing.IGeoProcessorResult; import com.esri.arcgis.interop.AutomationException; import com.esri.arcgis.server.IServerConnection; import com.esri.arcgis.server.IServerContext; import com.esri.arcgis.server.IServerObjectManager; import com.esri.arcgis.server.ServerConnection; import com.esri.arcgis.system.IVariantArray; import com.esri.arcgis.system.ServerInitializer; import com.esri.arcgis.system.VarArray; public class AGSProcessTest { private static final Logger logger = LoggerFactory.getLogger(AGSProcessTest.class.getName()); private static String domain = "gin-rieke"; private static String user = "arcgismanager"; // arcgismanager account private static String password = "2asdf3"; // arcgismanager password private static String host = "localhost"; private static File workspaceDirectory = new File("C:/arcgisserver/wpsBackendDirectory"); private String toolname; private String[] params; private IServerObjectManager som; private IServerContext context; public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException { AGSProcessTest tester = new AGSProcessTest(); tester.initializeServerContext(); tester.testIntersectAnalysis(); tester.testClipAnalysis(); tester.testBufferAnalysis(); tester.createFeatureClassWorkspace(); } public AGSProcessTest() { createServerObjects(); } private void testIntersectAnalysis() { configureForIntersect(); launchProcessor(); } private void testBufferAnalysis() { configureForBuffer(); launchProcessor(); } private void testClipAnalysis() { configureForClip(); launchProcessor(); } private IGeoProcessorResult launchProcessor() { logger.info("Execute tool (\"" + toolname + "\"):"); for (int i = 0; i < params.length; i++){ logger.info(" Input " + i + ": " + params[i]); } return executeProcess(toolname, params); } private IGeoProcessorResult executeProcess(String toolname2, String[] params2) { IVariantArray fParams = null; try { // IServerContext context = initializeServerContext(); fParams = (VarArray)(context.createObject(VarArray.getClsid())); } catch (AutomationException e) { logger.log(Level.WARNING, e.getMessage(), e); } catch (IOException e) { logger.log(Level.WARNING, e.getMessage(), e); } for (int i = 0; i < params.length; i++) { try { fParams.add(params2[i]); } catch (AutomationException e) { logger.log(Level.WARNING, e.getMessage(), e); } catch (IOException e) { logger.log(Level.WARNING, e.getMessage(), e); } } IGeoProcessorResult result = null; try { IServerContext context = initializeServerContext(); result = initiliazeGeoProcesser(context).execute(toolname, fParams, null); context.releaseContext(); } catch (Exception e) { logger.log(Level.WARNING, e.getMessage(), e); } return result; } private IServerContext initializeServerContext() throws AutomationException, IOException { context = som.createServerContext("", ""); return context; } private void configureForIntersect() { toolname = "Intersect_analysis"; File inputFeature1 = new File(workspaceDirectory, "feature1.shp"); File inputFeature2 = new File(workspaceDirectory, "feature2.shp"); File outputFeature = new File(workspaceDirectory, "intersect1.shp"); if (!inputFeature1.exists()) { throw new IllegalStateException("File not found: "+inputFeature1.getAbsolutePath()); } if (!inputFeature2.exists()) { throw new IllegalStateException("File not found: "+inputFeature2.getAbsolutePath()); } params = new String[2]; params[0] = inputFeature1.getAbsolutePath() +" ; "+ inputFeature2.getAbsolutePath(); params[1] = outputFeature.getAbsolutePath(); } private void configureForClip() { toolname = "Clip_analysis"; File inputFeature1 = new File(workspaceDirectory, "feature1.shp"); File inputFeature2 = new File(workspaceDirectory, "feature2.shp"); File outputFeature = new File(workspaceDirectory, "clip1.shp"); if (!inputFeature1.exists()) { throw new IllegalStateException("File not found: "+inputFeature1.getAbsolutePath()); } if (!inputFeature2.exists()) { throw new IllegalStateException("File not found: "+inputFeature2.getAbsolutePath()); } params = new String[3]; params[0] = inputFeature1.getAbsolutePath(); params[1] = inputFeature2.getAbsolutePath(); params[2] = outputFeature.getAbsolutePath(); } private void configureForBuffer() { toolname = "Buffer_analysis"; File inputFeature1 = new File(workspaceDirectory, "feature1.shp"); File outputFeature = new File(workspaceDirectory, "buffer1.shp"); if (!inputFeature1.exists()) { throw new IllegalStateException("File not found: "+inputFeature1.getAbsolutePath()); } params = new String[3]; params[0] = inputFeature1.getAbsolutePath(); params[1] = outputFeature.getAbsolutePath(); params[2] = "0.05"; } private void createServerObjects() { ServerInitializer serverInitializer = new ServerInitializer(); serverInitializer.initializeServer(domain, user, password); IServerConnection connection = null; try { connection = new ServerConnection(); connection.connect(host); } catch (UnknownHostException e) { logger.log(Level.WARNING, e.getMessage(), e); } catch (IOException e) { logger.log(Level.WARNING, e.getMessage(), e); } logger.info("Connected to server."); try { som = connection.getServerObjectManager(); } catch (AutomationException e) { logger.log(Level.WARNING, e.getMessage(), e); } catch (IOException e) { logger.log(Level.WARNING, e.getMessage(), e); } } private GeoProcessor initiliazeGeoProcesser(IServerContext context) throws AutomationException, IOException { GeoProcessor gp = (GeoProcessor) context.createObject(GeoProcessor.getClsid()); gp.setOverwriteOutput(true); return gp; } private ShapefileWorkspaceFactory initializeShapefileWorkspace(IServerContext context) throws AutomationException, IOException { return (ShapefileWorkspaceFactory) context.createObject(ShapefileWorkspaceFactory.getClsid()); } private void createFeatureClassWorkspace() throws AutomationException, IOException { File inputFeature1 = new File(workspaceDirectory, "feature1.shp"); File inputFeature2 = new File(workspaceDirectory, "feature2.shp"); System.out.println(intersects(inputFeature1, inputFeature2)); } private boolean intersects(File inputFeature1, File inputFeature2) throws AutomationException, IOException { IRelationalOperator geom1 = resolveGeometryFromShapefile(inputFeature1); IRelationalOperator geom2 = resolveGeometryFromShapefile(inputFeature2); return !geom1.disjoint((IGeometry) geom2); } private IRelationalOperator resolveGeometryFromShapefile(File inputFeature1) throws AutomationException, IOException { // IServerContext context = initializeServerContext(); String name = inputFeature1.getName(); Workspace srcWorkspace = new Workspace(initializeShapefileWorkspace(context).openFromFile(inputFeature1.getParent(), 0)); IFeatureClass srcFeatureClass = srcWorkspace.openFeatureClass(removeFileExtension(name)); System.out.println(srcFeatureClass.getShapeFieldName()); IFeatureCursor cur = srcFeatureClass.search(null, false); IFeature feature = cur.nextFeature(); List<IGeometry> geometries = new ArrayList<IGeometry>(); while (feature != null) { System.out.println(feature.getShape().getGeometryType()); System.out.println(feature.getShape().getEnvelope().getLowerLeft().getX()); feature = cur.nextFeature(); } ITopologicalOperator resultPolygon = (ITopologicalOperator) context.createObject(Polygon.getClsid()); IGeometryCollection geometriesToUnion = (IGeometryCollection) context.createObject(GeometryBag.getClsid()); for (IGeometry geom : geometries) { geometriesToUnion.addGeometry(geom, null, null); } resultPolygon.constructUnion((IEnumGeometry) geometriesToUnion); return (IRelationalOperator) resultPolygon; } private String removeFileExtension(String name) { int index = name.lastIndexOf("."); return name.substring(0, index); } }