Ticket #17453: 17453-v2.patch
| File 17453-v2.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 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 /** 52 57 * Constructs a new {@code GeoJSONWriter}. … … 107 112 @Override 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"); 117 127 geomObj.add("coordinates", array); … … 135 145 geomObj.add("type", "MultiPolygon"); 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 } 142 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; 164 } 143 165 } 144 166 145 167 private JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, LatLon c) { … … 152 174 .add(BigDecimal.valueOf(c.getY()).setScale(11, RoundingMode.HALF_UP)); 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() || 168 179 (SKIP_EMPTY_NODES.get() && p instanceof Node && p.getKeys().isEmpty())) { … … 181 192 p.accept(new GeometryPrimitiveVisitor(geomObj)); 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 191 204 protected void appendLayerBounds(DataSet ds, JsonObjectBuilder object) { … … 213 226 protected void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) { 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); 219 243 }
