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)

http://dive4elements.wald.intevation.org