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

Last change on this file since 8803 was 8510, checked in by Don-vip, 9 years ago

checkstyle: enable relevant whitespace checks and fix them

  • Property svn:eol-style set to native
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 try (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 return stringWriter.toString();
70 }
71 }
72
73 private static class GeometryPrimitiveVisitor implements PrimitiveVisitor {
74
75 private final JsonObjectBuilder geomObj;
76
77 public GeometryPrimitiveVisitor(JsonObjectBuilder geomObj) {
78 this.geomObj = geomObj;
79 }
80
81 @Override
82 public void visit(INode n) {
83 geomObj.add("type", "Point");
84 LatLon ll = n.getCoor();
85 if (ll != null) {
86 geomObj.add("coordinates", getCoorArray(n.getCoor()));
87 }
88 }
89
90 @Override
91 public void visit(IWay w) {
92 geomObj.add("type", "LineString");
93 if (w instanceof Way) {
94 JsonArrayBuilder array = Json.createArrayBuilder();
95 for (Node n : ((Way) w).getNodes()) {
96 LatLon ll = n.getCoor();
97 if (ll != null) {
98 array.add(getCoorArray(ll));
99 }
100 }
101 geomObj.add("coordinates", array);
102 }
103 }
104
105 @Override
106 public void visit(IRelation r) {
107 }
108
109 private JsonArrayBuilder getCoorArray(LatLon c) {
110 return Json.createArrayBuilder().add(c.lon()).add(c.lat());
111 }
112 }
113
114 protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
115 if (p.isIncomplete()) {
116 return;
117 } else if (skipEmptyNodes && p instanceof Node && p.getKeys().isEmpty()) {
118 return;
119 }
120
121 // Properties
122 final JsonObjectBuilder propObj = Json.createObjectBuilder();
123 for (Entry<String, String> t : p.getKeys().entrySet()) {
124 propObj.add(t.getKey(), t.getValue());
125 }
126
127 // Geometry
128 final JsonObjectBuilder geomObj = Json.createObjectBuilder();
129 p.accept(new GeometryPrimitiveVisitor(geomObj));
130
131 // Build primitive JSON object
132 array.add(Json.createObjectBuilder()
133 .add("type", "Feature")
134 .add("properties", propObj)
135 .add("geometry", geomObj));
136 }
137
138 protected static void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
139 if (ds != null) {
140 Iterator<Bounds> it = ds.getDataSourceBounds().iterator();
141 if (it.hasNext()) {
142 Bounds b = new Bounds(it.next());
143 while (it.hasNext()) {
144 b.extend(it.next());
145 }
146 appendBounds(b, object);
147 }
148 }
149 }
150
151 protected static void appendBounds(Bounds b, JsonObjectBuilder object) {
152 if (b != null) {
153 object.add("bbox", Json.createArrayBuilder()
154 .add(b.getMinLon()).add(b.getMinLat())
155 .add(b.getMaxLon()).add(b.getMaxLat()));
156 }
157 }
158
159 protected static void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) {
160 JsonArrayBuilder array = Json.createArrayBuilder();
161 if (ds != null) {
162 for (Node n : ds.getNodes()) {
163 appendPrimitive(n, array);
164 }
165 for (Way w : ds.getWays()) {
166 appendPrimitive(w, array);
167 }
168 }
169 object.add("features", array);
170 }
171}
Note: See TracBrowser for help on using the repository browser.