Ticket #10770: 10770.patch
File 10770.patch, 9.4 KB (added by , 10 years ago) |
---|
-
src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
diff --git a/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java b/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java index df273c0..ee9d167 100644
a b 91 91 92 92 exporters = new ArrayList<>(); 93 93 94 String[] exporterNames = { 95 "org.openstreetmap.josm.io.GpxExporter", 96 "org.openstreetmap.josm.io.OsmExporter", 97 "org.openstreetmap.josm.io.OsmGzipExporter", 98 "org.openstreetmap.josm.io.OsmBzip2Exporter", 99 "org.openstreetmap.josm.io.GeoJSONExporter", 100 "org.openstreetmap.josm.io.WMSLayerExporter", 101 "org.openstreetmap.josm.io.NoteExporter" 94 Class[] exporterClasses = { 95 org.openstreetmap.josm.io.GpxExporter.class, 96 org.openstreetmap.josm.io.OsmExporter.class, 97 org.openstreetmap.josm.io.OsmGzipExporter.class, 98 org.openstreetmap.josm.io.OsmBzip2Exporter.class, 99 org.openstreetmap.josm.io.GeoJSONExporter.CurrentProjection.class, // needs to be considered earlier than GeoJSONExporter 100 org.openstreetmap.josm.io.GeoJSONExporter.class, 101 org.openstreetmap.josm.io.WMSLayerExporter.class, 102 org.openstreetmap.josm.io.NoteExporter.class 102 103 }; 103 104 104 for ( String classname : exporterNames) {105 for (Class exporterClass : exporterClasses) { 105 106 try { 106 FileExporter exporter = (FileExporter) Class.forName(classname).newInstance();107 FileExporter exporter = (FileExporter) exporterClass.newInstance(); 107 108 exporters.add(exporter); 108 109 MapView.addLayerChangeListener(exporter); 109 110 } catch (Exception e) { -
src/org/openstreetmap/josm/io/GeoJSONExporter.java
diff --git a/src/org/openstreetmap/josm/io/GeoJSONExporter.java b/src/org/openstreetmap/josm/io/GeoJSONExporter.java index f439848..eebecdd 100644
a b 9 9 import java.nio.charset.StandardCharsets; 10 10 import java.nio.file.Files; 11 11 12 import org.openstreetmap.josm.Main; 12 13 import org.openstreetmap.josm.actions.ExtensionFileFilter; 14 import org.openstreetmap.josm.data.projection.Projection; 13 15 import org.openstreetmap.josm.gui.layer.Layer; 14 16 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 17 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference; 18 import org.openstreetmap.josm.tools.Utils; 15 19 16 20 public class GeoJSONExporter extends FileExporter { 17 21 22 protected final Projection projection; 18 23 public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter( 19 24 "geojson,json", "geojson", tr("GeoJSON Files") + " (*.geojson *.json)"); 25 public static final ExtensionFileFilter FILE_FILTER_PROJECTED = new ExtensionFileFilter( 26 "proj.geojson", "proj.geojson", tr("Projected GeoJSON Files") + " (*.proj.geojson)"); 27 28 public static class CurrentProjection extends GeoJSONExporter { 29 public CurrentProjection() { 30 super(FILE_FILTER_PROJECTED, null); 31 } 32 } 20 33 21 34 /** 22 * Constructs a new {@code GeoJSONExporter} .35 * Constructs a new {@code GeoJSONExporter} with WGS84 projection. 23 36 */ 24 37 public GeoJSONExporter() { 25 super(FILE_FILTER); 38 this(FILE_FILTER, ProjectionPreference.wgs84.getProjection()); 39 } 40 41 private GeoJSONExporter(ExtensionFileFilter fileFilter, Projection projection) { 42 super(fileFilter); 43 this.projection = projection; 26 44 } 27 45 28 46 @Override 29 47 public void exportData(File file, Layer layer) throws IOException { 30 48 if (layer instanceof OsmDataLayer) { 31 String json = new GeoJSONWriter((OsmDataLayer) layer ).write();49 String json = new GeoJSONWriter((OsmDataLayer) layer, Utils.firstNonNull(projection, Main.getProjection())).write(); 32 50 try (Writer out = Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8)) { 33 51 out.write(json); 34 52 } -
src/org/openstreetmap/josm/io/GeoJSONWriter.java
diff --git a/src/org/openstreetmap/josm/io/GeoJSONWriter.java b/src/org/openstreetmap/josm/io/GeoJSONWriter.java index a248abd..22c57d2 100644
a b 14 14 import javax.json.stream.JsonGenerator; 15 15 16 16 import org.openstreetmap.josm.data.Bounds; 17 import org.openstreetmap.josm.data.coor.EastNorth; 17 18 import org.openstreetmap.josm.data.coor.LatLon; 18 19 import org.openstreetmap.josm.data.osm.DataSet; 19 20 import org.openstreetmap.josm.data.osm.INode; … … 23 24 import org.openstreetmap.josm.data.osm.OsmPrimitive; 24 25 import org.openstreetmap.josm.data.osm.Way; 25 26 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor; 27 import org.openstreetmap.josm.data.projection.Projection; 26 28 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 27 29 28 30 /** … … 30 32 */ 31 33 public class GeoJSONWriter { 32 34 33 private OsmDataLayer layer; 35 private final OsmDataLayer layer; 36 private final Projection projection; 34 37 private static final boolean skipEmptyNodes = true; 35 38 36 39 /** 37 40 * Constructs a new {@code GeoJSONWriter}. 38 41 * @param layer The OSM data layer to save 42 * @param projection The projection to use for coordinates 39 43 */ 40 public GeoJSONWriter(OsmDataLayer layer ) {44 public GeoJSONWriter(OsmDataLayer layer, Projection projection) { 41 45 this.layer = layer; 46 this.projection = projection; 42 47 } 43 48 44 49 /** … … public String write(boolean pretty) { 62 67 try (JsonWriter writer = Json.createWriterFactory(config).createWriter(stringWriter)) { 63 68 JsonObjectBuilder object = Json.createObjectBuilder() 64 69 .add("type", "FeatureCollection") 70 .add("crs", Json.createObjectBuilder().add("type", "name").add("name", projection.toCode())) 65 71 .add("generator", "JOSM"); 66 72 appendLayerBounds(layer.data, object); 67 73 appendLayerFeatures(layer.data, object); … … public String write(boolean pretty) { 70 76 } 71 77 } 72 78 73 private staticclass GeometryPrimitiveVisitor implements PrimitiveVisitor {79 private class GeometryPrimitiveVisitor implements PrimitiveVisitor { 74 80 75 81 private final JsonObjectBuilder geomObj; 76 82 … … public void visit(INode n) { 83 89 geomObj.add("type", "Point"); 84 90 LatLon ll = n.getCoor(); 85 91 if (ll != null) { 86 geomObj.add("coordinates", getCoorArray( n.getCoor()));92 geomObj.add("coordinates", getCoorArray(Json.createArrayBuilder(), n.getCoor())); 87 93 } 88 94 } 89 95 … … public void visit(IWay w) { 95 101 for (Node n : ((Way) w).getNodes()) { 96 102 LatLon ll = n.getCoor(); 97 103 if (ll != null) { 98 array.add(getCoorArray( ll));104 array.add(getCoorArray(Json.createArrayBuilder(), ll)); 99 105 } 100 106 } 101 107 geomObj.add("coordinates", array); … … public void visit(IWay w) { 105 111 @Override 106 112 public void visit(IRelation r) { 107 113 } 114 } 115 116 private JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, LatLon c) { 117 return getCoorArray(builder, projection.latlon2eastNorth(c)); 118 } 108 119 109 private JsonArrayBuilder getCoorArray(LatLon c) { 110 return Json.createArrayBuilder().add(c.lon()).add(c.lat()); 111 } 120 private JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, EastNorth c) { 121 return builder.add(c.getX()).add(c.getY()); 112 122 } 113 123 114 protected staticvoid appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {124 protected void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) { 115 125 if (p.isIncomplete()) { 116 126 return; 117 127 } else if (skipEmptyNodes && p instanceof Node && p.getKeys().isEmpty()) { … … protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) { 135 145 .add("geometry", geomObj)); 136 146 } 137 147 138 protected staticvoid appendLayerBounds(DataSet ds, JsonObjectBuilder object) {148 protected void appendLayerBounds(DataSet ds, JsonObjectBuilder object) { 139 149 if (ds != null) { 140 150 Iterator<Bounds> it = ds.getDataSourceBounds().iterator(); 141 151 if (it.hasNext()) { … … protected static void appendLayerBounds(DataSet ds, JsonObjectBuilder object) { 148 158 } 149 159 } 150 160 151 protected staticvoid appendBounds(Bounds b, JsonObjectBuilder object) {161 protected void appendBounds(Bounds b, JsonObjectBuilder object) { 152 162 if (b != null) { 153 object.add("bbox", Json.createArrayBuilder() 154 .add(b.getMinLon()).add(b.getMinLat()) 155 .add(b.getMaxLon()).add(b.getMaxLat())); 163 JsonArrayBuilder builder = Json.createArrayBuilder(); 164 getCoorArray(builder, b.getMin()); 165 getCoorArray(builder, b.getMax()); 166 object.add("bbox", builder); 156 167 } 157 168 } 158 169 159 protected staticvoid appendLayerFeatures(DataSet ds, JsonObjectBuilder object) {170 protected void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) { 160 171 JsonArrayBuilder array = Json.createArrayBuilder(); 161 172 if (ds != null) { 162 173 for (Node n : ds.getNodes()) {