From 63548adb61b985d9f0aebfb83cf04bc2fdf83df8 Mon Sep 17 00:00:00 2001 From: Paulo van Breugel Date: Sat, 10 Feb 2024 16:25:45 +0100 Subject: [PATCH 1/4] v.multi2singlepart new addon Addon to split multipart polygons to singlepart polygons. p.s. I created this because I couldn't find an obvious way to do this. I feel there should be, so let me know if I missed it. --- src/vector/v.multi2singlepart/Makefile | 7 ++ .../v.multi2singlepart.html | 38 ++++++ .../v.multi2singlepart/v.multi2singlepart.py | 110 ++++++++++++++++++ 3 files changed, 155 insertions(+) create mode 100644 src/vector/v.multi2singlepart/Makefile create mode 100644 src/vector/v.multi2singlepart/v.multi2singlepart.html create mode 100755 src/vector/v.multi2singlepart/v.multi2singlepart.py diff --git a/src/vector/v.multi2singlepart/Makefile b/src/vector/v.multi2singlepart/Makefile new file mode 100644 index 0000000000..ccae942c11 --- /dev/null +++ b/src/vector/v.multi2singlepart/Makefile @@ -0,0 +1,7 @@ +MODULE_TOPDIR = ../.. + +PGM = v.multi2singlepart + +include $(MODULE_TOPDIR)/include/Make/Script.make + +default: script diff --git a/src/vector/v.multi2singlepart/v.multi2singlepart.html b/src/vector/v.multi2singlepart/v.multi2singlepart.html new file mode 100644 index 0000000000..10cf73f064 --- /dev/null +++ b/src/vector/v.multi2singlepart/v.multi2singlepart.html @@ -0,0 +1,38 @@ +

DESCRIPTION

+ +v.multi2singlepart creates a vector layer containing +singlepart polygons generated by separating the multipart polygons of +the input vector layer. The attributes of the input layer will be +maintained in the output vector layer. Singlepart polygons will not be +affected. + +

NOTES

+ +To go from singlepart to multipart features, use the +v.dissolve function (see example below). + + +

EXAMPLES

+ +The example uses the layer boundary_municp from the North +Carolina dataset. You can download the sample data set from the grass gis website + +
+
+v.dissolve input=boundary_municp column=MB_NAME output=bnd_municp_dis
+v.multi2singlepart input=bnd_municp_dis output=bnd_municp_split
+
+
+ +

SEE ALSO

+ + v.dissolve + + + + +

AUTHOR

