Created
February 27, 2013 13:30
-
-
Save anonymous/5047904 to your computer and use it in GitHub Desktop.
osm2po custom postprocessor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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