Ticket #10770: 10770.patch

File 10770.patch, 9.4 KB (added by simon04, 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  
    9191
    9292        exporters = new ArrayList<>();
    9393
    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
    102103        };
    103104
    104         for (String classname : exporterNames) {
     105        for (Class exporterClass : exporterClasses) {
    105106            try {
    106                 FileExporter exporter = (FileExporter) Class.forName(classname).newInstance();
     107                FileExporter exporter = (FileExporter) exporterClass.newInstance();
    107108                exporters.add(exporter);
    108109                MapView.addLayerChangeListener(exporter);
    109110            } 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  
    99import java.nio.charset.StandardCharsets;
    1010import java.nio.file.Files;
    1111
     12import org.openstreetmap.josm.Main;
    1213import org.openstreetmap.josm.actions.ExtensionFileFilter;
     14import org.openstreetmap.josm.data.projection.Projection;
    1315import org.openstreetmap.josm.gui.layer.Layer;
    1416import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     17import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
     18import org.openstreetmap.josm.tools.Utils;
    1519
    1620public class GeoJSONExporter extends FileExporter {
    1721
     22    protected final Projection projection;
    1823    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
    1924            "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    }
    2033
    2134    /**
    22      * Constructs a new {@code GeoJSONExporter}.
     35     * Constructs a new {@code GeoJSONExporter} with WGS84 projection.
    2336     */
    2437    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;
    2644    }
    2745
    2846    @Override
    2947    public void exportData(File file, Layer layer) throws IOException {
    3048        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();
    3250            try (Writer out = Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8)) {
    3351                out.write(json);
    3452            }
  • 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  
    1414import javax.json.stream.JsonGenerator;
    1515
    1616import org.openstreetmap.josm.data.Bounds;
     17import org.openstreetmap.josm.data.coor.EastNorth;
    1718import org.openstreetmap.josm.data.coor.LatLon;
    1819import org.openstreetmap.josm.data.osm.DataSet;
    1920import org.openstreetmap.josm.data.osm.INode;
     
    2324import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2425import org.openstreetmap.josm.data.osm.Way;
    2526import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
     27import org.openstreetmap.josm.data.projection.Projection;
    2628import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    2729
    2830/**
     
    3032 */
    3133public class GeoJSONWriter {
    3234
    33     private OsmDataLayer layer;
     35    private final OsmDataLayer layer;
     36    private final Projection projection;
    3437    private static final boolean skipEmptyNodes = true;
    3538
    3639    /**
    3740     * Constructs a new {@code GeoJSONWriter}.
    3841     * @param layer The OSM data layer to save
     42     * @param projection The projection to use for coordinates
    3943     */
    40     public GeoJSONWriter(OsmDataLayer layer) {
     44    public GeoJSONWriter(OsmDataLayer layer, Projection projection) {
    4145        this.layer = layer;
     46        this.projection = projection;
    4247    }
    4348
    4449    /**
    public String write(boolean pretty) {  
    6267        try (JsonWriter writer = Json.createWriterFactory(config).createWriter(stringWriter)) {
    6368            JsonObjectBuilder object = Json.createObjectBuilder()
    6469                    .add("type", "FeatureCollection")
     70                    .add("crs", Json.createObjectBuilder().add("type", "name").add("name", projection.toCode()))
    6571                    .add("generator", "JOSM");
    6672            appendLayerBounds(layer.data, object);
    6773            appendLayerFeatures(layer.data, object);
    public String write(boolean pretty) {  
    7076        }
    7177    }
    7278
    73     private static class GeometryPrimitiveVisitor implements PrimitiveVisitor {
     79    private class GeometryPrimitiveVisitor implements PrimitiveVisitor {
    7480
    7581        private final JsonObjectBuilder geomObj;
    7682
    public void visit(INode n) {  
    8389            geomObj.add("type", "Point");
    8490            LatLon ll = n.getCoor();
    8591            if (ll != null) {
    86                 geomObj.add("coordinates", getCoorArray(n.getCoor()));
     92                geomObj.add("coordinates", getCoorArray(Json.createArrayBuilder(), n.getCoor()));
    8793            }
    8894        }
    8995
    public void visit(IWay w) {  
    95101                for (Node n : ((Way) w).getNodes()) {
    96102                    LatLon ll = n.getCoor();
    97103                    if (ll != null) {
    98                         array.add(getCoorArray(ll));
     104                        array.add(getCoorArray(Json.createArrayBuilder(), ll));
    99105                    }
    100106                }
    101107                geomObj.add("coordinates", array);
    public void visit(IWay w) {  
    105111        @Override
    106112        public void visit(IRelation r) {
    107113        }
     114    }
     115
     116    private JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, LatLon c) {
     117        return getCoorArray(builder, projection.latlon2eastNorth(c));
     118    }
    108119
    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());
    112122    }
    113123
    114     protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
     124    protected void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
    115125        if (p.isIncomplete()) {
    116126            return;
    117127        } else if (skipEmptyNodes && p instanceof Node && p.getKeys().isEmpty()) {
    protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {  
    135145                .add("geometry", geomObj));
    136146    }
    137147
    138     protected static void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
     148    protected void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
    139149        if (ds != null) {
    140150            Iterator<Bounds> it = ds.getDataSourceBounds().iterator();
    141151            if (it.hasNext()) {
    protected static void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {  
    148158        }
    149159    }
    150160
    151     protected static void appendBounds(Bounds b, JsonObjectBuilder object) {
     161    protected void appendBounds(Bounds b, JsonObjectBuilder object) {
    152162        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);
    156167        }
    157168    }
    158169
    159     protected static void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) {
     170    protected void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) {
    160171        JsonArrayBuilder array = Json.createArrayBuilder();
    161172        if (ds != null) {
    162173            for (Node n : ds.getNodes()) {