Ignore:
Timestamp:
2014-01-27T00:13:24+01:00 (11 years ago)
Author:
Don-vip
Message:

fix #9590 - replace org.json with GPL-compliant jsonp + remove mention of old world image removed in r1680

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java

    r6485 r6756  
    22package org.openstreetmap.josm.io;
    33
     4import java.io.StringWriter;
     5import java.util.HashMap;
    46import java.util.Iterator;
    57import java.util.Map;
    68import java.util.Map.Entry;
    79
    8 import org.json.JSONStringer;
     10import javax.json.Json;
     11import javax.json.JsonArrayBuilder;
     12import javax.json.JsonObjectBuilder;
     13import javax.json.JsonWriter;
     14import javax.json.stream.JsonGenerator;
     15
    916import org.openstreetmap.josm.data.Bounds;
    1017import org.openstreetmap.josm.data.coor.LatLon;
    11 import org.openstreetmap.josm.data.osm.Changeset;
     18import org.openstreetmap.josm.data.osm.DataSet;
     19import org.openstreetmap.josm.data.osm.INode;
     20import org.openstreetmap.josm.data.osm.IRelation;
     21import org.openstreetmap.josm.data.osm.IWay;
    1222import org.openstreetmap.josm.data.osm.Node;
    1323import org.openstreetmap.josm.data.osm.OsmPrimitive;
    14 import org.openstreetmap.josm.data.osm.Relation;
    1524import org.openstreetmap.josm.data.osm.Way;
    16 import org.openstreetmap.josm.data.osm.visitor.Visitor;
     25import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
    1726import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    1827
    19 public class GeoJSONWriter implements Visitor {
     28/**
     29 * Writes OSM data as a GeoJSON string, using JSR 353: Java API for JSON Processing (JSON-P).
     30 */
     31public class GeoJSONWriter {
    2032
    2133    private OsmDataLayer layer;
    22     private JSONStringer out;
    2334    private static final boolean skipEmptyNodes = true;
    2435
     36    /**
     37     * Constructs a new {@code GeoJSONWriter}.
     38     * @param layer The OSM data layer to save
     39     */
    2540    public GeoJSONWriter(OsmDataLayer layer) {
    2641        this.layer = layer;
    2742    }
    2843
     44    /**
     45     * Writes OSM data as a GeoJSON string (prettified).
     46     * @return The GeoJSON data
     47     */
    2948    public String write() {
    30         out = new JSONStringer();
    31         out.object().key("type").value("FeatureCollection");
    32         out.key("generator").value("JOSM");
    33         appendLayerBounds();
    34         out.key("features").array();
    35         for (Node n : layer.data.getNodes()) {
    36             appendPrimitive(n);
    37         }
    38         for (Way w : layer.data.getWays()) {
    39             appendPrimitive(w);
    40         }
    41         out.endArray().endObject();
    42         return out.toString();
     49        return write(true);
    4350    }
    4451
    45     @Override
    46     public void visit(Node n) {
    47         out.key("type").value("Point").key("coordinates");
    48         appendCoord(n.getCoor());
     52    /**
     53     * Writes OSM data as a GeoJSON string (prettified or not).
     54     * @param pretty {@code true} to have pretty output, {@code false} otherwise
     55     * @return The GeoJSON data
     56     * @since 6756
     57     */
     58    public String write(boolean pretty) {
     59        StringWriter stringWriter = new StringWriter();
     60        Map<String, Object> config = new HashMap<String, Object>(1);
     61        config.put(JsonGenerator.PRETTY_PRINTING, pretty);
     62        JsonWriter writer = Json.createWriterFactory(config).createWriter(stringWriter);
     63        JsonObjectBuilder object = Json.createObjectBuilder()
     64                .add("type", "FeatureCollection")
     65                .add("generator", "JOSM");
     66        appendLayerBounds(layer.data, object);
     67        appendLayerFeatures(layer.data, object);
     68        writer.writeObject(object.build());
     69        String result = stringWriter.toString();
     70        writer.close();
     71        return result;
    4972    }
    5073
    51     @Override
    52     public void visit(Way w) {
    53         out.key("type").value("LineString").key("coordinates").array();
    54         for (Node n : w.getNodes()) {
    55             appendCoord(n.getCoor());
    56         }
    57         out.endArray();
    58     }
    59 
    60     @Override
    61     public void visit(Relation e) {
    62     }
    63 
    64     @Override
    65     public void visit(Changeset cs) {
    66     }
    67 
    68     protected void appendPrimitive(OsmPrimitive p) {
     74    protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
    6975        if (p.isIncomplete()) {
    7076            return;
     
    7278            return;
    7379        }
    74         out.object().key("type").value("Feature");
    75         Map<String, String> tags = p.getKeys();
    76         out.key("properties").object();
    77         for (Entry<String, String> t : tags.entrySet()) {
    78             out.key(t.getKey()).value(t.getValue());
     80
     81        // Properties
     82        final JsonObjectBuilder propObj = Json.createObjectBuilder();
     83        for (Entry<String, String> t : p.getKeys().entrySet()) {
     84            propObj.add(t.getKey(), t.getValue());
    7985        }
    80         out.endObject();
    81         // append primitive specific
    82         out.key("geometry").object();
    83         p.accept(this);
    84         out.endObject();
    85         out.endObject();
     86
     87        // Geometry
     88        final JsonObjectBuilder geomObj = Json.createObjectBuilder();
     89        p.accept(new PrimitiveVisitor() {
     90            @Override
     91            public void visit(INode n) {
     92                geomObj.add("type", "Point");
     93                LatLon ll = n.getCoor();
     94                if (ll != null) {
     95                    geomObj.add("coordinates", getCoorArray(n.getCoor()));
     96                }
     97            }
     98
     99            @Override
     100            public void visit(IWay w) {
     101                geomObj.add("type", "LineString");
     102                if (w instanceof Way) {
     103                    JsonArrayBuilder array = Json.createArrayBuilder();
     104                    for (Node n : ((Way)w).getNodes()) {
     105                        LatLon ll = n.getCoor();
     106                        if (ll != null) {
     107                            array.add(getCoorArray(ll));
     108                        }
     109                    }
     110                    geomObj.add("coordinates", array);
     111                }
     112            }
     113
     114            @Override
     115            public void visit(IRelation r) {
     116            }
     117
     118            private JsonArrayBuilder getCoorArray(LatLon c) {
     119                return Json.createArrayBuilder().add(c.lon()).add(c.lat());
     120            }
     121        });
     122
     123        // Build primitive JSON object
     124        array.add(Json.createObjectBuilder()
     125                .add("type", "Feature")
     126                .add("properties", propObj)
     127                .add("geometry", geomObj));
    86128    }
    87129
    88     protected void appendCoord(LatLon c) {
    89         if (c != null) {
    90             out.array().value(c.lon()).value(c.lat()).endArray();
     130    protected static void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
     131        if (ds != null) {
     132            Iterator<Bounds> it = ds.getDataSourceBounds().iterator();
     133            if (it.hasNext()) {
     134                Bounds b = new Bounds(it.next());
     135                while (it.hasNext()) {
     136                    b.extend(it.next());
     137                }
     138                appendBounds(b, object);
     139            }
    91140        }
    92141    }
    93142
    94     protected void appendLayerBounds() {
    95         Iterator<Bounds> it = layer.data.getDataSourceBounds().iterator();
    96         if (it.hasNext()) {
    97             Bounds b = new Bounds(it.next());
    98             while (it.hasNext()) {
    99                 b.extend(it.next());
    100             }
    101             appendBounds(b);
     143    protected static void appendBounds(Bounds b, JsonObjectBuilder object) {
     144        if (b != null) {
     145            object.add("bbox", Json.createArrayBuilder()
     146                    .add(b.getMinLon()).add(b.getMinLat())
     147                    .add(b.getMaxLon()).add(b.getMaxLat()));
    102148        }
    103149    }
    104150
    105     protected void appendBounds(Bounds b) {
    106         if (b != null) {
    107             out.key("bbox").array()
    108             .value(b.getMinLon()).value(b.getMinLat())
    109             .value(b.getMaxLon()).value(b.getMaxLat()).endArray();
     151    protected static void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) {
     152        JsonArrayBuilder array = Json.createArrayBuilder();
     153        if (ds != null) {
     154            for (Node n : ds.getNodes()) {
     155                appendPrimitive(n, array);
     156            }
     157            for (Way w : ds.getWays()) {
     158                appendPrimitive(w, array);
     159            }
    110160        }
     161        object.add("features", array);
    111162    }
    112163}
Note: See TracChangeset for help on using the changeset viewer.