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

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

fix some Sonar issues introduced recently

File size: 5.5 KB
RevLine 
[4886]1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
[6756]4import java.io.StringWriter;
5import java.util.HashMap;
[6485]6import java.util.Iterator;
[4886]7import java.util.Map;
8import java.util.Map.Entry;
[6484]9
[6756]10import javax.json.Json;
11import javax.json.JsonArrayBuilder;
12import javax.json.JsonObjectBuilder;
13import javax.json.JsonWriter;
14import javax.json.stream.JsonGenerator;
15
[6485]16import org.openstreetmap.josm.data.Bounds;
[4886]17import org.openstreetmap.josm.data.coor.LatLon;
[6756]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;
[4886]22import org.openstreetmap.josm.data.osm.Node;
23import org.openstreetmap.josm.data.osm.OsmPrimitive;
24import org.openstreetmap.josm.data.osm.Way;
[6756]25import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
[4886]26import org.openstreetmap.josm.gui.layer.OsmDataLayer;
27
[6756]28/**
29 * Writes OSM data as a GeoJSON string, using JSR 353: Java API for JSON Processing (JSON-P).
30 */
31public class GeoJSONWriter {
[4886]32
33 private OsmDataLayer layer;
[6246]34 private static final boolean skipEmptyNodes = true;
[4886]35
[6756]36 /**
37 * Constructs a new {@code GeoJSONWriter}.
38 * @param layer The OSM data layer to save
39 */
[4886]40 public GeoJSONWriter(OsmDataLayer layer) {
41 this.layer = layer;
42 }
43
[6756]44 /**
45 * Writes OSM data as a GeoJSON string (prettified).
46 * @return The GeoJSON data
47 */
[4886]48 public String write() {
[6756]49 return write(true);
[4886]50 }
51
[6756]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;
[4886]72 }
[6806]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 }
[4886]81
[6806]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
[6756]115 protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
[4886]116 if (p.isIncomplete()) {
117 return;
118 } else if (skipEmptyNodes && p instanceof Node && p.getKeys().isEmpty()) {
119 return;
120 }
[6756]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());
[4886]126 }
127
[6756]128 // Geometry
129 final JsonObjectBuilder geomObj = Json.createObjectBuilder();
[6806]130 p.accept(new GeometryPrimitiveVisitor(geomObj));
[6756]131
132 // Build primitive JSON object
133 array.add(Json.createObjectBuilder()
134 .add("type", "Feature")
135 .add("properties", propObj)
136 .add("geometry", geomObj));
[4886]137 }
[6485]138
[6756]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);
[6485]148 }
149 }
150 }
151
[6756]152 protected static void appendBounds(Bounds b, JsonObjectBuilder object) {
[6485]153 if (b != null) {
[6756]154 object.add("bbox", Json.createArrayBuilder()
155 .add(b.getMinLon()).add(b.getMinLat())
156 .add(b.getMaxLon()).add(b.getMaxLat()));
[6485]157 }
158 }
[6756]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 }
[4886]172}
Note: See TracBrowser for help on using the repository browser.