+ +Paulo van Breugel, paulo at ecodiv.earth diff --git a/src/vector/v.multi2singlepart/v.multi2singlepart.py b/src/vector/v.multi2singlepart/v.multi2singlepart.py new file mode 100755 index 0000000000..4e0594b8b4 --- /dev/null +++ b/src/vector/v.multi2singlepart/v.multi2singlepart.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python + +# +############################################################################ +# +# MODULE: v.multi2singlepart +# AUTHOR(S): Paulo van Breugel +# PURPOSE: Split multipart polygons into singlepart polygon features +# +# COPYRIGHT: (C) 2024 Paulo van Breugel and the GRASS Development Team +# http://ecodiv.earth +# +# This program is free software under the GNU General Public +# License (>=v2). Read the file COPYING that comes with GRASS +# for details. +# +############################################################################# +# +# REQUIREMENTS: +# - +# %module +# % description: Split multi-polygon features into single polygon features. +# % keyword: vector +# % keyword: geometry +# %end + +# %option G_OPT_V_INPUT +# % description: Input vector layer +# % required : yes +# %end + +# %option G_OPT_V_OUTPUT +# % description: Output vector layer +# % required : yes +# %end + +# ---------------------------------------------------------------------------- +# Standard +# ---------------------------------------------------------------------------- + +# import libraries +import sys +import atexit +import sys +import uuid +import grass.script as gs + + +CLEAN_LAY = [] + + +def create_temporary_name(prefix): + tmpf = f"{prefix}{str(uuid.uuid4().hex)}" + CLEAN_LAY.append(tmpf) + return tmpf + + +def cleanup(): + """Remove temporary maps specified in the global list""" + maps = reversed(CLEAN_LAY) + mapset = gs.gisenv()["MAPSET"] + for map_name in maps: + for element in ("raster", "vector"): + found = gs.find_file( + name=map_name, + element=element, + mapset=mapset, + ) + if found["file"]: + gs.run_command( + "g.remove", + flags="f", + type=element, + name=map_name, + quiet=True, + ) + + +def main(options, flags): + + # Copy layer and remove all but cat column in new layer + tmplayer = create_temporary_name("tmp") + gs.run_command("g.copy", vector=[options["input"], tmplayer], overwrite=True) + cols = gs.read_command("db.columns", table=tmplayer).split("\n") + cols = [x for x in cols[1:] if x != ""] + gs.run_command("v.db.dropcolumn", map=tmplayer, columns=cols) + + # Overlay the original and copied layer + gs.run_command( + "v.overlay", + ainput=options["input"], + binput=tmplayer, + operator="and", + output=options["output"], + ) + + # Drop old cat columns + gs.run_command("v.db.dropcolumn", map=options["output"], columns=["a_cat", "b_cat"]) + + # Change the column names to the original names + for colname in cols: + oldcol = f"a_{colname}" + gs.run_command( + "v.db.renamecolumn", map=options["output"], column=[oldcol, colname] + ) + + +if __name__ == "__main__": + atexit.register(cleanup) + sys.exit(main(*gs.parser())) From 1959ba3dad2a3cc322fff57063d81e3733ef26b4 Mon Sep 17 00:00:00 2001 From: Paulo van Breugel Date: Sat, 10 Feb 2024 22:17:35 +0100 Subject: [PATCH 2/4] v.multi2singlepart: illustration added to manual page --- src/vector/v.multi2singlepart/example.png | Bin 0 -> 23045 bytes src/vector/v.multi2singlepart/example.svg | 198 ++++++++++++++++++ .../v.multi2singlepart.html | 6 + 3 files changed, 204 insertions(+) create mode 100644 src/vector/v.multi2singlepart/example.png create mode 100644 src/vector/v.multi2singlepart/example.svg diff --git a/src/vector/v.multi2singlepart/example.png b/src/vector/v.multi2singlepart/example.png new file mode 100644 index 0000000000000000000000000000000000000000..484835cb5674ddeb26b3b749f865fecf1122ea47 GIT binary patch literal 23045 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 YKQ!kY;5+BRx{QFCu@#bJ + + + + + + + + + + + + + + + 1 + 2 + 3 + + + + 1 + 1 + 1 + 1 multipart feature + 3 singlepart features + + + + + diff --git a/src/vector/v.multi2singlepart/v.multi2singlepart.html b/src/vector/v.multi2singlepart/v.multi2singlepart.html index 10cf73f064..ba2e4ce2d6 100644 --- a/src/vector/v.multi2singlepart/v.multi2singlepart.html +++ b/src/vector/v.multi2singlepart/v.multi2singlepart.html @@ -6,6 +6,12 @@

DESCRIPTION

maintained in the output vector layer. Singlepart polygons will not be affected. +

+

+From multipart to singlepart features
From multipart to singlepart features.
+ +

NOTES

To go from singlepart to multipart features, use the From 18aadba32cc54c09df4995007bd1342c95a9ff04 Mon Sep 17 00:00:00 2001 From: Paulo van Breugel Date: Sat, 17 Feb 2024 15:43:50 +0100 Subject: [PATCH 3/4] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Edouard Choinière <27212526+echoix@users.noreply.github.com> --- src/vector/v.multi2singlepart/v.multi2singlepart.html | 2 +- src/vector/v.multi2singlepart/v.multi2singlepart.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vector/v.multi2singlepart/v.multi2singlepart.html b/src/vector/v.multi2singlepart/v.multi2singlepart.html index ba2e4ce2d6..7f855492a2 100644 --- a/src/vector/v.multi2singlepart/v.multi2singlepart.html +++ b/src/vector/v.multi2singlepart/v.multi2singlepart.html @@ -22,7 +22,7 @@

