Displaying differences for changeset
 
display as  

nbproject/private/private.xml

@@ -25,10 +25,8 @@
         </group>
         <group>
             <file>file:/Users/ktraff/NetBeansProjects/csip-gis/src/java/m/gis/Database.java</file>
-            <file>file:/Users/ktraff/NetBeansProjects/csip-gis/src/java/m/gis/LocalStringUtils.java</file>
-            <file>file:/Users/ktraff/NetBeansProjects/csip-gis/src/java/m/gis/minboundingrectangle/V1_0.java</file>
+            <file>file:/Users/ktraff/NetBeansProjects/csip-gis/src/java/m/gis/extent/V1_0.java</file>
             <file>file:/Users/ktraff/NetBeansProjects/csip-gis/src/java/m/gis/PostgresqlDatabase.java</file>
-            <file>file:/Users/ktraff/NetBeansProjects/csip-gis/src/java/m/gis/DatabaseBuilder.java</file>
         </group>
     </open-files>
 </project-private>

src/java/m/gis/ApplicationConfig.java

@@ -38,7 +38,10 @@
         resources.add(csip.ControlService.class);
         resources.add(csip.QueryService.class);
         resources.add(csip.ReportService.class);
+        resources.add(m.gis.area.V1_0.class);
         resources.add(m.gis.buffer.V1_0.class);
+        resources.add(m.gis.envelope.V1_0.class);
+        resources.add(m.gis.extent.V1_0.class);
         resources.add(m.gis.intersect.V1_0.class);
         resources.add(m.gis.minboundingcircle.V1_0.class);
         resources.add(m.gis.union.V1_0.class);

src/java/m/gis/Database.java

@@ -70,5 +70,11 @@
 
     public abstract Layer minimumBoundingCircle(Layer lyr, int numSegsPerQtCirc) throws csip.ServiceException;
 
+    public abstract Layer extent(Layer lyr) throws csip.ServiceException;
+
+    public abstract Layer envelope(Layer lyr) throws csip.ServiceException;
+
+    public abstract Layer area(Layer lyr) throws csip.ServiceException;
+
     public abstract JSONObject toJSON(Layer lyr) throws csip.ServiceException;
 }

src/java/m/gis/Feature.java

@@ -14,10 +14,12 @@
 public class Feature {
     Layer layer;
     JSONObject geojson;
+    int id;
 
-    public Feature(Layer lyr, JSONObject featureJSON) {
+    public Feature(Layer lyr, JSONObject featureJSON, int id) {
         layer = lyr;
         geojson = featureJSON;
+        this.id = id;
     }
     
 }

src/java/m/gis/PostgresqlDatabase.java

@@ -114,12 +114,18 @@
             }
 
             sql = "INSERT INTO " + layer.getSchemaTable() + " (" + LocalStringUtils.join(cols, ",") + ") " +
-                  "VALUES ('" + LocalStringUtils.join(vals, "', '")  + "');";
+                  "VALUES ('" + LocalStringUtils.join(vals, "', '")  + "') RETURNING id";
             LOG.log(Level.INFO, sql);
-            stmt.executeUpdate(sql);
+            stmt.execute(sql);
+            ResultSet lastUpdated = stmt.getResultSet();
+            int id = -1;
+            if (lastUpdated.next()) {
+                id = lastUpdated.getInt(1);
+            }
+            LOG.log(Level.INFO, "Uploaded feature with id: " + id);
 
             stmt.close();
-            return new Feature(layer, featureJSON);
+            return new Feature(layer, featureJSON, id);
         } catch (SQLException|JSONException ex) {
             throw new csip.ServiceException(ex);
         }
@@ -261,6 +267,98 @@
     }
 
     @Override
