Skip to content

Commit 5889452

Browse files
authored
Merge pull request #124 from moia-oss/master
Update MATSim CW 4
2 parents dcaf5b9 + 28cc45b commit 5889452

File tree

232 files changed

+7742
-2415
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

232 files changed

+7742
-2415
lines changed

contribs/application/src/main/java/org/matsim/application/options/ShpOptions.java

+16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.matsim.application.options;
22

3+
import org.apache.commons.io.FilenameUtils;
34
import org.apache.commons.lang3.ArrayUtils;
45
import org.apache.logging.log4j.LogManager;
56
import org.apache.logging.log4j.Logger;
@@ -38,7 +39,9 @@
3839
import java.net.URISyntaxException;
3940
import java.net.URL;
4041
import java.nio.charset.Charset;
42+
import java.nio.file.Files;
4143
import java.nio.file.Path;
44+
import java.nio.file.StandardCopyOption;
4245
import java.util.*;
4346
import java.util.function.Predicate;
4447
import java.util.zip.ZipEntry;
@@ -118,6 +121,19 @@ public static DataStore openDataStore(String shp) throws IOException {
118121
if (shp.endsWith(".shp"))
119122
ds = factory.createDataStore(url);
120123
else if (shp.endsWith(".gpkg")) {
124+
125+
// GeoPackage does not work with URLs, need to download it first
126+
if (url.getProtocol().startsWith("http")) {
127+
128+
String name = FilenameUtils.getBaseName(url.getFile());
129+
130+
Path tmp = Files.createTempFile(name, ".gpkg");
131+
Files.copy(url.openStream(), tmp, StandardCopyOption.REPLACE_EXISTING);
132+
tmp.toFile().deleteOnExit();
133+
134+
shp = tmp.toString();
135+
}
136+
121137
ds = DataStoreFinder.getDataStore(Map.of(
122138
GeoPkgDataStoreFactory.DBTYPE.key, "geopkg",
123139
GeoPkgDataStoreFactory.DATABASE.key, shp,

contribs/application/src/main/java/org/matsim/freightDemandGeneration/CarrierReaderFromCSV.java

+49-50
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ public static void readAndCreateCarrierFromCSV(Scenario scenario, FreightCarrier
251251
checkNewCarrier(allNewCarrierInformation, freightCarriersConfigGroup, scenario, indexShape, shapeCategory);
252252
log.info("The read carrier information from the csv are checked without errors.");
253253
createNewCarrierAndAddVehicleTypes(scenario, allNewCarrierInformation, freightCarriersConfigGroup, indexShape,
254-
defaultJspritIterations, crsTransformationNetworkAndShape);
254+
defaultJspritIterations, crsTransformationNetworkAndShape);
255255
}
256256

257257
/**
@@ -263,33 +263,33 @@ static Set<CarrierInformationElement> readCarrierInformation(Path csvLocationCar
263263
log.info("Start reading carrier csv file: {}", csvLocationCarrier);
264264
Set<CarrierInformationElement> allNewCarrierInformation = new HashSet<>();
265265
CSVParser parse = new CSVParser(Files.newBufferedReader(csvLocationCarrier),
266-
CSVFormat.Builder.create(CSVFormat.TDF).setHeader().setSkipHeaderRecord(true).build());
266+
CSVFormat.Builder.create(CSVFormat.TDF).setHeader().setSkipHeaderRecord(true).build());
267267
for (CSVRecord record : parse) {
268268
CarrierInformationElement.Builder builder;
269269
if (!record.get("carrierName").isBlank())
270270
builder = CarrierInformationElement.Builder.newInstance(record.get("carrierName"));
271271
else
272272
throw new RuntimeException(
273-
"Minimum one carrier has no name. Every carrier information has to be related to one carrier. Please check the input csv file!");
273+
"Minimum one carrier has no name. Every carrier information has to be related to one carrier. Please check the input csv file!");
274274
if (!record.get("vehicleTypes").isBlank())
275275
builder.setVehicleTypes(record.get("vehicleTypes").split(";"));
276276
if (!record.get("numberOfDepots").isBlank())
277277
builder.setNumberOfDepotsPerType(Integer.parseInt(record.get("numberOfDepots")));
278278
if (!record.get("selectedVehicleDepots").isBlank())
279279
builder.setVehicleDepots(
280-
new ArrayList<String>(Arrays.asList(record.get("selectedVehicleDepots").split(";"))));
280+
new ArrayList<>(Arrays.asList(record.get("selectedVehicleDepots").split(";"))));
281281
if (!record.get("areaOfAdditionalDepots").isBlank())
282282
builder.setAreaOfAdditionalDepots(record.get("areaOfAdditionalDepots").split(";"));
283283
if (!record.get("fixedNumberOfVehiclePerTypeAndLocation").isBlank())
284284
builder.setFixedNumberOfVehiclePerTypeAndLocation(
285-
Integer.parseInt(record.get("fixedNumberOfVehiclePerTypeAndLocation")));
285+
Integer.parseInt(record.get("fixedNumberOfVehiclePerTypeAndLocation")));
286286
if (!record.get("fleetSize").isBlank() && record.get("fleetSize").contentEquals("infinite"))
287287
builder.setFleetSize(FleetSize.INFINITE);
288288
else if (!record.get("fleetSize").isBlank() && record.get("fleetSize").contentEquals("finite"))
289289
builder.setFleetSize(FleetSize.FINITE);
290290
else if (!record.get("fleetSize").isBlank())
291291
throw new RuntimeException("Select a valid FleetSize for the carrier: " + builder.getCarrierName()
292-
+ ". Possible is finite or infinite!!");
292+
+ ". Possible is finite or infinite!!");
293293
if (!record.get("vehicleStartTime").isBlank())
294294
builder.setVehicleStartTime(Integer.parseInt(record.get("vehicleStartTime")));
295295
if (!record.get("vehicleEndTime").isBlank())
@@ -317,45 +317,44 @@ static void checkNewCarrier(Set<CarrierInformationElement> allNewCarrierInformat
317317
CarriersUtils.addOrGetCarriers(scenario);
318318
for (CarrierInformationElement carrierElement : allNewCarrierInformation) {
319319
if (CarriersUtils.getCarriers(scenario).getCarriers()
320-
.containsKey(Id.create(carrierElement.getName(), Carrier.class)))
320+
.containsKey(Id.create(carrierElement.getName(), Carrier.class)))
321321
throw new RuntimeException("The Carrier " + carrierElement.getName()
322-
+ " being loaded from the csv is already in the given Carrier file. It is not possible to add to an existing Carrier. Please check!");
322+
+ " being loaded from the csv is already in the given Carrier file. It is not possible to add to an existing Carrier. Please check!");
323323
CarrierVehicleTypes carrierVehicleTypes = new CarrierVehicleTypes();
324324
new CarrierVehicleTypeReader(carrierVehicleTypes)
325-
.readFile(freightCarriersConfigGroup.getCarriersVehicleTypesFile());
325+
.readFile(freightCarriersConfigGroup.getCarriersVehicleTypesFile());
326326
if (carrierElement.getVehicleTypes() != null)
327327
for (String type : carrierElement.getVehicleTypes()) {
328328
if (!carrierVehicleTypes.getVehicleTypes().containsKey(Id.create(type, VehicleType.class)))
329329
throw new RuntimeException("The selected vehicleType " + type + " of the carrier "
330-
+ carrierElement.getName()
331-
+ " in the input file is not part of imported vehicle types. Please change the type or add the type in the vehicleTypes input file!");
330+
+ carrierElement.getName()
331+
+ " in the input file is not part of imported vehicle types. Please change the type or add the type in the vehicleTypes input file!");
332332
}
333333
if (carrierElement.getVehicleDepots() != null) {
334334
if (carrierElement.getNumberOfDepotsPerType() < carrierElement.getVehicleDepots().size())
335335
throw new RuntimeException("For the carrier " + carrierElement.getName()
336-
+ " more certain depots than the given number of depots are selected. (numberOfDepots < selectedVehicleDepots)");
336+
+ " more certain depots than the given number of depots are selected. (numberOfDepots < selectedVehicleDepots)");
337337

338338
for (String linkDepot : carrierElement.getVehicleDepots()) {
339339
if (!scenario.getNetwork().getLinks().containsKey(Id.create(linkDepot, Link.class)))
340340
throw new RuntimeException("The selected link " + linkDepot + " for a depot of the carrier "
341-
+ carrierElement.getName() + " is not part of the network. Please check!");
341+
+ carrierElement.getName() + " is not part of the network. Please check!");
342342
}
343343
}
344344
if (carrierElement.getVehicleTypes() != null && carrierElement.getNumberOfDepotsPerType() == 0
345-
&& carrierElement.getVehicleDepots() == null)
345+
&& carrierElement.getVehicleDepots() == null)
346346
throw new RuntimeException(
347-
"If a vehicle type is selected in the input file, numberOfDepots or selectedVehicleDepots should be set. Please check carrier "
348-
+ carrierElement.getName());
347+
"If a vehicle type is selected in the input file, numberOfDepots or selectedVehicleDepots should be set. Please check carrier "
348+
+ carrierElement.getName());
349349
if ((carrierElement.getVehicleDepots() != null
350350
&& (carrierElement.getNumberOfDepotsPerType() > carrierElement.getVehicleDepots().size())
351351
&& carrierElement.getAreaOfAdditionalDepots() == null) || (carrierElement.getVehicleDepots() == null && (carrierElement.getNumberOfDepotsPerType() > 0)
352352
&& carrierElement.getAreaOfAdditionalDepots() == null))
353-
log.warn(
354-
"No possible area for additional depot given. Random choice in the hole network of a possible position");
353+
log.warn("No possible area for additional depot given. Random choice in the hole network of a possible position");
355354
if (carrierElement.getAreaOfAdditionalDepots() != null) {
356355
if (indexShape == null)
357356
throw new RuntimeException("For carrier " + carrierElement.getName()
358-
+ " a certain area for depots is selected, but no shape is read in. Please check.");
357+
+ " a certain area for depots is selected, but no shape is read in. Please check.");
359358
for (String depotArea : carrierElement.getAreaOfAdditionalDepots()) {
360359
boolean isInShape = false;
361360
for (SimpleFeature singlePolygon : indexShape.getShp().readFeatures()) {
@@ -366,38 +365,38 @@ static void checkNewCarrier(Set<CarrierInformationElement> allNewCarrierInformat
366365
}
367366
if (!isInShape)
368367
throw new RuntimeException("The area " + depotArea + " of the possible depots of carrier"
369-
+ carrierElement.getName() + " is not part of the given shapeFile. The areas should be in the shape file column " + shapeCategory);
368+
+ carrierElement.getName() + " is not part of the given shapeFile. The areas should be in the shape file column " + shapeCategory);
370369
}
371370
}
372371
if (carrierElement.getFixedNumberOfVehiclePerTypeAndLocation() != 0)
373372
for (CarrierInformationElement existingCarrier : allNewCarrierInformation)
374373
if ((existingCarrier.getName().equals(carrierElement.getName())
375-
&& existingCarrier.getFleetSize() == FleetSize.INFINITE)
376-
|| carrierElement.getFleetSize() == FleetSize.INFINITE)
374+
&& existingCarrier.getFleetSize() == FleetSize.INFINITE)
375+
|| carrierElement.getFleetSize() == FleetSize.INFINITE)
377376
throw new RuntimeException("For the carrier " + carrierElement.getName()
378-
+ " a infinite fleetSize configuration was set, although you want to set a fixed number of vehicles. Please check!");
377+
+ " a infinite fleetSize configuration was set, although you want to set a fixed number of vehicles. Please check!");
379378
if (carrierElement.getFleetSize() != null)
380379
for (CarrierInformationElement existingCarrier : allNewCarrierInformation)
381380
if (existingCarrier.getName().equals(carrierElement.getName())
382-
&& existingCarrier.getFleetSize() != null
383-
&& existingCarrier.getFleetSize() != carrierElement.getFleetSize())
381+
&& existingCarrier.getFleetSize() != null
382+
&& existingCarrier.getFleetSize() != carrierElement.getFleetSize())
384383
throw new RuntimeException("For the carrier " + carrierElement.getName()
385-
+ " different fleetSize configuration was set. Please check and select only one!");
384+
+ " different fleetSize configuration was set. Please check and select only one!");
386385
if (carrierElement.getVehicleTypes() != null) {
387386
if (carrierElement.getVehicleStartTime() == 0 || carrierElement.getVehicleEndTime() == 0)
388387
throw new RuntimeException("For the vehicle types of the carrier " + carrierElement.getName()
389-
+ " no start and/or end time for the vehicles was selected. Please set both times!!");
388+
+ " no start and/or end time for the vehicles was selected. Please set both times!!");
390389
if (carrierElement.getVehicleStartTime() >= carrierElement.getVehicleEndTime())
391390
throw new RuntimeException("For the vehicle types of the carrier " + carrierElement.getName()
392-
+ " a startTime after the endTime for the vehicles was selected. Please check!");
391+
+ " a startTime after the endTime for the vehicles was selected. Please check!");
393392
}
394393
if (carrierElement.getJspritIterations() != 0)
395394
for (CarrierInformationElement existingCarrier : allNewCarrierInformation)
396395
if (existingCarrier.getName().equals(carrierElement.getName())
397-
&& existingCarrier.getJspritIterations() != 0
398-
&& existingCarrier.getJspritIterations() != carrierElement.getJspritIterations())
396+
&& existingCarrier.getJspritIterations() != 0
397+
&& existingCarrier.getJspritIterations() != carrierElement.getJspritIterations())
399398
throw new RuntimeException("For the carrier " + carrierElement.getName()
400-
+ " different number of jsprit iterations are set. Please check!");
399+
+ " different number of jsprit iterations are set. Please check!");
401400
}
402401
}
403402

@@ -439,51 +438,51 @@ static void createNewCarrierAndAddVehicleTypes(Scenario scenario,
439438
if (singleNewCarrier.getJspritIterations() > 0)
440439
CarriersUtils.setJspritIterations(thisCarrier, singleNewCarrier.getJspritIterations());
441440
carrierCapabilities = CarrierCapabilities.Builder.newInstance()
442-
.setFleetSize(singleNewCarrier.getFleetSize()).build();
441+
.setFleetSize(singleNewCarrier.getFleetSize()).build();
443442
carriers.addCarrier(thisCarrier);
444443
}
445444
if (singleNewCarrier.getVehicleDepots() == null)
446-
singleNewCarrier.setVehicleDepots(new ArrayList<String>());
445+
singleNewCarrier.setVehicleDepots(new ArrayList<>());
447446
Random rand = new Random(singleNewCarrier.getName().hashCode());
448447
int cnt = 0;
449448
while (singleNewCarrier.getVehicleDepots().size() < singleNewCarrier.getNumberOfDepotsPerType()) {
450449
Link link = scenario.getNetwork().getLinks().values().stream()
451-
.skip(rand.nextInt(scenario.getNetwork().getLinks().size())).findAny().get();
450+
.skip(rand.nextInt(scenario.getNetwork().getLinks().size())).findAny().get();
452451
cnt++;
453452
if ((!singleNewCarrier.getVehicleDepots().contains(link.getId().toString())
454-
|| cnt > scenario.getNetwork().getLinks().size())
455-
&& !link.getId().toString().contains("pt")
456-
&& (!link.getAttributes().getAsMap().containsKey("type")
457-
|| !link.getAttributes().getAsMap().get("type").toString().contains("motorway"))
458-
&& FreightDemandGenerationUtils.checkPositionInShape(link, null, indexShape,
459-
singleNewCarrier.getAreaOfAdditionalDepots(), crsTransformationNetworkAndShape)) {
453+
|| cnt > scenario.getNetwork().getLinks().size())
454+
&& !link.getId().toString().contains("pt")
455+
&& (!link.getAttributes().getAsMap().containsKey("type")
456+
|| !link.getAttributes().getAsMap().get("type").toString().contains("motorway"))
457+
&& FreightDemandGenerationUtils.checkPositionInShape(link, null, indexShape,
458+
singleNewCarrier.getAreaOfAdditionalDepots(), crsTransformationNetworkAndShape)) {
460459
singleNewCarrier.getVehicleDepots().add(link.getId().toString());
461460
}
462461
}
463462
for (String singleDepot : singleNewCarrier.getVehicleDepots()) {
464463
int countDepots = 2;
465464
for (String thisVehicleType : singleNewCarrier.getVehicleTypes()) {
466465
VehicleType thisType = carrierVehicleTypes.getVehicleTypes()
467-
.get(Id.create(thisVehicleType, VehicleType.class));
466+
.get(Id.create(thisVehicleType, VehicleType.class));
468467
usedCarrierVehicleTypes.getVehicleTypes().putIfAbsent(Id.create(thisVehicleType, VehicleType.class),
469-
thisType);
468+
thisType);
470469
if (singleNewCarrier.getFixedNumberOfVehiclePerTypeAndLocation() == 0)
471470
singleNewCarrier.setFixedNumberOfVehiclePerTypeAndLocation(1);
472471
for (int i = 0; i < singleNewCarrier.getFixedNumberOfVehiclePerTypeAndLocation(); i++) {
473472
Id<Vehicle> vehilcelId = Id.create(
474-
thisType.getId().toString() + "_" + thisCarrier.getId().toString() + "_" + singleDepot
475-
+ "_start" + singleNewCarrier.getVehicleStartTime() + "_" + (i + 1),
476-
Vehicle.class);
473+
thisType.getId().toString() + "_" + thisCarrier.getId().toString() + "_" + singleDepot
474+
+ "_start" + singleNewCarrier.getVehicleStartTime() + "_" + (i + 1),
475+
Vehicle.class);
477476
while (carrierCapabilities.getCarrierVehicles().containsKey(vehilcelId)) {
478477
vehilcelId = Id.create(thisType.getId().toString() + "_" + thisCarrier.getId().toString()
479-
+ "_" + singleDepot + "_V" + countDepots + "_start"
480-
+ singleNewCarrier.getVehicleStartTime() + "_" + (i + 1), Vehicle.class);
478+
+ "_" + singleDepot + "_V" + countDepots + "_start"
479+
+ singleNewCarrier.getVehicleStartTime() + "_" + (i + 1), Vehicle.class);
481480
countDepots++;
482481
}
483482
CarrierVehicle newCarrierVehicle = CarrierVehicle.Builder
484-
.newInstance(vehilcelId, Id.createLinkId(singleDepot), thisType)
485-
.setEarliestStart(singleNewCarrier.getVehicleStartTime())
486-
.setLatestEnd(singleNewCarrier.getVehicleEndTime()).build();
483+
.newInstance(vehilcelId, Id.createLinkId(singleDepot), thisType)
484+
.setEarliestStart(singleNewCarrier.getVehicleStartTime())
485+
.setLatestEnd(singleNewCarrier.getVehicleEndTime()).build();
487486
carrierCapabilities.getCarrierVehicles().put(newCarrierVehicle.getId(), newCarrierVehicle);
488487
if (!carrierCapabilities.getVehicleTypes().contains(thisType))
489488
carrierCapabilities.getVehicleTypes().add(thisType);

0 commit comments

Comments
 (0)