Changeset 15429 in josm
- Timestamp:
- 2019-10-06T11:45:44+02:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java
r14154 r15429 5 5 import java.math.BigDecimal; 6 6 import java.math.RoundingMode; 7 import java.util.Collection; 7 8 import java.util.HashMap; 9 import java.util.HashSet; 8 10 import java.util.Iterator; 9 11 import java.util.List; 10 12 import java.util.Map; 11 13 import java.util.Map.Entry; 14 import java.util.Set; 12 15 import java.util.stream.Stream; 13 16 … … 48 51 private final Projection projection; 49 52 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<>(); 50 55 51 56 /** … … 108 113 public void visit(Way w) { 109 114 if (w != null) { 115 if (!w.isTagged() && processedMultipolygonWays.contains(w)) { 116 // no need to write this object again 117 return; 118 } 110 119 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) { 113 123 geomObj.add("type", "Polygon"); 114 geomObj.add("coordinates", container);124 geomObj.add("coordinates", Json.createArrayBuilder().add(array)); 115 125 } else { 116 126 geomObj.add("type", "LineString"); … … 136 146 final JsonArrayBuilder multiPolygon = Json.createArrayBuilder().add(polygon); 137 147 geomObj.add("coordinates", multiPolygon); 148 processedMultipolygonWays.addAll(r.getMemberPrimitives(Way.class)); 138 149 } catch (MultipolygonBuilder.JoinedPolygonCreationException ex) { 139 150 Logging.warn("GeoJSON: Failed to export multipolygon {0}", r.getUniqueId()); 140 151 Logging.warn(ex); 141 152 } 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; 142 164 } 143 165 } … … 153 175 } 154 176 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 166 177 protected void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) { 167 178 if (p.isIncomplete() || … … 182 193 final JsonObject geom = geomObj.build(); 183 194 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 } 189 202 } 190 203 … … 214 227 JsonArrayBuilder array = Json.createArrayBuilder(); 215 228 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(); 217 241 } 218 242 object.add("features", array);
Note:
See TracChangeset
for help on using the changeset viewer.