package org.openstreetmap.josm.plugins.geojson;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import javax.swing.Action;
import javax.swing.Icon;
import org.geojson.Feature;
import org.geojson.FeatureCollection;
import org.geojson.GeoJsonObject;
import org.geojson.LineString;
import org.geojson.LngLatAlt;
import org.geojson.Polygon;
import org.openstreetmap.josm.data.Bounds;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
import org.openstreetmap.josm.data.osm.visitor.paint.MapRendererFactory;
import org.openstreetmap.josm.data.osm.visitor.paint.Rendering;
import org.openstreetmap.josm.gui.MapView;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.tools.ImageProvider;
/**
* Class that displays a map layer containing GeoJSON data.
*
* @author Ian Dees <ian.dees@gmail.com>
*
*/
public class GeoJsonLayer extends Layer {
private final DataSet data;
private Bounds bounds = null;
public GeoJsonLayer(String name, GeoJsonObject data) {
super(name);
this.data = new DataSet();
if (data instanceof FeatureCollection) {
FeatureCollection fc = (FeatureCollection) data;
for (Feature feature : fc) {
GeoJsonObject geometry = feature.getGeometry();
if (geometry instanceof LineString) {
Way w = new Way();
List<LngLatAlt> coordinates = ((LineString) geometry).getCoordinates();
List<Node> nodes = new ArrayList<Node>(coordinates.size());
for (LngLatAlt lngLatAlt : coordinates) {
LatLon latlon = new LatLon(lngLatAlt.getLatitude(), lngLatAlt.getLongitude());
if (bounds == null) {
bounds = new Bounds(latlon);
} else {
bounds.extend(latlon);
}
Node n = new Node(latlon);
this.data.addPrimitive(n);
nodes.add(n);
}
w.setNodes(nodes);
Map<String, Object> properties = feature.getProperties();
Map<String, String> tags = new TreeMap<String, String>();
for (Entry<String, Object> entry : properties.entrySet()) {
tags.put(entry.getKey(), entry.getValue().toString());
}
w.setKeys(tags);
this.data.addPrimitive(w);
} else if (geometry instanceof Polygon) {
Way w = new Way();
List<List<LngLatAlt>> coordinates = ((Polygon) geometry).getCoordinates();
List<Node> nodes = new ArrayList<Node>(coordinates.size());
for (LngLatAlt lngLatAlt : coordinates) {
LatLon latlon = new LatLon(lngLatAlt.getLatitude(), lngLatAlt.getLongitude());
if (bounds == null) {
bounds = new Bounds(latlon);
} else {
bounds.extend(latlon);
}
Node n = new Node(latlon);
this.data.addPrimitive(n);
nodes.add(n);
}
w.setNodes(nodes);
Map<String, Object> properties = feature.getProperties();
Map<String, String> tags = new TreeMap<String, String>();
for (Entry<String, Object> entry : properties.entrySet()) {
tags.put(entry.getKey(), entry.getValue().toString());
}
w.setKeys(tags);
this.data.addPrimitive(w);
}
}
}
}
@Override
public void paint(Graphics2D g, MapView mv, Bounds box) {
Rendering painter = MapRendererFactory.getInstance().createActiveRenderer(g, mv, false);
painter.render(data, false, box);
}
@Override
public Icon getIcon() {
return ImageProvider.get("data", "way");
}
@Override
public String getToolTipText() {
return "GeoJSON";
}
@Override
public void mergeFrom(Layer from) {
return;
}
@Override
public boolean isMergable(Layer other) {
return false;
}
@Override
public void visitBoundingBox(BoundingXYVisitor v) {
v.visit(bounds);
}
@Override
public Object getInfoComponent() {
// TODO Auto-generated method stub
return null;
}
@Override
public Action[] getMenuEntries() {
// TODO Auto-generated method stub
return null;
}
}