diff --git a/CHANGELOG.md b/CHANGELOG.md index d47e2e0b6..b74fd480e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ included in the (note yet determined) next version number. **Development version** +- Emissions tools have been moved to core package (from ile_de_france) - No changes yet **1.5.0** diff --git a/ile_de_france/src/main/java/org/eqasim/ile_de_france/emissions/RunComputeEmissionsEvents.java b/ile_de_france/src/main/java/org/eqasim/ile_de_france/emissions/RunComputeEmissionsEvents.java deleted file mode 100644 index 9fa83f35a..000000000 --- a/ile_de_france/src/main/java/org/eqasim/ile_de_france/emissions/RunComputeEmissionsEvents.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.eqasim.ile_de_france.emissions; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.eqasim.ile_de_france.IDFConfigurator; -import org.matsim.api.core.v01.Scenario; -import org.matsim.api.core.v01.network.Link; -import org.matsim.api.core.v01.network.Network; -import org.matsim.contrib.emissions.EmissionModule; -import org.matsim.contrib.emissions.OsmHbefaMapping; -import org.matsim.contrib.emissions.utils.EmissionsConfigGroup; -import org.matsim.core.api.experimental.events.EventsManager; -import org.matsim.core.config.CommandLine; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigGroup; -import org.matsim.core.config.ConfigUtils; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Injector; -import org.matsim.core.events.EventsUtils; -import org.matsim.core.events.MatsimEventsReader; -import org.matsim.core.events.algorithms.EventWriterXML; -import org.matsim.core.network.NetworkUtils; -import org.matsim.core.scenario.ScenarioUtils; - -public class RunComputeEmissionsEvents { - - public static void main(String[] args) throws CommandLine.ConfigurationException { - - CommandLine cmd = new CommandLine.Builder(args) // - .requireOptions("config-path", "hbefa-cold-avg", "hbefa-hot-avg") // - .allowOptions("hbefa-cold-detailed", "hbefa-hot-detailed") - .build(); - - ConfigGroup[] configGroups = ArrayUtils.addAll(new IDFConfigurator().getConfigGroups(), new EmissionsConfigGroup()); - - Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), configGroups); - cmd.applyConfiguration(config); - - EmissionsConfigGroup emissionsConfig = (EmissionsConfigGroup) config.getModules().get("emissions"); - emissionsConfig.setHbefaVehicleDescriptionSource(EmissionsConfigGroup.HbefaVehicleDescriptionSource.asEngineInformationAttributes); - emissionsConfig.setDetailedVsAverageLookupBehavior( - EmissionsConfigGroup.DetailedVsAverageLookupBehavior.tryDetailedThenTechnologyAverageThenAverageTable); - emissionsConfig.setNonScenarioVehicles(EmissionsConfigGroup.NonScenarioVehicles.abort); - emissionsConfig.setHbefaTableConsistencyCheckingLevel(EmissionsConfigGroup.HbefaTableConsistencyCheckingLevel.consistent); - - emissionsConfig.setAverageColdEmissionFactorsFile(cmd.getOptionStrict("hbefa-cold-avg")); - emissionsConfig.setAverageWarmEmissionFactorsFile(cmd.getOptionStrict("hbefa-hot-avg")); - - if (cmd.hasOption("hbefa-cold-detailed") && cmd.hasOption("hbefa-hot-detailed")) { - emissionsConfig.setDetailedColdEmissionFactorsFile(cmd.getOptionStrict("hbefa-cold-detailed")); - emissionsConfig.setDetailedWarmEmissionFactorsFile(cmd.getOptionStrict("hbefa-hot-detailed")); - } - - Scenario scenario = ScenarioUtils.createScenario(config); - ScenarioUtils.loadScenario(scenario); - - OsmHbefaMapping osmHbefaMapping = OsmHbefaMapping.build(); - Network network = scenario.getNetwork(); - // if the network is from pt2matsim it might not have "type" but "osm:way:highway" attribute instead - for (Link link: network.getLinks().values()) { - String roadTypeAttribute = NetworkUtils.getType(link); - String osmRoadTypeAttribute = (String) link.getAttributes().getAttribute("osm:way:highway"); - if (StringUtils.isBlank(roadTypeAttribute)) { - if (!StringUtils.isBlank(osmRoadTypeAttribute)) { - NetworkUtils.setType(link, osmRoadTypeAttribute); - } - else { // not a road (railway for example) - NetworkUtils.setType(link, "unclassified"); - } - } - // '_link' types are not defined in the OSM mapping, set t undefined - if (NetworkUtils.getType(link).contains("_link")) { - NetworkUtils.setType(link, "unclassified"); - } - if (NetworkUtils.getType(link).equals("living_street")) { - NetworkUtils.setType(link, "living"); - } - } - osmHbefaMapping.addHbefaMappings(network); - - EventsManager eventsManager = EventsUtils.createEventsManager(); - AbstractModule module = new AbstractModule(){ - @Override - public void install(){ - bind( Scenario.class ).toInstance( scenario ); - bind( EventsManager.class ).toInstance( eventsManager ); - bind( EmissionModule.class ) ; - } - }; - - com.google.inject.Injector injector = Injector.createInjector(config, module ); - EmissionModule emissionModule = injector.getInstance(EmissionModule.class); - - final String outputDirectory = scenario.getConfig().controller().getOutputDirectory() + "/"; - EventWriterXML emissionEventWriter = new EventWriterXML( outputDirectory + "output_emissions_events.xml.gz" ) ; - emissionModule.getEmissionEventsManager().addHandler(emissionEventWriter); - - eventsManager.initProcessing(); - MatsimEventsReader matsimEventsReader = new MatsimEventsReader(eventsManager); - matsimEventsReader.readFile( outputDirectory + "./output_events.xml.gz" ); - eventsManager.finishProcessing(); - - emissionEventWriter.closeFile(); - } -} diff --git a/ile_de_france/src/main/java/org/eqasim/ile_de_france/emissions/RunComputeEmissionsGrid.java b/ile_de_france/src/main/java/org/eqasim/ile_de_france/emissions/RunComputeEmissionsGrid.java deleted file mode 100644 index 43e415c97..000000000 --- a/ile_de_france/src/main/java/org/eqasim/ile_de_france/emissions/RunComputeEmissionsGrid.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.eqasim.ile_de_france.emissions; - -import org.apache.commons.lang3.ArrayUtils; -import org.eqasim.ile_de_france.IDFConfigurator; -import org.locationtech.jts.geom.Geometry; -import org.matsim.api.core.v01.network.Network; -import org.matsim.contrib.emissions.analysis.EmissionGridAnalyzer; -import org.matsim.contrib.emissions.utils.EmissionsConfigGroup; -import org.matsim.core.config.CommandLine; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigGroup; -import org.matsim.core.config.ConfigUtils; -import org.matsim.core.network.NetworkUtils; -import org.matsim.core.network.io.MatsimNetworkReader; -import org.matsim.core.utils.gis.ShapeFileReader; -import org.opengis.feature.simple.SimpleFeature; - -public class RunComputeEmissionsGrid { - - public static void main(String[] args) throws CommandLine.ConfigurationException { - - CommandLine cmd = new CommandLine.Builder(args) // - .requireOptions("config-path", "domain-shp-path") // - .allowOptions("scale-factor", "grid-size", "smooth-radius", "time-bin-size") - .build(); - - ConfigGroup[] configGroups = ArrayUtils.addAll(new IDFConfigurator().getConfigGroups(), new EmissionsConfigGroup()); - - Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), configGroups); - cmd.applyConfiguration(config); - final String outputDirectory = config.controller().getOutputDirectory() + "/"; - - Network network = NetworkUtils.createNetwork(); - new MatsimNetworkReader(network).readFile(outputDirectory + "output_network.xml.gz"); - - SimpleFeature analysisFeature = ShapeFileReader.getAllFeatures(cmd.getOptionStrict("domain-shp-path")).iterator().next(); - Geometry analysisGeometry = (Geometry) analysisFeature.getDefaultGeometry(); - - double scaleFactor = Double.parseDouble(cmd.getOption("scale-factor").orElse("1.0")); - int gridSize = Integer.parseInt(cmd.getOption("grid-size").orElse("25")); - int smoothRadius = Integer.parseInt(cmd.getOption("smooth-radius").orElse("50")); - int timeBinSize = Integer.parseInt(cmd.getOption("time-bin-size").orElse("3600")); - - new EmissionGridAnalyzer.Builder() // - .withBounds(analysisGeometry) // - .withNetwork(network) // - .withCountScaleFactor(scaleFactor) // - .withGridSize(gridSize) // - .withSmoothingRadius(smoothRadius) // - .withTimeBinSize(timeBinSize) // - .withGridType(EmissionGridAnalyzer.GridType.Square) // - .build() // - .processToJsonFile(outputDirectory + "output_emissions_events.xml.gz", outputDirectory + "output_emissions.json"); - } - -} diff --git a/ile_de_france/src/main/java/org/eqasim/ile_de_france/emissions/RunExportEmissionsNetwork.java b/ile_de_france/src/main/java/org/eqasim/ile_de_france/emissions/RunExportEmissionsNetwork.java deleted file mode 100644 index ffb22d9d3..000000000 --- a/ile_de_france/src/main/java/org/eqasim/ile_de_france/emissions/RunExportEmissionsNetwork.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.eqasim.ile_de_france.emissions; - -import org.apache.commons.lang3.ArrayUtils; -import org.eqasim.ile_de_france.IDFConfigurator; -import org.locationtech.jts.geom.Coordinate; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.network.Link; -import org.matsim.api.core.v01.network.Network; -import org.matsim.contrib.analysis.time.TimeBinMap; -import org.matsim.contrib.emissions.Pollutant; -import org.matsim.contrib.emissions.analysis.EmissionsByPollutant; -import org.matsim.contrib.emissions.analysis.EmissionsOnLinkEventHandler; -import org.matsim.contrib.emissions.events.EmissionEventsReader; -import org.matsim.contrib.emissions.utils.EmissionsConfigGroup; -import org.matsim.core.api.experimental.events.EventsManager; -import org.matsim.core.config.CommandLine; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigGroup; -import org.matsim.core.config.ConfigUtils; -import org.matsim.core.events.EventsUtils; -import org.matsim.core.network.NetworkUtils; -import org.matsim.core.network.io.MatsimNetworkReader; -import org.matsim.core.utils.geometry.geotools.MGC; -import org.matsim.core.utils.gis.PolylineFeatureFactory; -import org.matsim.core.utils.gis.ShapeFileWriter; -import org.opengis.feature.simple.SimpleFeature; - -import java.util.*; - -public class RunExportEmissionsNetwork { - - public static void main(String[] args) throws CommandLine.ConfigurationException { - - CommandLine cmd = new CommandLine.Builder(args) // - .requireOptions("config-path") // - .allowOptions("time-bin-size") - .allowOptions("pollutants") - .build(); - - ConfigGroup[] configGroups = ArrayUtils.addAll(new IDFConfigurator().getConfigGroups(), new EmissionsConfigGroup()); - - Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), configGroups); - cmd.applyConfiguration(config); - final String outputDirectory = config.controller().getOutputDirectory() + "/"; - - int timeBinSize = Integer.parseInt(cmd.getOption("time-bin-size").orElse("3600")); - - String[] wanted_pollutants = cmd.getOption("pollutants").orElse("PM,CO,NOx").split(","); - - EventsManager eventsManager = EventsUtils.createEventsManager(); - EmissionsOnLinkEventHandler handler = new EmissionsOnLinkEventHandler(timeBinSize); - - EmissionEventsReader eventsReader = new EmissionEventsReader(eventsManager); - - eventsManager.addHandler(handler); - eventsManager.initProcessing(); - eventsReader.readFile(outputDirectory + "output_emissions_events.xml.gz"); - eventsManager.finishProcessing(); - - Network network = NetworkUtils.createNetwork(); - new MatsimNetworkReader(network).readFile(outputDirectory + "output_network.xml.gz"); - Map, ? extends Link> links = network.getLinks(); - TimeBinMap, EmissionsByPollutant>> res = handler.getTimeBins(); - Collection features = new LinkedList<>(); - PolylineFeatureFactory.Builder builder = new PolylineFeatureFactory.Builder() // - .setCrs(MGC.getCRS("epsg:2154")).setName("Emissions") // - .addAttribute("link", String.class) // - .addAttribute("time", Integer.class); - for (String pollutant: wanted_pollutants) { - builder.addAttribute(pollutant, Double.class); - } - PolylineFeatureFactory linkFactory = builder.create(); - - for (TimeBinMap.TimeBin, EmissionsByPollutant>> timeBin : res.getTimeBins()) { - int startTime = (int) timeBin.getStartTime(); - Map, EmissionsByPollutant> map = timeBin.getValue(); - for (Map.Entry, EmissionsByPollutant> entry : map.entrySet()) { - Id link_id = entry.getKey(); - Link link = links.get(link_id); - Coordinate fromCoordinate = new Coordinate(link.getFromNode().getCoord().getX(), - link.getFromNode().getCoord().getY()); - Coordinate toCoordinate = new Coordinate(link.getToNode().getCoord().getX(), - link.getToNode().getCoord().getY()); - - List attributes = new ArrayList<>(); - - attributes.add(link_id.toString()); - attributes.add(startTime); - EmissionsByPollutant emissions = entry.getValue(); - Map pollutants = emissions.getEmissions(); - for (String pollutant: wanted_pollutants) { - try { - Pollutant pollutant_key = Pollutant.valueOf(pollutant); - attributes.add(pollutants.getOrDefault(pollutant_key, Double.NaN)); - } - catch (IllegalArgumentException e) { - attributes.add(Double.NaN); - } - - } - - SimpleFeature feature = linkFactory.createPolyline( // - new Coordinate[] { fromCoordinate, toCoordinate }, // - attributes.toArray(), - null); - - features.add(feature); - } - } - ShapeFileWriter.writeGeometries(features, outputDirectory + "emissions_network.shp"); - } -}