MATSIM
NetworkTeleatlasAddSpeedRestrictions.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * NetworkTeleatlasAddSpeedRestrictions.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2008 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 
21 package org.matsim.core.network.algorithms;
22 
23 import java.io.FileInputStream;
24 
25 import org.apache.logging.log4j.LogManager;
26 import org.apache.logging.log4j.Logger;
27 import org.geotools.data.shapefile.dbf.DbaseFileReader;
28 import org.matsim.api.core.v01.Id;
33 import org.matsim.core.utils.io.IOUtils;
34 
44 
46  // member variables
48 
49  private final static Logger log = LogManager.getLogger(NetworkTeleatlasAddSpeedRestrictions.class);
50 
54  private final String srDbfFileName;
55 
56  private static final String SR_ID_NAME = "ID";
57  private static final String SR_SPEED_NAME = "SPEED";
58  private static final String SR_VALDIR_NAME = "VALDIR";
59  private static final String SR_VERIFIED_NAME = "VERIFIED";
60 
62  // constructors
64 
70  public NetworkTeleatlasAddSpeedRestrictions(final String srDbfFileName) {
71  log.info("init " + this.getClass().getName() + " module...");
72  this.srDbfFileName = srDbfFileName;
73  log.info("done.");
74  }
75 
77  // run method
79 
115  @Override
116  public void run(final Network network) {
117  try {
118  run2(network);
119  } catch (Exception e) {
120  throw new RuntimeException(e);
121  }
122  }
123 
124  private void run2(final Network network) throws Exception {
125  log.info("running " + this.getClass().getName() + " module...");
126  try (FileInputStream fis = new FileInputStream(this.srDbfFileName)) {
127  DbaseFileReader r = new DbaseFileReader(fis.getChannel(), true, IOUtils.CHARSET_WINDOWS_ISO88591);
128  // getting header indices
129  int srIdNameIndex = -1;
130  int srSpeedNameIndex = -1;
131  int srValDirNameIndex = -1;
132  int srVerifiedNameIndex = -1;
133  for (int i=0; i<r.getHeader().getNumFields(); i++) {
134  if (r.getHeader().getFieldName(i).equals(SR_ID_NAME)) { srIdNameIndex = i; }
135  if (r.getHeader().getFieldName(i).equals(SR_SPEED_NAME)) { srSpeedNameIndex = i; }
136  if (r.getHeader().getFieldName(i).equals(SR_VALDIR_NAME)) { srValDirNameIndex = i; }
137  if (r.getHeader().getFieldName(i).equals(SR_VERIFIED_NAME)) { srVerifiedNameIndex = i; }
138  }
139  if (srIdNameIndex < 0) { throw new NoSuchFieldException("Field name '"+SR_ID_NAME+"' not found."); }
140  if (srSpeedNameIndex < 0) { throw new NoSuchFieldException("Field name '"+SR_SPEED_NAME+"' not found."); }
141  if (srValDirNameIndex < 0) { throw new NoSuchFieldException("Field name '"+SR_VALDIR_NAME+"' not found."); }
142  if (srVerifiedNameIndex < 0) { throw new NoSuchFieldException("Field name '"+SR_VERIFIED_NAME+"' not found."); }
143  log.trace(" FieldName-->Index:");
144  log.trace(" "+SR_ID_NAME+"-->"+srIdNameIndex);
145  log.trace(" "+SR_SPEED_NAME+"-->"+srSpeedNameIndex);
146  log.trace(" "+SR_VALDIR_NAME+"-->"+srValDirNameIndex);
147  log.trace(" "+SR_VERIFIED_NAME+"-->"+srVerifiedNameIndex);
148 
149  int srCnt = 0;
150  int srIgnoreCnt = 0;
151  while (r.hasNext()) {
152  Object[] entries = r.readEntry();
153  int verified = Integer.parseInt(entries[srVerifiedNameIndex].toString());
154  // assign only verfied speed restricitons
155  if (verified == 1) {
156  int valdir = Integer.parseInt(entries[srValDirNameIndex].toString());
157  String id = entries[srIdNameIndex].toString();
158  if (valdir == 1) {
159  // Valid in Both Directions
160  Link ftLink = network.getLinks().get(Id.create(id+"FT", Link.class));
161  Link tfLink = network.getLinks().get(Id.create(id+"TF", Link.class));
162  if ((ftLink == null) || (tfLink == null)) { log.trace(" linkid="+id+", valdir="+valdir+": at least one link not found. Ignoring and proceeding anyway..."); srIgnoreCnt++; }
163  else {
164  double speed = Double.parseDouble(entries[srSpeedNameIndex].toString())/3.6;
165  // assigning speed restriction only if given freespeed is higher
166  if (speed < ftLink.getFreespeed()) { ftLink.setFreespeed(speed); srCnt++; } else { srIgnoreCnt++; }
167  if (speed < tfLink.getFreespeed()) { tfLink.setFreespeed(speed); srCnt++; } else { srIgnoreCnt++; }
168  }
169  }
170  else if (valdir == 2) {
171  // Valid Only in Positive Direction
172  Link ftLink = network.getLinks().get(Id.create(id+"FT", Link.class));
173  if (ftLink == null) { log.trace(" linkid="+id+", valdir="+valdir+": link not found. Ignoring and proceeding anyway..."); srIgnoreCnt++; }
174  else {
175  double speed = Double.parseDouble(entries[srSpeedNameIndex].toString())/3.6;
176  // assigning speed restriction only if given freespeed is higher
177  if (speed < ftLink.getFreespeed()) { ftLink.setFreespeed(speed); srCnt++; } else { srIgnoreCnt++; }
178  }
179  }
180  else if (valdir == 3) {
181  // Valid Only in Negative Direction
182  Link tfLink = network.getLinks().get(Id.create(id+"TF", Link.class));
183  if (tfLink == null) { log.trace(" linkid="+id+", valdir="+valdir+": link not found. Ignoring and proceeding anyway..."); srIgnoreCnt++; }
184  else {
185  double speed = Double.parseDouble(entries[srSpeedNameIndex].toString())/3.6;
186  // assigning speed restriction only if given freespeed is higher
187  if (speed < tfLink.getFreespeed()) { tfLink.setFreespeed(speed); srCnt++; } else { srIgnoreCnt++; }
188  }
189  }
190  else { throw new IllegalArgumentException("linkid="+id+": valdir="+valdir+" not known."); }
191  }
192  }
193  log.info(" "+srCnt+" links with restricted speed assigned.");
194  log.info(" "+srIgnoreCnt+" speed restrictions ignored (while verified = 1).");
195  log.info("done.");
196  r.close();
197  }
198  }
199 
201  // print methods
203 
209  public final void printInfo(final String prefix) {
210  System.out.println(prefix+"configuration of "+this.getClass().getName()+":");
211  System.out.println(prefix+" speed restrictions:");
212  System.out.println(prefix+" srDbfFileName: "+this.srDbfFileName);
213  System.out.println(prefix+" SR_ID_NAME: "+SR_ID_NAME);
214  System.out.println(prefix+" SR_SPEED_NAME: "+SR_SPEED_NAME);
215  System.out.println(prefix+" SR_VALDIR_NAME: "+SR_VALDIR_NAME);
216  System.out.println(prefix+" SR_VERIFIED_NAME: "+SR_VERIFIED_NAME);
217  System.out.println(prefix+"done.");
218  }
219 }
static final Charset CHARSET_WINDOWS_ISO88591
Definition: IOUtils.java:183
static< T > Id< T > create(final long key, final Class< T > type)
Definition: Id.java:68