// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.modules.fr.paris.datasets.environnement; import java.util.Set; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.plugins.opendata.modules.fr.paris.datasets.ParisDataSetHandler; import org.openstreetmap.josm.plugins.opendata.modules.fr.paris.datasets.ParisShpHandler; import org.openstreetmap.josm.tools.Geometry; public class MobilierVoiePubliqueHandler extends ParisDataSetHandler { private final InternalShpHandler shpHandler = new InternalShpHandler(); public MobilierVoiePubliqueHandler() { super(96); setName("Mobiliers sur voie publique"); setShpHandler(shpHandler); } @Override public boolean acceptsFilename(String filename) { return acceptsShpFilename(filename, "environnement") || acceptsZipFilename(filename, "environnement"); } @Override protected String getDirectLink() { return PORTAL+"hn/environnement.zip"; } private final class InternalShpHandler extends ParisShpHandler { @Override public void notifyFeatureParsed(Object feature, DataSet result, Set<OsmPrimitive> featurePrimitives) { initFeaturesPrimitives(featurePrimitives); String type = dataPrimitive.get("Libelle"); if (type.startsWith("Banc ")) { if (closedWay == null && dataPrimitive instanceof Way && ((Way)dataPrimitive).getNodesCount() > 3) { // Some benches can be converted to closed ways by removing some extra nodes at the beginning Way copy = new Way((Way) dataPrimitive); while (copy.getNodesCount() > 3 && !copy.isClosed()) { copy.removeNode(copy.getNode(0)); } if (copy.isClosed()) { closedWay = copy; } else { // Try in the opposite direction (remove nodes from the end) copy = new Way((Way) dataPrimitive); while (copy.getNodesCount() > 3 && !copy.isClosed()) { copy.removeNode(copy.getNode(copy.getNodesCount()-1)); } if (copy.isClosed()) { closedWay = copy; } } } if (closedWay != null) { Node bench = createOrGetNode(result, Geometry.getCentroid(closedWay.getNodes())); bench.put("amenity", "bench"); bench.put("description", type); removePrimitives(result); } else { System.err.println("Bench without closed area: "+type); } } else if (type.startsWith("Poubelle") || type.startsWith("Borne de propreté")) { if (closedWay != null) { Node basket = createOrGetNode(result, Geometry.getCentroid(closedWay.getNodes())); basket.put("amenity", "waste_basket"); basket.put("description", type); removePrimitives(result); } else { System.err.println("Waste basket without closed area: "+type); } } else if (type.startsWith("Bac à sable")) { if (closedWay == null && dataPrimitive instanceof Way && ((Way)dataPrimitive).getNodesCount() == 2) { // Sandpits are badly built, fix them closedWay = (Way) dataPrimitive; for (Way w : ways) { if (w.getNodesCount() == 4) { Node n1 = w.getNode(1); Node n2 = w.getNode(2); if (closedWay.getNode(1).getCoor().distance(n1.getCoor()) < closedWay.getNode(1).getCoor().distance(n2.getCoor())) { closedWay.addNode(n1); closedWay.addNode(n2); } else { closedWay.addNode(n2); closedWay.addNode(n1); } closedWay.addNode(closedWay.getNode(0)); break; } } } if (closedWay != null) { // FIXME: lines commented as "sandpits" in this data set seem to be false data /*Node pg = createOrGetNode(result, Geometry.getCentroid(closedWay.getNodes())); pg.put("leisure", "playground"); pg.put("playground", "sandpit"); pg.put("description", type);*/ removePrimitives(result); } else { System.err.println("Sandpit without closed area: "+type); } } else if (type.startsWith("Corbeille florale")) { if (closedWay != null) { Node n = createOrGetNode(result, Geometry.getCentroid(closedWay.getNodes())); n.put("man_made", "floral_basket"); n.put("description", type); removePrimitives(result); } else { System.err.println("Floral basket without closed area: "+type); } } else if (type.startsWith("Objet sans identification particulière")) { //dataPrimitive.put("FIXME", "unknown object. DO NOT upload as it !"); removePrimitives(result); } else { System.err.println("Unsupported object type: "+type); } } } @Override public void updateDataSet(DataSet ds) { // Done in notifyFeatureParsed() for drastic performance reasons shpHandler.nodes.clear(); } }