Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • urbanite/open/traffic-simulation
1 result
Show changes
Showing
with 304 additions and 6 deletions
......@@ -10,6 +10,8 @@ colnames(cons) <- c('district',c(1:7),c('m','f','totals'))
#remove district
districts <- cons[1]
cons <- cons[,-c(1)]
cons <- cons[,-c(1,dim(cons)[2])]
ind$age <- as.character(ind$age)
......
......@@ -11,6 +11,7 @@ colnames(cons) <- c('district',c(1:5),c('f','m','totals'))
#remove district and totals
districts <- cons[1]
#cons <- cons[,-c(1)]
cons <- cons[,-c(1,dim(cons)[2])]
......
......@@ -112,5 +112,6 @@ cons1['5'] = a5
cons1['f'] = cons['f']
cons1['m'] = cons['m']
cons1['total']=cons1.m+cons1.f
cons1.index=["1_Circoscrizione","2_Circoscrizione","3_Circoscrizione","4_Circoscrizione","5_Circoscrizione","6_Circoscrizione"]
cons1.to_csv(os.sep.join([data_path,"cons.csv"]))
......@@ -101,6 +101,7 @@ public class ScriptsService {
try {
switch (city_name) {
case "amsterdam": {
//use TravelDemandAmsterdamCyclistsCut instead
TravelDemandAmsterdam.generateTravelDemand(net_id, plan_id);
break;
}
......@@ -109,6 +110,7 @@ public class ScriptsService {
break;
}
case "helsinki": {
//use TravelDemandHelsinkiCut instead
TravelDemandGenerationHelsinki.generateTravelDemand(net_id, plan_id, paramsDTO);
break;
}
......
......@@ -72,7 +72,7 @@ public class SimulationRunService {
logger.info("running steps before simulation...");
runPythonPreprocess();
runRScript();
if (this.city.equals("helsinki")){
if (this.city.equals("helsinki") && new File(ferriesToAddPath).exists()){
String new_ferries = new String(Files.readAllBytes(Paths.get(ferriesToAddPath)), StandardCharsets.UTF_8);
FileWriter fw = new FileWriter(ferriesPath,true);
fw.write(new_ferries);
......@@ -136,7 +136,7 @@ public class SimulationRunService {
break;
}
case "messina": {
TravelDemandGenerationMessina.generateTravelDemand(String.valueOf(networkId), String.valueOf(planId));
TravelDemandGenerationMessina.generateTravelDemand(String.valueOf(networkId), String.valueOf(planId), params);
break;
}
}
......@@ -381,8 +381,8 @@ public class SimulationRunService {
controler.getConfig().controler()
.setEventsFileFormats(Collections.singleton(ControlerConfigGroup.EventsFileFormat.xml));
controler.getConfig().controler().setWriteEventsInterval(1);
controler.getConfig().controler().setLastIteration(1);
controler.getConfig().controler().setWriteEventsInterval(5);
controler.getConfig().controler().setLastIteration(50);
controler.getConfig().network().setInputFile(Paths.get(city,"original_input","networks",String.valueOf(networkId),"network.xml").toString());
controler.getConfig().plans().setInputFile(Paths.get(city,"original_input","networks",String.valueOf(networkId),"plans",String.valueOf(planId),"plans.xml").toString());
......
......@@ -176,4 +176,28 @@ public class SimulationWithParamsDTO {
all_helsinki_districts.put("Östersundom", 7);
return all_helsinki_districts;
}
//messina districts
public ArrayMap<String, Integer> messina_districts(){
ArrayMap<String, Integer> all_messina_districts = new ArrayMap<>();
all_messina_districts.put("1_Circoscrizione", percentage_population_change_1_Circoscrizione);
all_messina_districts.put("2_Circoscrizione", percentage_population_change_2_Circoscrizione);
all_messina_districts.put("3_Circoscrizione", percentage_population_change_3_Circoscrizione);
all_messina_districts.put("4_Circoscrizione", percentage_population_change_4_Circoscrizione);
all_messina_districts.put("5_Circoscrizione", percentage_population_change_5_Circoscrizione);
all_messina_districts.put("6_Circoscrizione", percentage_population_change_6_Circoscrizione);
return all_messina_districts;
}
public ArrayMap<String, Integer> messina_districts_index(){
ArrayMap<String, Integer> all_messina_districts = new ArrayMap<>();
all_messina_districts.put("1_Circoscrizione", 0);
all_messina_districts.put("2_Circoscrizione", 1);
all_messina_districts.put("3_Circoscrizione", 2);
all_messina_districts.put("4_Circoscrizione", 3);
all_messina_districts.put("5_Circoscrizione", 4);
all_messina_districts.put("6_Circoscrizione", 5);
return all_messina_districts;
}
}
package si.ijs.urbanite.simserver.travel_demand;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.checkerframework.checker.units.qual.A;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.matsim.core.utils.collections.ArrayMap;
public class Districts {
//TODO add shape files to drive
public static ArrayList<String> getBilbaoDistricts() {
// DEUSTO = ['D1 NORTE','D1 SUR']
// URIBARRI = ["CASTANOS","D2 ALTO","RIA ESTE","RIA OESTE","MB L3 (METRO BILBAO LINEA 3)"]
// OTXARKOAGA_TXURDINAGA = ["OTXARKOAGA","TXURDINAGA"]
// BEGONA = ["D4 SUR"]
// IBAIONDO = ["CASCO VIEJO","D5 ESTE","D5 OESTE"]
// ABANDO = ['CENTRO','HOSPITAL','ACCESOS V (ACCESOS VIARIOS)','INTERMODAL']
// ERREKALDE = ["D7 NORTE","D7 SUR"]
// BASURT_ZORROTZA = ["BASURTO","ZORROZA"]
ArrayMap<String, ArrayList> districts = new ArrayMap<>();
districts.put("Deusto", new ArrayList<>(Arrays.asList("Deusto", "D1 NORTE", "D1 SUR")));
districts.put("Uribarri", new ArrayList<>(Arrays.asList("Uríbarri", "D2 ALTO", "RIA OESTE", "MB_L3")));
districts.put("Otxarkoaga-Txurdinaga", new ArrayList<>(Arrays.asList("OTXARKOAGA", "TXURDINAGA")));
districts.put("Begoña", new ArrayList<>(Arrays.asList("D4 SUR")));
districts.put("Ibaiondo", new ArrayList<>(Arrays.asList("CASCO_VIEJO", "D5 OESTE")));
districts.put("Abando", new ArrayList<>(Arrays.asList("CENTRO", "HOSPITAL", "ACCESOS_VIARIOS", "INTERMODAL")));
districts.put("Recalde", new ArrayList<>(Arrays.asList("D7 NORTE", "D7 SUR")));
districts.put("Basurto-Zorroza", new ArrayList<>(Arrays.asList("BASURTO", "ZORROZA")));
ArrayList<String> districtsMain = new ArrayList<>(Arrays.asList("Deusto", "Uribarri", "Otxarkoaga-Txurdinaga", "Begoña", "Ibaiondo", "Abando", "Recalde", "Basurto-Zorroza"));
return districtsMain;
}
public static ArrayMap<String,Polygon> readShapeFile() throws IOException, ParseException {
ArrayList<String> districts = getBilbaoDistricts();
ArrayMap<String, Polygon> district_polygon = new ArrayMap<>();
String path = Paths.get("data", "bilbao", "before_simulation", "shapes.json").toString();
JSONParser parser = new JSONParser();
FileReader reader = new FileReader(path);
Object obj = parser.parse(reader);
JSONArray a = (JSONArray) obj;
for (Object district : a) {
JSONObject dist = (JSONObject) district;
String name = (String) dist.get("description");
if (districts.contains(name)) {
List<Point> vertices = new ArrayList<>();
JSONObject n = (JSONObject) dist.get("location");
JSONArray coord = (JSONArray) n.get("coordinates");
for (int i=0;i<coord.size();i++){
ArrayList c = (ArrayList) coord.get(i);
vertices.add(new Point((Double) c.get(0),(Double)c.get(1)));
}
Polygon polygon = new Polygon(vertices);
district_polygon.put(name,polygon);
}
}
return district_polygon;
}
public static void readFacilityFile(){
String path = Paths.get("data","bilbao","before_simulation","other.geojson").toString();
}
public static void main(String[] args) throws IOException, ParseException {
}
}
package si.ijs.urbanite.simserver.travel_demand;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import org.matsim.api.core.v01.Coord;
import org.matsim.core.utils.geometry.CoordinateTransformation;
import org.matsim.core.utils.geometry.transformations.TransformationFactory;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicLong;
public class Facilities {
private static final AtomicLong idGenerator = new AtomicLong(0);
public static long getNextId() {
return idGenerator.incrementAndGet();
}
public static void createFacilityFromPoint(FileWriter fileWriter, String path, String type) throws IOException {
File file = new File(path);
CoordinateTransformation transformation = TransformationFactory.getCoordinateTransformation(
TransformationFactory.WGS84,"EPSG:32630");
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(file);
// Get the features array from the GeoJSON
ArrayNode features = (ArrayNode) rootNode.get("features");
// Iterate over each feature in the array
for (JsonNode feature : features) {
// Get the geometry of the feature
JsonNode geometry = feature.get("geometry");
// Get the coordinates of the geometry
JsonNode coordinates = geometry.get("coordinates");
String typePolygonPoint = geometry.get("type").asText();
if (typePolygonPoint.matches("Polygon")){
double x=0.0;
double y=0.0;
int counter=0;
//iterate over coordinate, average them
if (coordinates.isArray()){
for (JsonNode node:coordinates){
if (node.isArray()){
for (JsonNode node1:node){
x+=node1.get(0).asDouble();
y+=node1.get(1).asDouble();
counter++;
}
}
}
}
x=x/counter;
y=y/counter;
Coord coord = transformation.transform(new Coord(x,y));
long id = getNextId();
String facility = "<facility id=\""+id+"\" x=\""+ coord.getX()+"\" y=\""+coord.getY()+"\">\n";
String activity2 = "<activity type=\""+type+"\"/>\n";
String facilityClose = "</facility>\n";
fileWriter.append(facility+activity2+facilityClose);
}
else if (typePolygonPoint.matches("Point")){
double x = coordinates.get(0).asDouble();
double y = coordinates.get(1).asDouble();
Coord coord = transformation.transform(new Coord(x,y));
long id = getNextId();
String facility = "<facility id=\""+id+"\" x=\""+ coord.getX()+"\" y=\""+coord.getY()+"\">\n";
String activity1 = "<activity type=\"work\"/>\n";
String activity2 = "<activity type=\""+type+"\"/>\n";
String facilityClose = "</facility>\n";
fileWriter.append(facility+activity1+activity2+facilityClose);
}
}
}
public static void createFacilityFromPolygon() {
}
//TODO add home, education, work, other, leisure to onedrive
public static void createFacility(String city) throws IOException {
String homePath = Paths.get("data", city, "before_simulation", "home.geojson").toString();
String educationPath = Paths.get("data", city, "before_simulation", "education.geojson").toString();
String leisurePath = Paths.get("data", city, "before_simulation", "leisure.geojson").toString();
String otherPath = Paths.get("data", city, "before_simulation", "other.geojson").toString();
String facilitiesPath = Paths.get("data", city, "original_input", "facilities.xml").toString();
FileWriter fw = new FileWriter(facilitiesPath);
String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE facilities SYSTEM \"http://www.matsim.org/files/dtd/facilities_v2.dtd\">\n" +
"<facilities>";
fw.write(header);
createFacilityFromPoint(fw,educationPath,"education");
createFacilityFromPoint(fw,leisurePath,"leisure");
createFacilityFromPoint(fw,otherPath,"other");
createFacilityFromPoint(fw,homePath,"home");
fw.append("</facilities>");
fw.close();
}
public static void main(String[] args) throws IOException {
createFacility("bilbao");
}
}
package si.ijs.urbanite.simserver.travel_demand;
public class Point {
public final double x;
public final double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
package si.ijs.urbanite.simserver.travel_demand;
import java.util.List;
public class Polygon {
private final List<Point> vertices;
public Polygon(List<Point> vertices) {
this.vertices = vertices;
}
public boolean contains(Point point) {
int crossings = 0;
for (int i = 0; i < vertices.size(); i++) {
Point vertex1 = vertices.get(i);
Point vertex2 = vertices.get((i + 1) % vertices.size());
if (vertex1.y <= point.y && vertex2.y > point.y ||
vertex2.y <= point.y && vertex1.y > point.y) {
double dx = vertex2.x - vertex1.x;
double dy = vertex2.y - vertex1.y;
double x = vertex1.x + (point.y - vertex1.y) / dy * dx;
if (x < point.x) {
crossings++;
}
}
}
return crossings % 2 != 0;
}
}
......@@ -12,6 +12,7 @@ import org.matsim.core.scenario.ScenarioUtils;
import org.matsim.core.utils.geometry.CoordinateTransformation;
import org.matsim.core.utils.geometry.transformations.TransformationFactory;
import org.poly2tri.geometry.polygon.PolygonPoint;
import si.ijs.urbanite.simserver.simulation.SimulationWithParamsDTO;
import java.io.BufferedReader;
import java.io.FileReader;
......@@ -21,7 +22,9 @@ import java.util.ArrayList;
import java.util.Random;
public class TravelDemandGenerationMessina {
public static void generateTravelDemand(String net_id, String plan_id) throws IOException {
public static void generateTravelDemand(String net_id, String plan_id, SimulationWithParamsDTO paramsDTO) throws IOException {
ChangeNumberInhabitants.changeNumberInhabitants("messina",paramsDTO.messina_districts(),paramsDTO.messina_districts_index());
Integer scale_facotr = 10; // 10% of the full population
Random random = new Random();
......@@ -317,6 +320,6 @@ public class TravelDemandGenerationMessina {
}
public static void main(String[] args) throws IOException {
generateTravelDemand("2","2");
// generateTravelDemand("2","2");
}
}