diff --git a/scripts/src/main/resources/org/orbisgis/orbiswps/scripts/scripts/Geometry2D/Convert/polygonize.groovy b/scripts/src/main/resources/org/orbisgis/orbiswps/scripts/scripts/Geometry2D/Convert/polygonize.groovy
new file mode 100644
index 0000000..9c41a2c
--- /dev/null
+++ b/scripts/src/main/resources/org/orbisgis/orbiswps/scripts/scripts/Geometry2D/Convert/polygonize.groovy
@@ -0,0 +1,144 @@
+/*
+ * OrbisWPS contains a set of libraries to build a Web Processing Service (WPS)
+ * compliant with the 2.0 specification.
+ *
+ * OrbisWPS is part of the OrbisGIS platform
+ *
+ * OrbisGIS is a java GIS application dedicated to research in GIScience.
+ * OrbisGIS is developed by the GIS group of the DECIDE team of the
+ * Lab-STICC CNRS laboratory, see .
+ *
+ * The GIS group of the DECIDE team is located at :
+ *
+ * Laboratoire Lab-STICC – CNRS UMR 6285
+ * Equipe DECIDE
+ * UNIVERSITÉ DE BRETAGNE-SUD
+ * Institut Universitaire de Technologie de Vannes
+ * 8, Rue Montaigne - BP 561 56017 Vannes Cedex
+ *
+ * OrbisWPS is distributed under GPL 3 license.
+ *
+ * Copyright (C) 2015-2018 CNRS (Lab-STICC UMR CNRS 6285)
+ *
+ *
+ * OrbisWPS is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * OrbisWPS is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even 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
+ * OrbisWPS. If not, see .
+ *
+ * For more information, please consult:
+ * or contact directly:
+ * info_at_ orbisgis.org
+ */
+package org.orbisgis.orbiswps.scripts.scripts.Geometry2D.Convert
+
+import org.orbisgis.orbiswps.groovyapi.input.*
+import org.orbisgis.orbiswps.groovyapi.output.*
+import org.orbisgis.orbiswps.groovyapi.process.*
+
+/**
+ * This process converts geometries to polygons
+ *
+ * @author Erwan Bocher
+ */
+@Process(
+ title = "Polygonize",
+ description = "Convert a set of 2 or 3 dimensional geometries to polygons.\n\
+ Optionally, polygonize extracts points where lines intersect and uses them,together with points from the original lines, to construct polygons",
+ keywords = ["Vector","Geometry", "Convert"],
+ properties = ["DBMS_TYPE", "H2GIS","DBMS_TYPE", "POSTGIS"],
+ version = "1.0")
+def processing() {
+ the_geom = geometricField[0]
+ String query = "CREATE TABLE ${outputTableName} AS SELECT "
+
+ if(isH2){
+ query+= " explod_id as id, the_geom from ST_EXPLODE('(SELECT "
+ if(node){
+ query += "st_polygonize(st_union(st_precisionreducer(st_node(st_accum(${the_geom})), 3))) as the_geom from ${inputJDBCTable} where st_dimension(${the_geom})>0)')"
+ }else{
+ query += "st_polygonize(st_accum(${the_geom})) as the_geom from ${inputJDBCTable} where st_dimension(${the_geom})>0)')"
+ }
+ }
+ else{
+ query+= " row_number() OVER () AS id, t.the_geom from "
+ if(node){
+ query += "(select (st_dump(st_polygonize(ST_UnaryUnion(ST_SnapToGrid(${the_geom}, 0.001)))).geom as the_geom from ${inputJDBCTable} where st_dimension(${the_geom})>0) as t"
+ }else{
+ query += "(select (st_dump(st_accum(${the_geom}))).geom as the_geom from ${inputJDBCTable} where st_dimension(${the_geom})>0) as t"
+ }
+ }
+
+ if(dropOutputTable){
+ sql.execute "drop table if exists ${outputTableName}".toString()
+ }
+
+ sql.execute(query)
+ if(dropInputTable){
+ sql.execute "drop table if exists ${inputJDBCTable}"
+ }
+ literalOutput = i18n.tr("Process done")
+}
+
+
+/****************/
+/** INPUT Data **/
+/****************/
+
+@JDBCTableInput(
+ title = "Table to polygonize",
+ description = "The table to polygonize.",
+ dataTypes = ["GEOMETRY"])
+String inputJDBCTable
+
+/**********************/
+/** INPUT Parameters **/
+/**********************/
+
+/** Name of the Geometric field of the JDBCTable inputJDBCTable. */
+@JDBCColumnInput(
+ title = "Geometric column",
+ description = "The geometric column of the input table.",
+ jdbcTableReference = "inputJDBCTable",
+ dataTypes = ["GEOMETRY"])
+String[] geometricField
+
+@LiteralDataInput(
+ title = "Use line intersections ",
+ description = "Extracts points where lines intersect.")
+Boolean node
+
+
+@LiteralDataInput(
+ title = "Drop the output table if exists",
+ description = "Drop the output table if exists.")
+Boolean dropOutputTable
+
+@LiteralDataInput(
+ title = "Output table name",
+ description = "Name of the table containing the result of the process.")
+String outputTableName
+
+
+@LiteralDataInput(
+ title = "Drop the input table",
+ description = "Drop the input table when the script is finished.")
+Boolean dropInputTable
+
+
+/*****************/
+/** OUTPUT Data **/
+/*****************/
+
+/** String output of the process. */
+@LiteralDataOutput(
+ title = "Output message",
+ description = "The output message.")
+String literalOutput
diff --git a/scripts/src/test/java/org/orbisgis/orbiswps/scripts/ScriptTests.java b/scripts/src/test/java/org/orbisgis/orbiswps/scripts/ScriptTests.java
index 4f54fb0..b01b938 100644
--- a/scripts/src/test/java/org/orbisgis/orbiswps/scripts/ScriptTests.java
+++ b/scripts/src/test/java/org/orbisgis/orbiswps/scripts/ScriptTests.java
@@ -74,6 +74,7 @@ public class ScriptTests {
/** {@link java.sql.Statement} object used to execute Sql queries. */
private Statement st;
+
@BeforeClass
public static void tearUp() throws Exception {
// Keep a connection alive to not close the DataBase on each unit test
@@ -564,4 +565,93 @@ public void testConcavityIndice1() throws Exception {
Assert.assertTrue(rs.getDouble(2)<1);
rs.close();
}
+
+ @Test
+ public void testPolygonize1() throws Exception {
+ String scriptPath = WPSScriptExecute.class.getResource("scripts/Geometry2D/Convert/polygonize.groovy").getPath();
+ //Prepare input and output values
+ Map inputMap = new HashMap<>();
+ inputMap.put("inputJDBCTable", "geomForms");
+ inputMap.put("geometricField", new String[]{"the_geom"});
+ inputMap.put("dropOutputTable", true);
+ inputMap.put("outputTableName", "polygonize_res");
+ Map propertyMap = new HashMap<>();
+ propertyMap.put("sql", sql);
+ propertyMap.put("isH2", true);
+
+ //Add data
+ st.execute("drop table if exists geomForms; create table geomForms (the_geom polygon); "
+ + "INSERT INTO geomForms VALUES(ST_GeomFromText('POLYGON ((100 330, 220 330, 220 230, 100 230, 100 330))'))"
+ + ",(ST_GeomFromText('POLYGON ((160 340, 290 340, 290 260, 160 260, 160 340))')),"
+ + "(ST_GeomFromText('POLYGON ((60 270, 140 270, 140 180, 60 180, 60 270))'))");
+
+ //Execute
+ Map outputMap = WPSScriptExecute.run(groovyClassLoader, scriptPath, propertyMap, inputMap);
+ Assert.assertEquals("Process done", outputMap.get("literalOutput"));
+ ResultSet rs = st.executeQuery(
+ "SELECT count(*) FROM polygonize_res;");
+ assertTrue(rs.next());
+ Assert.assertEquals(3, rs.getInt(1));
+ rs.close();
+ }
+
+ @Test
+ public void testPolygonize2() throws Exception {
+ String scriptPath = WPSScriptExecute.class.getResource("scripts/Geometry2D/Convert/polygonize.groovy").getPath();
+ //Prepare input and output values
+ Map inputMap = new HashMap<>();
+ inputMap.put("inputJDBCTable", "geomForms");
+ inputMap.put("geometricField", new String[]{"the_geom"});
+ inputMap.put("node", true);
+ inputMap.put("dropOutputTable", true);
+ inputMap.put("outputTableName", "polygonize_res");
+ Map propertyMap = new HashMap<>();
+ propertyMap.put("sql", sql);
+ propertyMap.put("isH2", true);
+
+ //Add data
+ st.execute("drop table if exists geomForms; create table geomForms (the_geom polygon); "
+ + "INSERT INTO geomForms VALUES(ST_GeomFromText('POLYGON ((100 330, 220 330, 220 230, 100 230, 100 330))'))"
+ + ",(ST_GeomFromText('POLYGON ((160 340, 290 340, 290 260, 160 260, 160 340))')),"
+ + "(ST_GeomFromText('POLYGON ((60 270, 140 270, 140 180, 60 180, 60 270))'))");
+
+ //Execute
+ Map outputMap = WPSScriptExecute.run(groovyClassLoader, scriptPath, propertyMap, inputMap);
+ Assert.assertEquals("Process done", outputMap.get("literalOutput"));
+ ResultSet rs = st.executeQuery(
+ "SELECT count(*) FROM polygonize_res;");
+ assertTrue(rs.next());
+ Assert.assertEquals(5, rs.getInt(1));
+ rs.close();
+ }
+
+ @Test
+ public void testPolygonize3() throws Exception {
+ String scriptPath = WPSScriptExecute.class.getResource("scripts/Geometry2D/Convert/polygonize.groovy").getPath();
+ //Prepare input and output values
+ Map inputMap = new HashMap<>();
+ inputMap.put("inputJDBCTable", "geomForms");
+ inputMap.put("geometricField", new String[]{"the_geom"});
+ inputMap.put("node", true);
+ inputMap.put("dropOutputTable", true);
+ inputMap.put("outputTableName", "polygonize_res");
+ Map propertyMap = new HashMap<>();
+ propertyMap.put("sql", sql);
+ propertyMap.put("isH2", true);
+ //Add data
+ st.execute("drop table if exists geomForms; create table geomForms (the_geom linestring); "
+ + "INSERT INTO geomForms VALUES(ST_GeomFromText('LINESTRING (90 200, 240 330)'))"
+ + ",(ST_GeomFromText('LINESTRING (150 340, 290 240)')),"
+ +" (ST_GeomFromText('LINESTRING (100 290, 190 200, 270 310)')),"
+ + "(ST_GeomFromText('LINESTRING (220 360, 90 260, 140 180)'))");
+
+ //Execute
+ Map outputMap = WPSScriptExecute.run(groovyClassLoader, scriptPath, propertyMap, inputMap);
+ Assert.assertEquals("Process done", outputMap.get("literalOutput"));
+ ResultSet rs = st.executeQuery(
+ "SELECT count(*) FROM polygonize_res;");
+ assertTrue(rs.next());
+ Assert.assertEquals(3, rs.getInt(1));
+ rs.close();
+ }
}
diff --git a/service/src/main/java/org/orbisgis/orbiswps/service/process/ProcessIdentifierImpl.java b/service/src/main/java/org/orbisgis/orbiswps/service/process/ProcessIdentifierImpl.java
index 3d42e98..b59a81c 100644
--- a/service/src/main/java/org/orbisgis/orbiswps/service/process/ProcessIdentifierImpl.java
+++ b/service/src/main/java/org/orbisgis/orbiswps/service/process/ProcessIdentifierImpl.java
@@ -94,6 +94,7 @@ public ProcessIdentifierImpl(ProcessOffering processOffering, URL sourceUrl){
this.i18n = I18nFactory.getI18n(ProcessIdentifierImpl.class);
}
+ @Override
public void setI18n(I18n i18n){
this.i18n = i18n;
}