source: josm/trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java@ 7025

Last change on this file since 7025 was 7005, checked in by Don-vip, 10 years ago

see #8465 - use diamond operator where applicable

File size: 5.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import java.io.StringWriter;
5import java.util.HashMap;
6import java.util.Iterator;
7import java.util.Map;
8import java.util.Map.Entry;
9
10import javax.json.Json;
11import javax.json.JsonArrayBuilder;
12import javax.json.JsonObjectBuilder;
13import javax.json.JsonWriter;
14import javax.json.stream.JsonGenerator;
15
16import org.openstreetmap.josm.data.Bounds;
17import org.openstreetmap.josm.data.coor.LatLon;
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;
22import org.openstreetmap.josm.data.osm.Node;
23import org.openstreetmap.josm.data.osm.OsmPrimitive;
24import org.openstreetmap.josm.data.osm.Way;
25import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
26import org.openstreetmap.josm.gui.layer.OsmDataLayer;
27
28/**
29 * Writes OSM data as a GeoJSON string, using JSR 353: Java API for JSON Processing (JSON-P).
30 */
31public class GeoJSONWriter {
32
33 private OsmDataLayer layer;
34 private static final boolean skipEmptyNodes = true;
35
36 /**
37 * Constructs a new {@code GeoJSONWriter}.
38 * @param layer The OSM data layer to save
39 */
40 public GeoJSONWriter(OsmDataLayer layer) {
41 this.layer = layer;
42 }
43
44 /**
45 * Writes OSM data as a GeoJSON string (prettified).
46 * @return The GeoJSON data
47 */
48 public String write() {
49 return write(true);
50 }
51
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<>(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;
72 }
73
74 private static class GeometryPrimitiveVisitor implements PrimitiveVisitor {
75
76 private final JsonObjectBuilder geomObj;
77
78 public GeometryPrimitiveVisitor(JsonObjectBuilder geomObj) {
79 this.geomObj = geomObj;
80 }
81
82 @Override
83 public void visit(INode n) {
84 geomObj.add("type", "Point");
85 LatLon ll = n.getCoor();
86 if (ll != null) {
87 geomObj.add("coordinates", getCoorArray(n.getCoor()));
88 }
89 }
90
91 @Override
92 public void visit(IWay w) {
93 geomObj.add("type", "LineString");
94 if (w instanceof Way) {
95 JsonArrayBuilder array = Json.createArrayBuilder();
96 for (Node n : ((Way)w).getNodes()) {
97 LatLon ll = n.getCoor();
98 if (ll != null) {
99 array.add(getCoorArray(ll));
100 }
101 }
102 geomObj.add("coordinates", array);
103 }
104 }
105
106 @Override
107 public void visit(IRelation r) {
108 }
109
110 private JsonArrayBuilder getCoorArray(LatLon c) {
111 return Json.createArrayBuilder().add(c.lon()).add(c.lat());
112 }
113 }
114
115 protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
116 if (p.isIncomplete()) {
117 return;
118 } else if (skipEmptyNodes && p instanceof Node && p.getKeys().isEmpty()) {
119 return;
120 }
121
122 // Properties
123 final JsonObjectBuilder propObj = Json.createObjectBuilder();
124 for (Entry<String, String> t : p.getKeys().entrySet()) {
125 propObj.add(t.getKey(), t.getValue());
126 }
127
128 // Geometry
129 final JsonObjectBuilder geomObj = Json.createObjectBuilder();
130 p.accept(new GeometryPrimitiveVisitor(geomObj));
131
132 // Build primitive JSON object
133 array.add(Json.createObjectBuilder()
134 .add("type", "Feature")
135 .add("properties", propObj)
136 .add("geometry", geomObj));
137 }
138
139 protected static void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
140 if (ds != null) {
141 Iterator<Bounds> it = ds.getDataSourceBounds().iterator();
142 if (it.hasNext()) {
143 Bounds b = new Bounds(it.next());
144 while (it.hasNext()) {
145 b.extend(it.next());
146 }
147 appendBounds(b, object);
148 }
149 }
150 }
151
152 protected static void appendBounds(Bounds b, JsonObjectBuilder object) {
153 if (b != null) {
154 object.add("bbox", Json.createArrayBuilder()
155 .add(b.getMinLon()).add(b.getMinLat())
156 .add(b.getMaxLon()).add(b.getMaxLat()));
157 }
158 }
159
160 protected static void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) {
161 JsonArrayBuilder array = Json.createArrayBuilder();
162 if (ds != null) {
163 for (Node n : ds.getNodes()) {
164 appendPrimitive(n, array);
165 }
166 for (Way w : ds.getWays()) {
167 appendPrimitive(w, array);
168 }
169 }
170 object.add("features", array);
171 }
172}
Note: See TracBrowser for help on using the repository browser.