Displaying differences for changeset
 
display as  

src/java/m/gis/ApplicationConfig.java

@@ -40,11 +40,12 @@
         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.difference.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.minboundingrectangle.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.minboundingrectangle.V1_0.class);
         resources.add(m.gis.transform.V1_0.class);
         resources.add(m.gis.union.V1_0.class);
     }

src/java/m/gis/Database.java

@@ -67,6 +67,8 @@
 
     public abstract Layer intersect(Layer one, Layer two) throws csip.ServiceException;
 
+    public abstract Layer difference(Layer one, Layer two) throws csip.ServiceException;
+
     public abstract Layer union(Layer one, Layer two) throws csip.ServiceException;
 
     public abstract Layer buffer(Layer lyr, int distance) throws csip.ServiceException;

src/java/m/gis/PostgresqlDatabase.java

@@ -205,6 +205,7 @@
             String schemaTable = Constants.DEFAULT_SCHEMA + ".\"" + table + "\"";
             Statement stmt = conn.createStatement();
 
+            createSchema(Constants.DEFAULT_SCHEMA);
             deleteTable(schemaTable);
 
             ArrayList<String> props = new ArrayList<>(Arrays.asList(new String[]{
@@ -230,6 +231,38 @@
     }
 
     @Override
+    public Layer difference(Layer one, Layer two) throws ServiceException {
+        try {
+            String table = "diff_" + SESSION_ID + "_" + new RandomString(4).nextString();
+            String schemaTable = Constants.DEFAULT_SCHEMA + ".\"" + table + "\"";
+            Statement stmt = conn.createStatement();
+
+            createSchema(Constants.DEFAULT_SCHEMA);
+            deleteTable(schemaTable);
+
+            ArrayList<String> props = new ArrayList<>(Arrays.asList(new String[]{
+                "ST_Difference(" + one.getSchemaTable() + ".the_geom, " + two.getSchemaTable() + ".the_geom) AS the_geom ",
+                getProperties(one, true),
+                getProperties(two, true),
+            }));
+            String sql = "CREATE TABLE " + schemaTable + " AS " + 
+                    "SELECT " + LocalStringUtils.join(props, ", ") + " " +
+                    "FROM " + one.getSchemaTable() + ", " + two.getSchemaTable() + " " +
+                    "WHERE " + one.getSchemaTable() + ".the_geom && " + two.getSchemaTable() + ".the_geom";
+            LOG.log(Level.INFO, sql);
+            stmt.executeUpdate(sql);
+
+            Layer res = new Layer(Constants.DEFAULT_SCHEMA, table, this); 
+            updateGeometrySRID(res, GeoJSONParser.getSRIDInt(Constants.DEFAULT_CRS));
+
+            stmt.close();
+            return res;
+        } catch (SQLException|JSONException ex) {
+            throw new csip.ServiceException(ex);
+        }
+    }
+
+    @Override
     public Layer union(Layer one, Layer two) throws ServiceException {
         try {
             String table = "union_" + SESSION_ID + "_" + new RandomString(4).nextString();