Ticket #17453: 17453.patch
| File 17453.patch, 5.5 KB (added by , 7 years ago) |
|---|
-
src/org/openstreetmap/josm/io/GeoJSONWriter.java
4 4 import java.io.StringWriter; 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 14 17 import javax.json.Json; … … 47 50 private final DataSet data; 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 Set<Way> processedMultipolygonWays = new HashSet<>(); 50 54 51 55 /** 52 56 * Constructs a new {@code GeoJSONWriter}. … … 108 112 public void visit(Way w) { 109 113 if (w != null) { 110 114 final JsonArrayBuilder array = getCoorsArray(w.getNodes()); 111 if (w.isClosed() && ElemStyles.hasAreaElemStyle(w, false)) { 112 final JsonArrayBuilder container = Json.createArrayBuilder().add(array); 113 geomObj.add("type", "Polygon"); 114 geomObj.add("coordinates", container); 115 if (w.isClosed()) { 116 if (ElemStyles.hasAreaElemStyle(w, false) || !processedMultipolygonWays.contains(w)) { 117 final JsonArrayBuilder container = Json.createArrayBuilder().add(array); 118 geomObj.add("type", "Polygon"); 119 geomObj.add("coordinates", container); 120 } 115 121 } else { 116 geomObj.add("type", "LineString"); 117 geomObj.add("coordinates", array); 122 if (w.isTagged() || !processedMultipolygonWays.contains(w)) { 123 geomObj.add("type", "LineString"); 124 geomObj.add("coordinates", array); 125 } 118 126 } 119 127 } 120 128 } … … 135 143 geomObj.add("type", "MultiPolygon"); 136 144 final JsonArrayBuilder multiPolygon = Json.createArrayBuilder().add(polygon); 137 145 geomObj.add("coordinates", multiPolygon); 146 processedMultipolygonWays.addAll(r.getMemberPrimitives(Way.class)); 138 147 } catch (MultipolygonBuilder.JoinedPolygonCreationException ex) { 139 148 Logging.warn("GeoJSON: Failed to export multipolygon {0}", r.getUniqueId()); 140 149 Logging.warn(ex); 141 150 } 142 151 } 152 153 private JsonArrayBuilder getCoorsArray(Iterable<Node> nodes) { 154 final JsonArrayBuilder builder = Json.createArrayBuilder(); 155 for (Node n : nodes) { 156 LatLon ll = n.getCoor(); 157 if (ll != null) { 158 builder.add(getCoorArray(null, ll)); 159 } 160 } 161 return builder; 162 } 143 163 } 144 164 145 165 private JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, LatLon c) { … … 152 172 .add(BigDecimal.valueOf(c.getY()).setScale(11, RoundingMode.HALF_UP)); 153 173 } 154 174 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 175 protected void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) { 167 176 if (p.isIncomplete() || 168 177 (SKIP_EMPTY_NODES.get() && p instanceof Node && p.getKeys().isEmpty())) { … … 181 190 p.accept(new GeometryPrimitiveVisitor(geomObj)); 182 191 final JsonObject geom = geomObj.build(); 183 192 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)); 193 if (!geom.isEmpty()) { 194 // Build primitive JSON object 195 array.add(Json.createObjectBuilder() 196 .add("type", "Feature") 197 .add("properties", prop.isEmpty() ? JsonValue.NULL : prop) 198 .add("geometry", geom.isEmpty() ? JsonValue.NULL : geom)); 199 } 189 200 } 190 201 191 202 protected void appendLayerBounds(DataSet ds, JsonObjectBuilder object) { … … 213 224 protected void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) { 214 225 JsonArrayBuilder array = Json.createArrayBuilder(); 215 226 if (ds != null) { 216 ds.allNonDeletedPrimitives().forEach(p -> appendPrimitive(p, array)); 227 processedMultipolygonWays.clear(); 228 Collection<OsmPrimitive> primitives = ds.allNonDeletedPrimitives(); 229 // Relations first 230 for (OsmPrimitive p : primitives) { 231 if (p instanceof Relation) 232 appendPrimitive(p, array); 233 } 234 for (OsmPrimitive p : primitives) { 235 if (!(p instanceof Relation)) 236 appendPrimitive(p, array); 237 } 238 processedMultipolygonWays.clear(); 217 239 } 218 240 object.add("features", array); 219 241 }
