Skip to content

Commit 826c123

Browse files
authored
Merge pull request #1331 from xylar/update-shapely
Update shapely to >=2.0.1,<3.0.0
2 parents 4957563 + 9b018fd commit 826c123

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

conda-env/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ dependencies:
2323
- netcdf4 >=1.6.3
2424
- regionmask >=0.12.1
2525
- rasterio >=1.3.6
26-
- shapely >=2.0.1,<=2.0.6
26+
- shapely >=2.0.1,<3.0.0
2727
- numdifftools
2828
- nc-time-axis
2929
- colorcet

conda-env/dev.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ dependencies:
2323
- netcdf4 >=1.6.3
2424
- regionmask >=0.12.1
2525
- rasterio >=1.3.6
26-
- shapely >=2.0.1,<=2.0.6
26+
- shapely >=2.0.1,<3.0.0
2727
- numdifftools
2828
- nc-time-axis
2929
- colorcet

pcmdi_metrics/precip_distribution/lib/lib_precip_distribution.py

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,7 +1078,23 @@ def CalcMetricsDomain3Clust(
10781078
if shape[1] == 1:
10791079
polygons.append(Polygon(shape[0]["coordinates"][0]))
10801080

1081-
mpolygons.append(MultiPolygon(polygons).simplify(3, preserve_topology=False))
1081+
# Shapely >=2 may return Polygon or GeometryCollection after simplify;
1082+
# coerce to MultiPolygon comprised of polygonal parts only.
1083+
simplified = MultiPolygon(polygons).simplify(3, preserve_topology=False)
1084+
if isinstance(simplified, MultiPolygon):
1085+
mpolygons.append(simplified)
1086+
elif isinstance(simplified, Polygon):
1087+
mpolygons.append(MultiPolygon([simplified]))
1088+
else:
1089+
# GeometryCollection or other: extract polygonal geometries when available
1090+
if hasattr(simplified, "geoms"):
1091+
polys = [g for g in simplified.geoms if isinstance(g, Polygon)]
1092+
mpolygons.append(
1093+
MultiPolygon(polys) if len(polys) > 0 else MultiPolygon([])
1094+
)
1095+
else:
1096+
# Fallback to unsimplified geometry if simplify produced a non-multipart type
1097+
mpolygons.append(MultiPolygon(polygons))
10821098

10831099
region = regionmask.Regions(
10841100
mpolygons,
@@ -1379,6 +1395,7 @@ def CalcMetricsDomainAR6(pdf, amt, months, bincrates, dat, ref, ref_dir):
13791395
[-130, 50],
13801396
[-125.3, 40],
13811397
]
1398+
# r1, r2 are coordinate lists; wrap each once to Polygon, then MultiPolygon
13821399
vertices = MultiPolygon([Polygon(r1), Polygon(r2)])
13831400
elif reg == "NWPO":
13841401
vertices = Polygon([[139.5, 0], [132, 5], [132, 20], [180, 25], [180, 0]])
@@ -1393,7 +1410,8 @@ def CalcMetricsDomainAR6(pdf, amt, months, bincrates, dat, ref, ref_dir):
13931410
elif reg == "SWPO":
13941411
r1 = Polygon([[155, -30], [155, -10], [139.5, 0], [180, 0], [180, -30]])
13951412
r2 = Polygon([[-180, -30], [-180, 0], [-135, -10], [-135, -30]])
1396-
vertices = MultiPolygon([Polygon(r1), Polygon(r2)])
1413+
# r1 and r2 are already Polygon objects; build a MultiPolygon directly
1414+
vertices = MultiPolygon([r1, r2])
13971415
elif reg == "SEPO":
13981416
vertices = Polygon(
13991417
[
@@ -2083,7 +2101,19 @@ def MedDomain3Clust(d, months, debug=False):
20832101
if shape[1] == 1:
20842102
polygons.append(Polygon(shape[0]["coordinates"][0]))
20852103

2086-
mpolygons.append(MultiPolygon(polygons).simplify(3, preserve_topology=False))
2104+
simplified = MultiPolygon(polygons).simplify(3, preserve_topology=False)
2105+
if isinstance(simplified, MultiPolygon):
2106+
mpolygons.append(simplified)
2107+
elif isinstance(simplified, Polygon):
2108+
mpolygons.append(MultiPolygon([simplified]))
2109+
else:
2110+
if hasattr(simplified, "geoms"):
2111+
polys = [g for g in simplified.geoms if isinstance(g, Polygon)]
2112+
mpolygons.append(
2113+
MultiPolygon(polys) if len(polys) > 0 else MultiPolygon([])
2114+
)
2115+
else:
2116+
mpolygons.append(MultiPolygon(polygons))
20872117

20882118
region = regionmask.Regions(
20892119
mpolygons,
@@ -2266,7 +2296,7 @@ def MedDomainAR6(d, months):
22662296
elif reg == "SWPO":
22672297
r1 = Polygon([[155, -30], [155, -10], [139.5, 0], [180, 0], [180, -30]])
22682298
r2 = Polygon([[-180, -30], [-180, 0], [-135, -10], [-135, -30]])
2269-
vertices = MultiPolygon([Polygon(r1), Polygon(r2)])
2299+
vertices = MultiPolygon([r1, r2])
22702300
elif reg == "SEPO":
22712301
vertices = Polygon(
22722302
[

0 commit comments

Comments
 (0)