// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.ecologie; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; 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.io.tabular.DefaultSpreadSheetHandler; import org.openstreetmap.josm.plugins.opendata.core.io.tabular.SpreadSheetReader.CoordinateColumns; import org.openstreetmap.josm.plugins.opendata.modules.fr.datagouvfr.datasets.DataGouvDataSetHandler; import org.openstreetmap.josm.tools.Pair; public class AssainissementHandler extends DataGouvDataSetHandler { public AssainissementHandler() { super("assainissement-collectif-30381843"); setName("Assainissement collectif"); setSpreadSheetHandler(new InternalOdsHandler()); } @Override public boolean acceptsFilename(String filename) { return acceptsOdsFilename(filename, "Export_ERU_20.."); } @Override public void updateDataSet(DataSet ds) { // Implemented in InternalOdsHandler.nodesAdded() } @Override public List<Pair<String, URL>> getDataURLs() { List<Pair<String, URL>> result = new ArrayList<>(); try { result.add(new Pair<>("Données 2009", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2.php"))); result.add(new Pair<>("Données 2010", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2_2010.php"))); result.add(new Pair<>("Données 2011", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2_2011.php"))); result.add(new Pair<>("Données 2012", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2_2012.php"))); result.add(new Pair<>("Données 2013", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2_2013.php"))); result.add(new Pair<>("Données 2014", new URL("http://www.assainissement.developpement-durable.gouv.fr/telecharger2_2014.php"))); } catch (MalformedURLException e) { e.printStackTrace(); } return result; } private final class InternalOdsHandler extends DefaultSpreadSheetHandler { private Node nodeWithKeys; private final Set<String> interestingKeys = new HashSet<>(); public InternalOdsHandler() { setSheetNumber(1); } private void updateTag(Node node, String odsKey, String osmKey) { String value = nodeWithKeys.get(odsKey); removeTag(odsKey); if (value != null && !value.isEmpty()) { addTag(node, osmKey, value); } } private void addTag(Node node, String osmKey, String value) { node.put(osmKey, value); interestingKeys.add(osmKey); } private void removeTag(String odsKey) { nodeWithKeys.remove(odsKey); } private void removeUninterestingTags() { for (String key : nodeWithKeys.getKeys().keySet()) { if (!interestingKeys.contains(key)) { nodeWithKeys.remove(key); } } } @Override public void nodesAdded(DataSet ds, Map<CoordinateColumns, Node> nodes, String[] header, int lineNumber) { Node steuNode = null; Node rejetNode = null; for (CoordinateColumns c : nodes.keySet()) { if (header[c.xCol].contains("STEU") && header[c.yCol].contains("STEU")) { steuNode = nodes.get(c); } else if (header[c.xCol].contains("rejet") && header[c.yCol].contains("rejet")) { rejetNode = nodes.get(c); } else { System.err.println("Line "+lineNumber+": Unexpected coordinate columns: "+c); } } if (steuNode == null || rejetNode == null) { System.err.println("Line "+lineNumber+": 'STEU' or 'rejet' information not found"); return; } nodeWithKeys = steuNode.hasKeys() ? steuNode : rejetNode; addTag(steuNode, "man_made", "wastewater_plant"); updateTag(steuNode, "Code du STEU", "ref"); updateTag(steuNode, "Nom du STEU", "name"); updateTag(steuNode, "Date de mise en service du STEU", "start_date"); updateTag(steuNode, "Date de mise hors service du STEU", "end_date"); updateTag(steuNode, "Exploitant", "operator"); updateTag(steuNode, "Capacité nominale en EH", "capacity"); updateTag(rejetNode, "Nom du milieu de rejet", "name"); Way pipeline = new Way(); pipeline.addNode(steuNode); pipeline.addNode(rejetNode); if (pipeline.getLength() > 1) { //pipeline.put("man_made", "pipeline"); //pipeline.put("type", "water"); ds.addPrimitive(pipeline); } removeUninterestingTags(); } } }