+    public Layer extent(Layer lyr) throws ServiceException {
+        try {
+            String table = "ext_" + SESSION_ID + "_" + new RandomString(4).nextString();
+            String schemaTable = SCHEMA + ".\"" + table + "\"";
+            Statement stmt = conn.createStatement();
+            String sql = "CREATE SCHEMA IF NOT EXISTS " + SCHEMA;
+            stmt.executeUpdate(sql);
+
+            sql = "DROP TABLE IF EXISTS " + schemaTable;
+            LOG.log(Level.INFO, sql);
+            stmt.executeUpdate(sql);
+
+            ArrayList<String> props = new ArrayList<>(Arrays.asList(new String[]{
+                "ST_Extent(" + lyr.getSchemaTable() + ".the_geom)::geometry AS the_geom ",
+                getProperties(lyr, true) 
+            }));
+            sql = "CREATE TABLE " + schemaTable + " AS " + 
+                    "SELECT " + LocalStringUtils.join(props, ", ") + " " +
+                    "FROM " + lyr.getSchemaTable();
+            LOG.log(Level.INFO, sql);
+            stmt.executeUpdate(sql);
+
+            stmt.close();
+            return new Layer(SCHEMA, table, null);
+        } catch (SQLException ex) {
+            throw new csip.ServiceException(ex);
+        }
+    }
+
+    @Override
+    public Layer envelope(Layer lyr) throws ServiceException {
+        try {
+            String table = "env_" + SESSION_ID + "_" + new RandomString(4).nextString();
+            String schemaTable = SCHEMA + ".\"" + table + "\"";
+            Statement stmt = conn.createStatement();
+            String sql = "CREATE SCHEMA IF NOT EXISTS " + SCHEMA;
+            stmt.executeUpdate(sql);
+
+            sql = "DROP TABLE IF EXISTS " + schemaTable;
+            LOG.log(Level.INFO, sql);
+            stmt.executeUpdate(sql);
+
+            ArrayList<String> props = new ArrayList<>(Arrays.asList(new String[]{
+                "ST_Envelope(ST_Collect(" + lyr.getSchemaTable() + ".the_geom)) AS the_geom ",
+                getProperties(lyr, true) 
+            }));
+            sql = "CREATE TABLE " + schemaTable + " AS " + 
+                    "SELECT " + LocalStringUtils.join(props, ", ") + " " +
+                    "FROM " + lyr.getSchemaTable();
+            LOG.log(Level.INFO, sql);
+            stmt.executeUpdate(sql);
+
+            stmt.close();
+            return new Layer(SCHEMA, table, null);
+        } catch (SQLException ex) {
+            throw new csip.ServiceException(ex);
+        }
+    }
+
+    @Override
+    public Layer area(Layer lyr) throws ServiceException {
+        try {
+            String table = "area_" + SESSION_ID + "_" + new RandomString(4).nextString();
+            String schemaTable = SCHEMA + ".\"" + table + "\"";
+            Statement stmt = conn.createStatement();
+            String sql = "CREATE SCHEMA IF NOT EXISTS " + SCHEMA;
+            stmt.executeUpdate(sql);
+
+            sql = "DROP TABLE IF EXISTS " + schemaTable;
+            LOG.log(Level.INFO, sql);
+            stmt.executeUpdate(sql);
+
+            ArrayList<String> colsExclude = new ArrayList<>(Arrays.asList(new String[]{"the_geom","id","calc_area"}));
+            ArrayList<String> props = new ArrayList<>(Arrays.asList(new String[]{
+                lyr.getSchemaTable() + ".the_geom ",
+                "ST_Area(" + lyr.getSchemaTable() + ".the_geom::geography) AS calc_area ",
+                getProperties(lyr, true, colsExclude) 
+            }));
+            sql = "CREATE TABLE " + schemaTable + " AS " + 
+                    "SELECT " + LocalStringUtils.join(props, ", ") + " " +
+                    "FROM " + lyr.getSchemaTable();
+            LOG.log(Level.INFO, sql);
+            stmt.executeUpdate(sql);
+
+            stmt.close();
+            return new Layer(SCHEMA, table, null);
+        } catch (SQLException ex) {
+            throw new csip.ServiceException(ex);
+        }
+    }
+
+    @Override
     public JSONObject toJSON(Layer lyr) throws ServiceException {
         try {
             Statement stmt = conn.createStatement();
@@ -373,10 +471,18 @@
     }
 
     public String getProperties(Layer lyr, boolean useTableSuffix) throws ServiceException {
+        ArrayList<String> colsExclude = new ArrayList<>(Arrays.asList(new String[]{
+            "the_geom",
+            "id",
+        }));
+        return getProperties(lyr, useTableSuffix, colsExclude);
+    }
+
+    public String getProperties(Layer lyr, boolean useTableSuffix, ArrayList<String> colsExclude) throws ServiceException {
         ArrayList<String> props = new ArrayList<>();
         ArrayList<String> cols = getColumns(lyr.schema, lyr.table);
         for (String col : cols) {
-            if (!col.equals("the_geom") && !col.equals("id")) {
+            if (!colsExclude.contains(col)) {
                 String prop = lyr.getSchemaTable() + "." + col + " AS " + col;
                 if (useTableSuffix && hasSuffix(lyr)) {
                     prop += "_" + lyr.table.charAt(lyr.table.length() - 1);

src/java/m/gis/intersect/V1_0.java

@@ -20,7 +20,6 @@
 import org.codehaus.jettison.json.JSONObject;
 
 /**
- * GIS Intersection.
  *
  * @author ktraff
  */

src/java/m/gis/minboundingcircle/V1_0.java

@@ -19,7 +19,6 @@
 import org.codehaus.jettison.json.JSONObject;
 
 /**
- * GIS Buffer.
  *
  * @author ktraff
  */

src/java/m/gis/union/V1_0.java

@@ -20,7 +20,6 @@
 import org.codehaus.jettison.json.JSONObject;
 
 /**
- * GIS Intersection.
  *
  * @author ktraff
  */