Skip to content

Commit

Permalink
fixes #3236
Browse files Browse the repository at this point in the history
  • Loading branch information
ptaillandier committed Oct 12, 2021
1 parent e904f17 commit bb03ec4
Showing 1 changed file with 30 additions and 1 deletion.
31 changes: 30 additions & 1 deletion msi.gama.core/src/msi/gaml/statements/SaveStatement.java
Expand Up @@ -1150,7 +1150,7 @@ public static void saveShapeFile(final IScope scope, final File f, final List<?
attributes == null ? Collections.EMPTY_LIST : attributes.values();
for (final IShape ag : agents) {
if (ag.getGeometries().size() > 1) {
ag.setInnerGeometry(geometryCollectionManagement(ag.getInnerGeometry()));
ag.setInnerGeometry(geometryCollectionToSimpleManagement(ag.getInnerGeometry()));
}
final SimpleFeature ff = (SimpleFeature) fw.next();
final boolean ok = buildFeature(scope, ff, ag, gis, attributeValues);
Expand Down Expand Up @@ -1178,19 +1178,48 @@ public static void saveShapeFile(final IScope scope, final File f, final List<?

}
}

private static Geometry geometryCollectionToSimpleManagement(final Geometry gg) {
if (gg instanceof GeometryCollection) {
final int nb = ((GeometryCollection) gg).getNumGeometries();
List<Geometry> polys = new ArrayList<>();
List<Geometry> lines = new ArrayList<>();
List<Geometry> points = new ArrayList<>();

for (int i = 0; i < nb; i++) {
final Geometry g = ((GeometryCollection) gg).getGeometryN(i);
if ((g instanceof Polygon)) { polys.add(g);}
else if ((g instanceof LineString)) {lines.add(g); }
else if ((g instanceof Point)) { points.add(g); }
}

if (!polys.isEmpty()) {
return GeometryUtils.GEOMETRY_FACTORY.createMultiPolygon((Polygon[]) polys.toArray());
}
if (!lines.isEmpty()) {
return GeometryUtils.GEOMETRY_FACTORY.createMultiLineString((LineString[]) lines.toArray());
}
if (!points.isEmpty()) {
return GeometryUtils.GEOMETRY_FACTORY.createMultiPoint((Point[]) points.toArray());
}
}
return gg;
}

private static Geometry geometryCollectionManagement(final Geometry gg) {
if (gg instanceof GeometryCollection) {
boolean isMultiPolygon = true;
boolean isMultiPoint = true;
boolean isMultiLine = true;
final int nb = ((GeometryCollection) gg).getNumGeometries();

for (int i = 0; i < nb; i++) {
final Geometry g = ((GeometryCollection) gg).getGeometryN(i);
if (!(g instanceof Polygon)) { isMultiPolygon = false; }
if (!(g instanceof LineString)) { isMultiLine = false; }
if (!(g instanceof Point)) { isMultiPoint = false; }
}

if (isMultiPolygon) {
final Polygon[] polygons = new Polygon[nb];
for (int i = 0; i < nb; i++) {
Expand Down

0 comments on commit bb03ec4

Please sign in to comment.