// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets; import static org.openstreetmap.josm.tools.I18n.marktr; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.ActionEvent; import java.net.MalformedURLException; import java.util.Collection; import java.util.Collections; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.JosmAction; 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.Relation; import org.openstreetmap.josm.data.osm.Tag; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; import org.openstreetmap.josm.data.osm.event.DataChangedEvent; import org.openstreetmap.josm.data.osm.event.DataSetListener; import org.openstreetmap.josm.data.osm.event.NodeMovedEvent; import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent; import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent; import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent; import org.openstreetmap.josm.data.osm.event.TagsChangedEvent; import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; import org.openstreetmap.josm.plugins.opendata.OdPlugin; import org.openstreetmap.josm.plugins.opendata.core.datasets.DataSetCategory; import org.openstreetmap.josm.plugins.opendata.core.datasets.fr.FrenchDataSetHandler; import org.openstreetmap.josm.plugins.opendata.core.layers.OdDataLayer; import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.ToulouseConstants; import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.ToulouseLicense; import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.ToulouseModule; import org.openstreetmap.josm.plugins.utilsplugin2.selection.NodeWayUtils; public abstract class ToulouseDataSetHandler extends FrenchDataSetHandler implements ToulouseConstants { /** * Categories */ public static final DataSetCategory CAT_ASSOCIATIONS = new DataSetCategory("Associations", "styles/standard/people.png"); public static final DataSetCategory CAT_CITOYENNETE = new DataSetCategory("Citoyenneté", "presets/townhall.png"); public static final DataSetCategory CAT_CULTURE = new DataSetCategory("Culture", "presets/arts_centre.png"); public static final DataSetCategory CAT_ENFANCE = new DataSetCategory("Enfance", "presets/kindergarten.png"); public static final DataSetCategory CAT_ENVIRONNEMENT = new DataSetCategory("Environnement", "styles/standard/service/recycling/recycling_container.svg"); public static final DataSetCategory CAT_PATRIMOINE = new DataSetCategory("Patrimoine", "presets/ruins.png"); public static final DataSetCategory CAT_SERVICES = new DataSetCategory("Services", "styles/standard/vehicle/services.png"); public static final DataSetCategory CAT_SPORT = new DataSetCategory("Sport", "styles/standard/sport/soccer.png"); public static final DataSetCategory CAT_TOPOGRAPHIE = new DataSetCategory("Topographie", "presets/peak.svg"); public static final DataSetCategory CAT_TRANSPORT = new DataSetCategory("Transport", "presets/bus.png"); public static final DataSetCategory CAT_URBANISME = new DataSetCategory("Urbanisme", "styles/standard/place/settlement/city.png"); public ToulouseDataSetHandler(int portalId) { init(portalId); } public ToulouseDataSetHandler(int portalId, String relevantTag) { super(relevantTag); init(portalId); } public ToulouseDataSetHandler(int portalId, boolean relevantUnion, String ... relevantTags) { super(relevantUnion, relevantTags); init(portalId); } public ToulouseDataSetHandler(int portalId, String ... relevantTags) { this(portalId, false, relevantTags); } /*public ToulouseDataSetHandler(int portalId, Tag relevantTag) { super(relevantTag); init(portalId); }*/ public ToulouseDataSetHandler(int portalId, boolean relevantUnion, Tag ... relevantTags) { super(relevantUnion, relevantTags); init(portalId); } /*public ToulouseDataSetHandler(int portalId, Tag ... relevantTags) { this(portalId, false, relevantTags); }*/ private void init(int portalId) { try { setLicense(new ToulouseLicense()); if (portalId > 0) { String url = PORTAL + "/les-donnees/-/opendata/card/" + portalId + "--"; setLocalPortalURL(url); //setLicenseURL(url+"/license"); setDataURL(url+"/resource/document"); } addTool(new SplitByMunicipality()); addTool(new SplitBySector()); addTool(new SplitByNeighbourhood()); } catch (MalformedURLException e) { e.printStackTrace(); } } @Override public String getSource() { return SOURCE_TOULOUSE_METROPOLE; } @Override public String getLocalPortalIconName() { return ICON_CROIX_24; } @Override public String getDataLayerIconName() { return ICON_CROIX_16; } protected final void setWikiPage(String wikiPage) { if (wikiPage != null && !wikiPage.isEmpty()) { setName(wikiPage.replace("_", " ")); try { setWikiURL(WIKI + "/" + wikiPage.replace(" ", "_")); } catch (MalformedURLException e) { e.printStackTrace(); } } } protected abstract class SplitAction extends JosmAction implements DataSetListener { public SplitAction(String name, String desc) { super(name, null, desc, null, false); setEnabled(false); ToulouseModule.data.addDataSetListener(this); } protected abstract Collection<Relation> getBoundaries(); @Override public void actionPerformed(ActionEvent e) { final String baseName = OdPlugin.getInstance().getDialog().getDataLayer().getName(); final DataSet baseDs = Main.getLayerManager().getEditDataSet(); for (OsmPrimitive boundary : getBoundaries()) { DataSet data = new DataSet(); for (OsmPrimitive p : NodeWayUtils.selectAllInside(Collections.singleton(boundary), baseDs)) { if (p instanceof Node) { data.addPrimitive(new Node((Node) p)); } else if (p instanceof Way) { data.addPrimitive(new Way((Way) p)); } else if (p instanceof Relation) { data.addPrimitive(new Relation((Relation) p)); } } if (!data.allPrimitives().isEmpty()) { String name = boundary.get("name"); if (name == null || name.isEmpty()) { name = boundary.get("ref"); } if (name == null || name.isEmpty()) { name = boundary.get("description"); } Main.getLayerManager().addLayer(new OdDataLayer(data, baseName+"/"+name, null, ToulouseDataSetHandler.this)); } } } @Override public void dataChanged(DataChangedEvent event) { setEnabled(!getBoundaries().isEmpty()); } @Override public void primitivesAdded(PrimitivesAddedEvent event) { } @Override public void primitivesRemoved(PrimitivesRemovedEvent event) { } @Override public void tagsChanged(TagsChangedEvent event) { } @Override public void nodeMoved(NodeMovedEvent event) { } @Override public void wayNodesChanged(WayNodesChangedEvent event) { } @Override public void relationMembersChanged(RelationMembersChangedEvent event) { } @Override public void otherDatasetChange(AbstractDatasetChangedEvent event) { } } protected class SplitByMunicipality extends SplitAction { public SplitByMunicipality() { super(marktr("Split by municipality"), tr("Split this data by municipality (admin_level=8).")); } @Override protected Collection<Relation> getBoundaries() { return ToulouseModule.getMunicipalities(); } } protected class SplitBySector extends SplitAction { public SplitBySector() { super(marktr("Split by sector"), tr("Split this data by sector (admin_level=10).")); } @Override protected Collection<Relation> getBoundaries() { return ToulouseModule.getSectors(); } } protected class SplitByNeighbourhood extends SplitAction { public SplitByNeighbourhood() { super(marktr("Split by neighbourhood"), tr("Split this data by neighbourhood (admin_level=11).")); } @Override protected Collection<Relation> getBoundaries() { return ToulouseModule.getNeighbourhoods(); } } @Override public void notifyActive() { ToulouseModule.downloadData(); } }