Skip to content

Instantly share code, notes, and snippets.

Created February 27, 2013 13:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/5047904 to your computer and use it in GitHub Desktop.
Save anonymous/5047904 to your computer and use it in GitHub Desktop.
osm2po custom postprocessor
package de.cm.osm2po.plugins;
import static de.cm.osm2po.Utils.DF;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import de.cm.osm2po.Config;
import de.cm.osm2po.converter.PostProcessor;
import de.cm.osm2po.logging.Log;
import de.cm.osm2po.model.Node;
import de.cm.osm2po.model.OsmNode;
import de.cm.osm2po.model.SegmentedWay;
import de.cm.osm2po.model.WaySegment;
import de.cm.osm2po.primitives.InStream;
import de.cm.osm2po.primitives.InStreamDisk;
import de.cm.osm2po.primitives.VarString;
import de.cm.osm2po.primitives.VarTypeDesk;
public class RouteDataWriter implements PostProcessor {
private static byte[] KOMMA = ",".getBytes();
private static byte[] SEMIKOLON = ";".getBytes();
private static byte[] NEWLINE = "\n".getBytes();
private static final char SINGLEQUOTE = 39;
private static final char SINGLESLASH = 92;
private static final byte[] DOUBLEQUOTE = "''".getBytes();
private static final byte[] DOUBLESLASH = "\\\\".getBytes();
private static final byte[] SQLNULL = "null".getBytes();
private boolean asMultilineString;
@Override
public void run(Config config, int index) throws Exception {
File dir = config.getWorkDir();
String prefix = config.getPrefix();
Log log = config.getLog();
// Create Node File
String nodeFileName = prefix + "_nodes.csv";
File nodesInFile = new File(dir, "tn_raw.2po");
InStream nodesInStream = new InStreamDisk(nodesInFile);
File nodesOutFile = new File(dir, nodeFileName);
OutputStream nodesOs = new BufferedOutputStream(new FileOutputStream(nodesOutFile), 65536);
log.info("Creating nodes file " + nodesOutFile.toString());
byte nodesVarType = nodesInStream.readByte();
if (nodesVarType != VarTypeDesk.typeIdOf(de.cm.osm2po.model.OsmNode.class))
throw new RuntimeException("Unexpected VarType " + nodesVarType);
OsmNode node = new OsmNode();
long count = 0;
while (!nodesInStream.isEof()) {
node.readFromStream(nodesInStream);
long id = node.getId();
double lat = node.getLat();
double lon = node.getLon();
nodesOs.write((id + ", " + lat + ", " + lon).getBytes());
nodesOs.write(NEWLINE);
if (++count % 50000 == 0) log.progress(DF(count) + " Nodes written.");
}
nodesInStream.close();
if (nodesOutFile != null) {
nodesOs.close();
}
//Create Links file
String fileName = prefix + "_links.csv";
File waysInFile = new File(dir, "sw_all.2po");
InStream inStream = new InStreamDisk(waysInFile);
File sqlOutFile = new File(dir, fileName);
OutputStream os = new BufferedOutputStream(new FileOutputStream(sqlOutFile), 65536);
log.info("Creating links file " + sqlOutFile.toString());
byte varType = inStream.readByte();
if (varType != VarTypeDesk.typeIdOf(SegmentedWay.class))
throw new RuntimeException("Unexpected VarType " + varType);
SegmentedWay way = new SegmentedWay();
long n = 0, g = 0;
while (!inStream.isEof()) {
way.readFromStream(inStream);
long osm_id = way.getId();
byte clazz = way.getClazz();
int flags = way.getFlags();
byte[] nameBytes = toUTF8QuotedSql(way.getName());
byte[] metaBytes = toUTF8QuotedSql(way.getMeta());
int kmh = way.getKmh(); if (kmh <= 0) kmh = 1;
boolean isOneWay = way.isOneWay();
for (int i = 0; i < way.getSegments().length; ++i) {
WaySegment waySegment = way.getSegments()[i];
int id = waySegment.getId();
int source = waySegment.getSourceId();
int target = waySegment.getTargetId();
Node n1 = waySegment.getNodes()[0];
Node n2 = waySegment.getNodes()[(waySegment.getNodes().length - 1)];
long osmSourceId = n1.getId();
long osmTargetId = n2.getId();
float km = (float)waySegment.calcLengthKm();
float cost = km / kmh;
float reverse_cost = (isOneWay) ? 1000000.0F : cost;
// String geom_way = GeomConverter.latLons2LineWkbHex(waySegment.getNodes(), this.asMultilineString);
os.write((osmSourceId + ", " + osmTargetId + ", " + ((isOneWay) ? 1 : 0) + ", " + kmh + ", " + km * 1000).getBytes());
os.write(NEWLINE);
if (++n % 50000 == 0) log.progress(DF(n) + " Ways written.");
}
}
// os.write(";".getBytes());
log.info(DF(n) + " Ways written.");
inStream.close();
if (sqlOutFile != null) {
os.close();
}
}
private byte[] toUTF8QuotedSql(VarString strToEscape) {
if (null == strToEscape || strToEscape.length() == 0)
return SQLNULL;
return strToEscape // Caution! No Copy()
.replaceAsciiByte(SINGLEQUOTE, DOUBLEQUOTE)
.replaceAsciiByte(SINGLESLASH, DOUBLESLASH)
.quote(SINGLEQUOTE).getUTF8Bytes();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment