Mercurial > dive4elements > gnv-client
diff geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java @ 263:031ef9649cd1
Added SFS-Support to ArcSDE-Query-Part
geo-backend/trunk@210 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Tim Englich <tim.englich@intevation.de> |
---|---|
date | Tue, 13 Oct 2009 08:57:19 +0000 |
parents | 122fdc9da5f0 |
children | 1530890b28c9 |
line wrap: on
line diff
--- a/geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java Wed Oct 07 10:26:33 2009 +0000 +++ b/geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java Tue Oct 13 08:57:19 2009 +0000 @@ -1,7 +1,7 @@ /** * */ - package de.intevation.gnv.geobackend.sde.datasources; + package de.intevation.gnv.geobackend.sde.datasources; import java.sql.Connection; import java.sql.ResultSet; @@ -11,10 +11,22 @@ import org.apache.log4j.Logger; +import com.esri.sde.sdk.client.SDEPoint; import com.esri.sde.sdk.client.SeColumnDefinition; +import com.esri.sde.sdk.client.SeConnection; +import com.esri.sde.sdk.client.SeCoordinateReference; import com.esri.sde.sdk.client.SeException; +import com.esri.sde.sdk.client.SeFilter; +import com.esri.sde.sdk.client.SeLayer; import com.esri.sde.sdk.client.SeQuery; import com.esri.sde.sdk.client.SeRow; +import com.esri.sde.sdk.client.SeShape; +import com.esri.sde.sdk.client.SeShapeFilter; +import com.esri.sde.sdk.client.SeSqlConstruct; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.io.WKTReader; + /** * @author Tim Englich <tim.englich@intevation.de> @@ -111,17 +123,87 @@ */ public ResultSet executeQuery(String statement) throws SQLException { try { - SeQuery query = new SeQuery(this.connection.getSeConnection()); - query.prepareSql(statement); - query.execute(); - return this.handleResultSet(query); - } catch (SeException e) { + SeQuery query = null; + if (statement.toLowerCase().contains("st_astext")){ + + String[] values = statement.toLowerCase().split("where", 2); + String where = values.length > 1 ? values[1].trim() : ""; + values = values[0].split("from", 2); + String layerName = values[1].toUpperCase().trim(); + String[] returnFields = values[0].replaceAll("select", "").trim().split(","); + String geometryColumnName = "N/N"; + for (int i = 0; i < returnFields.length; i++){ + returnFields[i] = returnFields[i].trim(); + if (returnFields[i].startsWith("st_astext(")){ + returnFields[i] = returnFields[i].replaceAll("st_astext", ""); + returnFields[i] = returnFields[i].substring(1, returnFields[i].length()-1); + geometryColumnName = returnFields[i]; + } + } + Geometry g = null; + int pos = where.indexOf("intersects"); + if (pos > 0 ){ + String substr = where.substring(pos); + where = where.substring(0,where.lastIndexOf("and")); // TODO auch or unterstützen + String intersectsStmt = substr.substring(0, substr.lastIndexOf(")")); // Annahme räumliches Stmt steht am Ende + String wkt = intersectsStmt.substring(intersectsStmt.indexOf("\""), intersectsStmt.lastIndexOf("\"")).replace("\"", "").trim(); + g = new WKTReader().read(wkt); + + } + return this.executeQuery(this.connection.getSeConnection(), layerName, geometryColumnName, where, g, returnFields); + }else{ + query = new SeQuery(this.connection.getSeConnection()); + query.prepareSql(statement); + query.execute(); + return this.handleResultSet(query); + } + + } catch (Exception e) { log.error(e,e); throw new SQLException(e.getMessage()); } } + + private ResultSet executeQuery(SeConnection con, String pLayername, + String pSpatialColumnName, String pWhere, + Geometry g, String[] pReturnFields) + throws SQLException { + log.debug("executeQuery()"); + try { + // get the layer for querying + SeLayer lLayer = new SeLayer(con, pLayername, pSpatialColumnName); + SeCoordinateReference cref = lLayer.getCoordRef(); + + SeShape shape = new SeShape(); + shape.setCoordRef(lLayer.getCoordRef()); + SDEPoint[] lPoints = new ArcSDEUtils().createPoints(g); + + shape.generatePolygon(lPoints.length, 1, null, lPoints); + SeShapeFilter filter = new SeShapeFilter(pLayername, + pSpatialColumnName, shape, SeFilter.METHOD_AI); + SeShapeFilter[] filters = new SeShapeFilter[1]; + filters[0] = filter; + + SeQuery spatialQuery = null; + SeSqlConstruct sqlCons = new SeSqlConstruct(pLayername, pWhere); + spatialQuery = new SeQuery(con, pReturnFields, sqlCons); + spatialQuery.prepareQuery(); + /* + * Set spatial constraints + */ + spatialQuery.setSpatialConstraints(SeQuery.SE_OPTIMIZE, false, + filters); + spatialQuery.execute(); + + return this.handleResultSet(spatialQuery); + + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new SQLException(e.getMessage()); + } + } /** * @see java.sql.Statement#executeUpdate(java.lang.String)