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

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

see #7307 - GeoJSON export: add generator:JOSM and bbox

File size: 3.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import java.util.Iterator;
5import java.util.Map;
6import java.util.Map.Entry;
7
8import org.json.JSONStringer;
9import org.openstreetmap.josm.data.Bounds;
10import org.openstreetmap.josm.data.coor.LatLon;
11import org.openstreetmap.josm.data.osm.Changeset;
12import org.openstreetmap.josm.data.osm.Node;
13import org.openstreetmap.josm.data.osm.OsmPrimitive;
14import org.openstreetmap.josm.data.osm.Relation;
15import org.openstreetmap.josm.data.osm.Way;
16import org.openstreetmap.josm.data.osm.visitor.Visitor;
17import org.openstreetmap.josm.gui.layer.OsmDataLayer;
18
19public class GeoJSONWriter implements Visitor {
20
21 private OsmDataLayer layer;
22 private JSONStringer out;
23 private static final boolean skipEmptyNodes = true;
24
25 public GeoJSONWriter(OsmDataLayer layer) {
26 this.layer = layer;
27 }
28
29 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();
43 }
44
45 @Override
46 public void visit(Node n) {
47 out.key("type").value("Point").key("coordinates");
48 appendCoord(n.getCoor());
49 }
50
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) {
69 if (p.isIncomplete()) {
70 return;
71 } else if (skipEmptyNodes && p instanceof Node && p.getKeys().isEmpty()) {
72 return;
73 }
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());
79 }
80 out.endObject();
81 // append primitive specific
82 out.key("geometry").object();
83 p.accept(this);
84 out.endObject();
85 out.endObject();
86 }
87
88 protected void appendCoord(LatLon c) {
89 if (c != null) {
90 out.array().value(c.lon()).value(c.lat()).endArray();
91 }
92 }
93
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);
102 }
103 }
104
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();
110 }
111 }
112}
Note: See TracBrowser for help on using the repository browser.