/*************************************************************** Copyright (C) 2009-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.feature; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.n52.wps.ags.workspace.ServerContextFactory; import org.n52.wps.ags.workspace.ServerContextFactory.LockedServerContext; 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; /** * Convenience class to provide access to features * stored in a shapefile. * * @author matthes rieke, Matthias Mueller, TU Dresden; Christin Henzen, TU Dresden * */ public class FeatureAccess { private LockedServerContext context; public FeatureAccess() throws IOException { this.context = ServerContextFactory.retrieveContext(); } public IRelationalOperator resolveRelationalOperatorFromShapefile(File inputFeature) throws IOException { IGeometry result = resolveGeometryFromShapefile(inputFeature); if (result instanceof IRelationalOperator) { return (IRelationalOperator) result; } return null; } public IGeometry resolveGeometryFromShapefile(File inputFeature) throws IOException { String name = inputFeature.getName(); ShapefileWorkspaceFactory shpWorkspace = (ShapefileWorkspaceFactory) this.context.getContext().createObject( ShapefileWorkspaceFactory.getClsid()); Workspace srcWorkspace = new Workspace(shpWorkspace.openFromFile(inputFeature.getParent(), 0)); IFeatureClass srcFeatureClass = srcWorkspace.openFeatureClass(removeFileExtension(name)); List<IGeometry> geometries = resolveGeometriesFromFeatureClass(srcFeatureClass); if (geometries.size() == 1) return geometries.get(0); return (IGeometry) createUnionFromGeometries(geometries); } private List<IGeometry> resolveGeometriesFromFeatureClass(IFeatureClass srcFeatureClass) throws IOException { ArrayList<IGeometry> result = new ArrayList<IGeometry>(); IFeatureCursor cur = srcFeatureClass.search(null, false); IFeature feature = cur.nextFeature(); while (feature != null) { result.add(feature.getShape()); feature = cur.nextFeature(); } return result; } private IGeometry createUnionFromGeometries(List<IGeometry> geometries) throws IOException { ITopologicalOperator resultPolygon = (ITopologicalOperator) this.context.getContext().createObject(Polygon.getClsid()); IGeometryCollection geometriesToUnion = (IGeometryCollection) this.context.getContext().createObject(GeometryBag.getClsid()); for (IGeometry geom : geometries) { geometriesToUnion.addGeometry(geom, null, null); } resultPolygon.constructUnion((IEnumGeometry) geometriesToUnion); return (IGeometry) resultPolygon; } private String removeFileExtension(String name) { int index = name.lastIndexOf("."); return name.substring(0, index); } public void releaseContext() { ServerContextFactory.returnContext(this.context); } }