// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.modules.fr.paris.datasets.urbanisme; import java.util.ArrayList; import java.util.Iterator; import java.util.List; 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.plugins.opendata.core.datasets.WayCombiner; import org.openstreetmap.josm.plugins.opendata.modules.fr.paris.datasets.ParisDataSetHandler; import org.openstreetmap.josm.tools.UserCancelException; public class SanisettesHandler extends ParisDataSetHandler { public SanisettesHandler() { super(93); setName("Sanisettes"); getShpHandler().setCheckNodeProximity(true); } @Override public boolean acceptsFilename(String filename) { return acceptsShpFilename(filename, "sanisettes") || acceptsZipFilename(filename, "sanisettes"); } private boolean wayBelongsTo(Way a, List<Way> ways) { for (Way b : ways) { if (a.getNode(0).equals(b.getNode(0)) || a.getNode(0).equals(b.getNode(b.getNodesCount()-1)) || a.getNode(a.getNodesCount()-1).equals(b.getNode(0)) || a.getNode(a.getNodesCount()-1).equals(b.getNode(b.getNodesCount()-1))) { return true; } } return false; } private boolean wayProcessed(Way a, List<List<Way>> waysToCombine) { for (List<Way> ways : waysToCombine) { for (Way b : ways) { if (a.equals(b)) { return true; } } } return false; } @Override public void updateDataSet(DataSet ds) { List<Way> sourceWays = new ArrayList<>(ds.getWays()); List<List<Way>> waysToCombine = new ArrayList<>(); for (Iterator<Way> it = sourceWays.iterator(); it.hasNext();) { Way w = it.next(); it.remove(); if (!wayProcessed(w, waysToCombine)) { List<Way> list = new ArrayList<>(); list.add(w); boolean finished = false; List<Way> sourceWays2 = new ArrayList<>(sourceWays); while (!finished) { int before = list.size(); for (Iterator<Way> it2 = sourceWays2.iterator(); it2.hasNext();) { Way w2 = it2.next(); if (wayBelongsTo(w2, list)) { list.add(w2); it2.remove(); } } int after = list.size(); finished = (after == before); } if (list.size() > 1) { waysToCombine.add(list); } } } for (List<Way> ways : waysToCombine) { try { WayCombiner.combineWays(ways); } catch (UserCancelException e) { return; } } for (Way w : ds.getWays()) { if (w.getNodesCount() <= 3) { ds.removePrimitive(w); for (Node n : w.getNodes()) { ds.removePrimitive(n); } } else { w.put("amenity", "toilets"); } } } @Override protected String getDirectLink() { return PORTAL+"hn/sanisettes.zip"; } }