コード例 #1
0
  public static void main(final String[] args) {
    log.info(
        "Starting the matsim run from the urbansim interface.  This looks a little rough initially since 'normal' matsim");
    log.info("is not entered until later (after 'DONE with demand generation from urbansim').");

    int year = 0;
    double samplingRate = 0.01;
    for (int ii = 1; ii < args.length; ii++) { // args[0] is the config file
      log.info(" ii: " + ii + " args[ii]: " + args[ii]);
      String[] parts = args[ii].split("=");
      if (parts[0].equals("--year")) {
        year = Integer.parseInt(parts[1]);
      } else if (parts[0].equals("--samplingRate")) {
        samplingRate = Double.parseDouble(parts[1]);
      }
    }
    log.info("year: " + year + " samplingRate: " + samplingRate);
    for (int ii = args.length - 1; ii >= 1; ii--) {
      args[ii] = "";
    }

    // parse the config arguments so we have a config.  generate scenario data from this

    Config config = ConfigUtils.loadConfig(args[0]);
    MatsimRandom.reset(config.global().getRandomSeed());
    Scenario scenario = ScenarioUtils.createScenario(config);
    ScenarioUtils.loadScenario(scenario);

    // get the network.  Always cleaning it seems a good idea since someone may have modified the
    // input files manually in
    // order to implement policy measures.  Get network early so readXXX can check if links still
    // exist.
    Network network = scenario.getNetwork();

    log.info("");
    log.info("cleaning network ...");
    NetworkCleaner nwCleaner = new NetworkCleaner();
    nwCleaner.run(network);
    log.info("... finished cleaning network.");
    log.info("");

    ReadFromUrbansimParcelModel readFromUrbansim = new ReadFromUrbansimParcelModel(year);

    // read urbansim facilities (these are simply those entities that have the coordinates!)
    ActivityFacilitiesImpl facilities =
        new ActivityFacilitiesImpl("urbansim locations (gridcells _or_ parcels _or_ ...)");
    ActivityFacilitiesImpl zones = new ActivityFacilitiesImpl("urbansim zones");
    readFromUrbansim.readFacilities(facilities, zones);

    new FacilitiesWriter(facilities).write(PATH_TO_OPUS_MATSIM + "tmp/locations.xml.gz");

    Population oldPop;
    if (config.plans().getInputFile() != null) {
      log.info(
          "Population specified in matsim config file; assuming WARM start with pre-existing pop file.");
      log.info(
          "Persons not found in pre-existing pop file are added; persons no longer in urbansim persons file are removed.");
      oldPop = scenario.getPopulation();
      log.info(
          "Note that the `continuation of iterations' will only work if you set this up via different config files for");
      log.info(" every year and know what you are doing.");
    } else {
      log.warn("No population specified in matsim config file; assuming COLD start.");
      log.info("(I.e. generate new pop from urbansim files.)");
      oldPop = null;
    }

    Population newPop =
        ((MutableScenario) ScenarioUtils.createScenario(ConfigUtils.createConfig()))
            .getPopulation();
    // read urbansim persons.  Generates hwh acts as side effect
    readFromUrbansim.readPersons(oldPop, newPop, facilities, network, samplingRate);
    oldPop = null;
    System.gc();

    new PopulationWriter(newPop, network).write(PATH_TO_OPUS_MATSIM + "tmp/pop.xml.gz");

    log.info("### DONE with demand generation from urbansim ###");

    ((MutableScenario) scenario).setPopulation(newPop);
    Controler controler = new Controler(scenario);
    controler
        .getConfig()
        .controler()
        .setOverwriteFileSetting(
            true
                ? OutputDirectoryHierarchy.OverwriteFileSetting.overwriteExistingFiles
                : OutputDirectoryHierarchy.OverwriteFileSetting.failIfDirectoryExists);

    // The following lines register what should be done _after_ the iterations were run:
    MyControlerListener myControlerListener = new MyControlerListener(zones);
    controler.addControlerListener(myControlerListener);

    // run the iterations, including the post-processing:
    controler.run();
  }