EXAMPLES

The example uses the layer boundary_municp from the North Carolina dataset. You can download the sample data set from the grass gis website +href="https://grass.osgeo.org/download/data/">GRASS GIS website
diff --git a/src/vector/v.multi2singlepart/v.multi2singlepart.py b/src/vector/v.multi2singlepart/v.multi2singlepart.py
index 4e0594b8b4..90105f2488 100755
--- a/src/vector/v.multi2singlepart/v.multi2singlepart.py
+++ b/src/vector/v.multi2singlepart/v.multi2singlepart.py
@@ -26,12 +26,12 @@
 
 # %option G_OPT_V_INPUT
 # % description: Input vector layer
-# % required : yes
+# % required: yes
 # %end
 
 # %option G_OPT_V_OUTPUT
 # % description: Output vector layer
-# % required : yes
+# % required: yes
 # %end
 
 # ----------------------------------------------------------------------------

From af7ee94fdb73f5b77694af179cd82440a7f8b3af Mon Sep 17 00:00:00 2001
From: Paulo van Breugel 
Date: Thu, 29 Feb 2024 23:16:22 +0100
Subject: [PATCH 4/4] add topological check

clarify in help file that the function works for polygons only
---
 src/vector/v.multi2singlepart/v.multi2singlepart.html | 10 +++++-----
 src/vector/v.multi2singlepart/v.multi2singlepart.py   | 11 +++++++++--
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/vector/v.multi2singlepart/v.multi2singlepart.html b/src/vector/v.multi2singlepart/v.multi2singlepart.html
index 7f855492a2..5a5012faac 100644
--- a/src/vector/v.multi2singlepart/v.multi2singlepart.html
+++ b/src/vector/v.multi2singlepart/v.multi2singlepart.html
@@ -1,15 +1,15 @@
 

DESCRIPTION

v.multi2singlepart creates a vector layer containing -singlepart polygons generated by separating the multipart polygons of -the input vector layer. The attributes of the input layer will be -maintained in the output vector layer. Singlepart polygons will not be -affected. +singlepart polygon features generated by separating the multipart +features of the input vector layer. The attributes of the input layer +will be maintained in the output vector layer. Singlepart features will +not be affected.

From multipart to singlepart features
From multipart to singlepart features.
+border="0" width=400 height="auto">
From multipart to singlepart polygons.

NOTES

diff --git a/src/vector/v.multi2singlepart/v.multi2singlepart.py b/src/vector/v.multi2singlepart/v.multi2singlepart.py index 90105f2488..e8f1f33a9e 100755 --- a/src/vector/v.multi2singlepart/v.multi2singlepart.py +++ b/src/vector/v.multi2singlepart/v.multi2singlepart.py @@ -5,7 +5,7 @@ # # MODULE: v.multi2singlepart # AUTHOR(S): Paulo van Breugel -# PURPOSE: Split multipart polygons into singlepart polygon features +# PURPOSE: Split multipart polygon features into singlepart features # # COPYRIGHT: (C) 2024 Paulo van Breugel and the GRASS Development Team # http://ecodiv.earth @@ -19,7 +19,7 @@ # REQUIREMENTS: # - # %module -# % description: Split multi-polygon features into single polygon features. +# % description: Split multi-part polygons into single-part polygons. # % keyword: vector # % keyword: geometry # %end @@ -85,12 +85,19 @@ def main(options, flags): cols = [x for x in cols[1:] if x != ""] gs.run_command("v.db.dropcolumn", map=tmplayer, columns=cols) + # Check topology + top = gs.parse_command("v.info", flags="t", map=tmplayer) + if int(top["areas"]) == 0: + gs.fatal(_("The layer does not contain areas. Exiting...")) + # Overlay the original and copied layer gs.run_command( "v.overlay", ainput=options["input"], binput=tmplayer, operator="and", + atype="area", + btype="area", output=options["output"], )