Skip to content

Commit

Permalink
Merge pull request #124 from moia-oss/master
Browse files Browse the repository at this point in the history
Update MATSim CW 4
  • Loading branch information
nkuehnel authored Jan 21, 2025
2 parents dcaf5b9 + 28cc45b commit 5889452
Show file tree
Hide file tree
Showing 232 changed files with 7,742 additions and 2,415 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.matsim.application.options;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Expand Down Expand Up @@ -38,7 +39,9 @@
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.*;
import java.util.function.Predicate;
import java.util.zip.ZipEntry;
Expand Down Expand Up @@ -118,6 +121,19 @@ public static DataStore openDataStore(String shp) throws IOException {
if (shp.endsWith(".shp"))
ds = factory.createDataStore(url);
else if (shp.endsWith(".gpkg")) {

// GeoPackage does not work with URLs, need to download it first
if (url.getProtocol().startsWith("http")) {

String name = FilenameUtils.getBaseName(url.getFile());

Path tmp = Files.createTempFile(name, ".gpkg");
Files.copy(url.openStream(), tmp, StandardCopyOption.REPLACE_EXISTING);
tmp.toFile().deleteOnExit();

shp = tmp.toString();
}

ds = DataStoreFinder.getDataStore(Map.of(
GeoPkgDataStoreFactory.DBTYPE.key, "geopkg",
GeoPkgDataStoreFactory.DATABASE.key, shp,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ public static void readAndCreateCarrierFromCSV(Scenario scenario, FreightCarrier
checkNewCarrier(allNewCarrierInformation, freightCarriersConfigGroup, scenario, indexShape, shapeCategory);
log.info("The read carrier information from the csv are checked without errors.");
createNewCarrierAndAddVehicleTypes(scenario, allNewCarrierInformation, freightCarriersConfigGroup, indexShape,
defaultJspritIterations, crsTransformationNetworkAndShape);
defaultJspritIterations, crsTransformationNetworkAndShape);
}

/**
Expand All @@ -263,33 +263,33 @@ static Set<CarrierInformationElement> readCarrierInformation(Path csvLocationCar
log.info("Start reading carrier csv file: {}", csvLocationCarrier);
Set<CarrierInformationElement> allNewCarrierInformation = new HashSet<>();
CSVParser parse = new CSVParser(Files.newBufferedReader(csvLocationCarrier),
CSVFormat.Builder.create(CSVFormat.TDF).setHeader().setSkipHeaderRecord(true).build());
CSVFormat.Builder.create(CSVFormat.TDF).setHeader().setSkipHeaderRecord(true).build());
for (CSVRecord record : parse) {
CarrierInformationElement.Builder builder;
if (!record.get("carrierName").isBlank())
builder = CarrierInformationElement.Builder.newInstance(record.get("carrierName"));
else
throw new RuntimeException(
"Minimum one carrier has no name. Every carrier information has to be related to one carrier. Please check the input csv file!");
"Minimum one carrier has no name. Every carrier information has to be related to one carrier. Please check the input csv file!");
if (!record.get("vehicleTypes").isBlank())
builder.setVehicleTypes(record.get("vehicleTypes").split(";"));
if (!record.get("numberOfDepots").isBlank())
builder.setNumberOfDepotsPerType(Integer.parseInt(record.get("numberOfDepots")));
if (!record.get("selectedVehicleDepots").isBlank())
builder.setVehicleDepots(
new ArrayList<String>(Arrays.asList(record.get("selectedVehicleDepots").split(";"))));
new ArrayList<>(Arrays.asList(record.get("selectedVehicleDepots").split(";"))));
if (!record.get("areaOfAdditionalDepots").isBlank())
builder.setAreaOfAdditionalDepots(record.get("areaOfAdditionalDepots").split(";"));
if (!record.get("fixedNumberOfVehiclePerTypeAndLocation").isBlank())
builder.setFixedNumberOfVehiclePerTypeAndLocation(
Integer.parseInt(record.get("fixedNumberOfVehiclePerTypeAndLocation")));
Integer.parseInt(record.get("fixedNumberOfVehiclePerTypeAndLocation")));
if (!record.get("fleetSize").isBlank() && record.get("fleetSize").contentEquals("infinite"))
builder.setFleetSize(FleetSize.INFINITE);
else if (!record.get("fleetSize").isBlank() && record.get("fleetSize").contentEquals("finite"))
builder.setFleetSize(FleetSize.FINITE);
else if (!record.get("fleetSize").isBlank())
throw new RuntimeException("Select a valid FleetSize for the carrier: " + builder.getCarrierName()
+ ". Possible is finite or infinite!!");
+ ". Possible is finite or infinite!!");
if (!record.get("vehicleStartTime").isBlank())
builder.setVehicleStartTime(Integer.parseInt(record.get("vehicleStartTime")));
if (!record.get("vehicleEndTime").isBlank())
Expand Down Expand Up @@ -317,45 +317,44 @@ static void checkNewCarrier(Set<CarrierInformationElement> allNewCarrierInformat
CarriersUtils.addOrGetCarriers(scenario);
for (CarrierInformationElement carrierElement : allNewCarrierInformation) {
if (CarriersUtils.getCarriers(scenario).getCarriers()
.containsKey(Id.create(carrierElement.getName(), Carrier.class)))
.containsKey(Id.create(carrierElement.getName(), Carrier.class)))
throw new RuntimeException("The Carrier " + carrierElement.getName()
+ " being loaded from the csv is already in the given Carrier file. It is not possible to add to an existing Carrier. Please check!");
+ " being loaded from the csv is already in the given Carrier file. It is not possible to add to an existing Carrier. Please check!");
CarrierVehicleTypes carrierVehicleTypes = new CarrierVehicleTypes();
new CarrierVehicleTypeReader(carrierVehicleTypes)
.readFile(freightCarriersConfigGroup.getCarriersVehicleTypesFile());
.readFile(freightCarriersConfigGroup.getCarriersVehicleTypesFile());
if (carrierElement.getVehicleTypes() != null)
for (String type : carrierElement.getVehicleTypes()) {
if (!carrierVehicleTypes.getVehicleTypes().containsKey(Id.create(type, VehicleType.class)))
throw new RuntimeException("The selected vehicleType " + type + " of the carrier "
+ carrierElement.getName()
+ " in the input file is not part of imported vehicle types. Please change the type or add the type in the vehicleTypes input file!");
+ carrierElement.getName()
+ " in the input file is not part of imported vehicle types. Please change the type or add the type in the vehicleTypes input file!");
}
if (carrierElement.getVehicleDepots() != null) {
if (carrierElement.getNumberOfDepotsPerType() < carrierElement.getVehicleDepots().size())
throw new RuntimeException("For the carrier " + carrierElement.getName()
+ " more certain depots than the given number of depots are selected. (numberOfDepots < selectedVehicleDepots)");
+ " more certain depots than the given number of depots are selected. (numberOfDepots < selectedVehicleDepots)");

for (String linkDepot : carrierElement.getVehicleDepots()) {
if (!scenario.getNetwork().getLinks().containsKey(Id.create(linkDepot, Link.class)))
throw new RuntimeException("The selected link " + linkDepot + " for a depot of the carrier "
+ carrierElement.getName() + " is not part of the network. Please check!");
+ carrierElement.getName() + " is not part of the network. Please check!");
}
}
if (carrierElement.getVehicleTypes() != null && carrierElement.getNumberOfDepotsPerType() == 0
&& carrierElement.getVehicleDepots() == null)
&& carrierElement.getVehicleDepots() == null)
throw new RuntimeException(
"If a vehicle type is selected in the input file, numberOfDepots or selectedVehicleDepots should be set. Please check carrier "
+ carrierElement.getName());
"If a vehicle type is selected in the input file, numberOfDepots or selectedVehicleDepots should be set. Please check carrier "
+ carrierElement.getName());
if ((carrierElement.getVehicleDepots() != null
&& (carrierElement.getNumberOfDepotsPerType() > carrierElement.getVehicleDepots().size())
&& carrierElement.getAreaOfAdditionalDepots() == null) || (carrierElement.getVehicleDepots() == null && (carrierElement.getNumberOfDepotsPerType() > 0)
&& carrierElement.getAreaOfAdditionalDepots() == null))
log.warn(
"No possible area for additional depot given. Random choice in the hole network of a possible position");
log.warn("No possible area for additional depot given. Random choice in the hole network of a possible position");
if (carrierElement.getAreaOfAdditionalDepots() != null) {
if (indexShape == null)
throw new RuntimeException("For carrier " + carrierElement.getName()
+ " a certain area for depots is selected, but no shape is read in. Please check.");
+ " a certain area for depots is selected, but no shape is read in. Please check.");
for (String depotArea : carrierElement.getAreaOfAdditionalDepots()) {
boolean isInShape = false;
for (SimpleFeature singlePolygon : indexShape.getShp().readFeatures()) {
Expand All @@ -366,38 +365,38 @@ static void checkNewCarrier(Set<CarrierInformationElement> allNewCarrierInformat
}
if (!isInShape)
throw new RuntimeException("The area " + depotArea + " of the possible depots of carrier"
+ carrierElement.getName() + " is not part of the given shapeFile. The areas should be in the shape file column " + shapeCategory);
+ carrierElement.getName() + " is not part of the given shapeFile. The areas should be in the shape file column " + shapeCategory);
}
}
if (carrierElement.getFixedNumberOfVehiclePerTypeAndLocation() != 0)
for (CarrierInformationElement existingCarrier : allNewCarrierInformation)
if ((existingCarrier.getName().equals(carrierElement.getName())
&& existingCarrier.getFleetSize() == FleetSize.INFINITE)
|| carrierElement.getFleetSize() == FleetSize.INFINITE)
&& existingCarrier.getFleetSize() == FleetSize.INFINITE)
|| carrierElement.getFleetSize() == FleetSize.INFINITE)
throw new RuntimeException("For the carrier " + carrierElement.getName()
+ " a infinite fleetSize configuration was set, although you want to set a fixed number of vehicles. Please check!");
+ " a infinite fleetSize configuration was set, although you want to set a fixed number of vehicles. Please check!");
if (carrierElement.getFleetSize() != null)
for (CarrierInformationElement existingCarrier : allNewCarrierInformation)
if (existingCarrier.getName().equals(carrierElement.getName())
&& existingCarrier.getFleetSize() != null
&& existingCarrier.getFleetSize() != carrierElement.getFleetSize())
&& existingCarrier.getFleetSize() != null
&& existingCarrier.getFleetSize() != carrierElement.getFleetSize())
throw new RuntimeException("For the carrier " + carrierElement.getName()
+ " different fleetSize configuration was set. Please check and select only one!");
+ " different fleetSize configuration was set. Please check and select only one!");
if (carrierElement.getVehicleTypes() != null) {
if (carrierElement.getVehicleStartTime() == 0 || carrierElement.getVehicleEndTime() == 0)
throw new RuntimeException("For the vehicle types of the carrier " + carrierElement.getName()
+ " no start and/or end time for the vehicles was selected. Please set both times!!");
+ " no start and/or end time for the vehicles was selected. Please set both times!!");
if (carrierElement.getVehicleStartTime() >= carrierElement.getVehicleEndTime())
throw new RuntimeException("For the vehicle types of the carrier " + carrierElement.getName()
+ " a startTime after the endTime for the vehicles was selected. Please check!");
+ " a startTime after the endTime for the vehicles was selected. Please check!");
}
if (carrierElement.getJspritIterations() != 0)
for (CarrierInformationElement existingCarrier : allNewCarrierInformation)
if (existingCarrier.getName().equals(carrierElement.getName())
&& existingCarrier.getJspritIterations() != 0
&& existingCarrier.getJspritIterations() != carrierElement.getJspritIterations())
&& existingCarrier.getJspritIterations() != 0
&& existingCarrier.getJspritIterations() != carrierElement.getJspritIterations())
throw new RuntimeException("For the carrier " + carrierElement.getName()
+ " different number of jsprit iterations are set. Please check!");
+ " different number of jsprit iterations are set. Please check!");
}
}

Expand Down Expand Up @@ -439,51 +438,51 @@ static void createNewCarrierAndAddVehicleTypes(Scenario scenario,
if (singleNewCarrier.getJspritIterations() > 0)
CarriersUtils.setJspritIterations(thisCarrier, singleNewCarrier.getJspritIterations());
carrierCapabilities = CarrierCapabilities.Builder.newInstance()
.setFleetSize(singleNewCarrier.getFleetSize()).build();
.setFleetSize(singleNewCarrier.getFleetSize()).build();
carriers.addCarrier(thisCarrier);
}
if (singleNewCarrier.getVehicleDepots() == null)
singleNewCarrier.setVehicleDepots(new ArrayList<String>());
singleNewCarrier.setVehicleDepots(new ArrayList<>());
Random rand = new Random(singleNewCarrier.getName().hashCode());
int cnt = 0;
while (singleNewCarrier.getVehicleDepots().size() < singleNewCarrier.getNumberOfDepotsPerType()) {
Link link = scenario.getNetwork().getLinks().values().stream()
.skip(rand.nextInt(scenario.getNetwork().getLinks().size())).findAny().get();
.skip(rand.nextInt(scenario.getNetwork().getLinks().size())).findAny().get();
cnt++;
if ((!singleNewCarrier.getVehicleDepots().contains(link.getId().toString())
|| cnt > scenario.getNetwork().getLinks().size())
&& !link.getId().toString().contains("pt")
&& (!link.getAttributes().getAsMap().containsKey("type")
|| !link.getAttributes().getAsMap().get("type").toString().contains("motorway"))
&& FreightDemandGenerationUtils.checkPositionInShape(link, null, indexShape,
singleNewCarrier.getAreaOfAdditionalDepots(), crsTransformationNetworkAndShape)) {
|| cnt > scenario.getNetwork().getLinks().size())
&& !link.getId().toString().contains("pt")
&& (!link.getAttributes().getAsMap().containsKey("type")
|| !link.getAttributes().getAsMap().get("type").toString().contains("motorway"))
&& FreightDemandGenerationUtils.checkPositionInShape(link, null, indexShape,
singleNewCarrier.getAreaOfAdditionalDepots(), crsTransformationNetworkAndShape)) {
singleNewCarrier.getVehicleDepots().add(link.getId().toString());
}
}
for (String singleDepot : singleNewCarrier.getVehicleDepots()) {
int countDepots = 2;
for (String thisVehicleType : singleNewCarrier.getVehicleTypes()) {
VehicleType thisType = carrierVehicleTypes.getVehicleTypes()
.get(Id.create(thisVehicleType, VehicleType.class));
.get(Id.create(thisVehicleType, VehicleType.class));
usedCarrierVehicleTypes.getVehicleTypes().putIfAbsent(Id.create(thisVehicleType, VehicleType.class),
thisType);
thisType);
if (singleNewCarrier.getFixedNumberOfVehiclePerTypeAndLocation() == 0)
singleNewCarrier.setFixedNumberOfVehiclePerTypeAndLocation(1);
for (int i = 0; i < singleNewCarrier.getFixedNumberOfVehiclePerTypeAndLocation(); i++) {
Id<Vehicle> vehilcelId = Id.create(
thisType.getId().toString() + "_" + thisCarrier.getId().toString() + "_" + singleDepot
+ "_start" + singleNewCarrier.getVehicleStartTime() + "_" + (i + 1),
Vehicle.class);
thisType.getId().toString() + "_" + thisCarrier.getId().toString() + "_" + singleDepot
+ "_start" + singleNewCarrier.getVehicleStartTime() + "_" + (i + 1),
Vehicle.class);
while (carrierCapabilities.getCarrierVehicles().containsKey(vehilcelId)) {
vehilcelId = Id.create(thisType.getId().toString() + "_" + thisCarrier.getId().toString()
+ "_" + singleDepot + "_V" + countDepots + "_start"
+ singleNewCarrier.getVehicleStartTime() + "_" + (i + 1), Vehicle.class);
+ "_" + singleDepot + "_V" + countDepots + "_start"
+ singleNewCarrier.getVehicleStartTime() + "_" + (i + 1), Vehicle.class);
countDepots++;
}
CarrierVehicle newCarrierVehicle = CarrierVehicle.Builder
.newInstance(vehilcelId, Id.createLinkId(singleDepot), thisType)
.setEarliestStart(singleNewCarrier.getVehicleStartTime())
.setLatestEnd(singleNewCarrier.getVehicleEndTime()).build();
.newInstance(vehilcelId, Id.createLinkId(singleDepot), thisType)
.setEarliestStart(singleNewCarrier.getVehicleStartTime())
.setLatestEnd(singleNewCarrier.getVehicleEndTime()).build();
carrierCapabilities.getCarrierVehicles().put(newCarrierVehicle.getId(), newCarrierVehicle);
if (!carrierCapabilities.getVehicleTypes().contains(thisType))
carrierCapabilities.getVehicleTypes().add(thisType);
Expand Down
Loading

0 comments on commit 5889452

Please sign in to comment.