Changeset 15429 in josm


Ignore:
Timestamp:
2019-10-06T11:45:44+02:00 (5 years ago)
Author:
GerdP
Message:

fix #17453: GeoJSON export error (17453-v2.patch)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java

    r14154 r15429  
    55import java.math.BigDecimal;
    66import java.math.RoundingMode;
     7import java.util.Collection;
    78import java.util.HashMap;
     9import java.util.HashSet;
    810import java.util.Iterator;
    911import java.util.List;
    1012import java.util.Map;
    1113import java.util.Map.Entry;
     14import java.util.Set;
    1215import java.util.stream.Stream;
    1316
     
    4851    private final Projection projection;
    4952    private static final BooleanProperty SKIP_EMPTY_NODES = new BooleanProperty("geojson.export.skip-empty-nodes", true);
     53    private static final BooleanProperty UNTAGGED_CLOSED_IS_POLYGON = new BooleanProperty("geojson.export.untagged-closed-is-polygon", false);
     54    private static final Set<Way> processedMultipolygonWays = new HashSet<>();
    5055
    5156    /**
     
    108113        public void visit(Way w) {
    109114            if (w != null) {
     115                if (!w.isTagged() && processedMultipolygonWays.contains(w)) {
     116                    // no need to write this object again
     117                    return;
     118                }
    110119                final JsonArrayBuilder array = getCoorsArray(w.getNodes());
    111                 if (w.isClosed() && ElemStyles.hasAreaElemStyle(w, false)) {
    112                     final JsonArrayBuilder container = Json.createArrayBuilder().add(array);
     120                boolean writeAsPolygon = w.isClosed() && ((!w.isTagged() && UNTAGGED_CLOSED_IS_POLYGON.get())
     121                        || ElemStyles.hasAreaElemStyle(w, false));
     122                if (writeAsPolygon) {
    113123                    geomObj.add("type", "Polygon");
    114                     geomObj.add("coordinates", container);
     124                    geomObj.add("coordinates", Json.createArrayBuilder().add(array));
    115125                } else {
    116126                    geomObj.add("type", "LineString");
     
    136146                final JsonArrayBuilder multiPolygon = Json.createArrayBuilder().add(polygon);
    137147                geomObj.add("coordinates", multiPolygon);
     148                processedMultipolygonWays.addAll(r.getMemberPrimitives(Way.class));
    138149            } catch (MultipolygonBuilder.JoinedPolygonCreationException ex) {
    139150                Logging.warn("GeoJSON: Failed to export multipolygon {0}", r.getUniqueId());
    140151                Logging.warn(ex);
    141152            }
     153        }
     154
     155        private JsonArrayBuilder getCoorsArray(Iterable<Node> nodes) {
     156            final JsonArrayBuilder builder = Json.createArrayBuilder();
     157            for (Node n : nodes) {
     158                LatLon ll = n.getCoor();
     159                if (ll != null) {
     160                    builder.add(getCoorArray(null, ll));
     161                }
     162            }
     163            return builder;
    142164        }
    143165    }
     
    153175    }
    154176
    155     private JsonArrayBuilder getCoorsArray(Iterable<Node> nodes) {
    156         final JsonArrayBuilder builder = Json.createArrayBuilder();
    157         for (Node n : nodes) {
    158             LatLon ll = n.getCoor();
    159             if (ll != null) {
    160                 builder.add(getCoorArray(null, ll));
    161             }
    162         }
    163         return builder;
    164     }
    165 
    166177    protected void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
    167178        if (p.isIncomplete() ||
     
    182193        final JsonObject geom = geomObj.build();
    183194
    184         // Build primitive JSON object
    185         array.add(Json.createObjectBuilder()
    186                 .add("type", "Feature")
    187                 .add("properties", prop.isEmpty() ? JsonValue.NULL : prop)
    188                 .add("geometry", geom.isEmpty() ? JsonValue.NULL : geom));
     195        if (!geom.isEmpty()) {
     196            // Build primitive JSON object
     197            array.add(Json.createObjectBuilder()
     198                    .add("type", "Feature")
     199                    .add("properties", prop.isEmpty() ? JsonValue.NULL : prop)
     200                    .add("geometry", geom.isEmpty() ? JsonValue.NULL : geom));
     201        }
    189202    }
    190203
     
    214227        JsonArrayBuilder array = Json.createArrayBuilder();
    215228        if (ds != null) {
    216             ds.allNonDeletedPrimitives().forEach(p -> appendPrimitive(p, array));
     229            processedMultipolygonWays.clear();
     230            Collection<OsmPrimitive> primitives = ds.allNonDeletedPrimitives();
     231            // Relations first
     232            for (OsmPrimitive p : primitives) {
     233                if (p instanceof Relation)
     234                    appendPrimitive(p, array);
     235            }
     236            for (OsmPrimitive p : primitives) {
     237                if (!(p instanceof Relation))
     238                    appendPrimitive(p, array);
     239            }
     240            processedMultipolygonWays.clear();
    217241        }
    218242        object.add("features", array);
Note: See TracChangeset for help on using the changeset viewer.