int main( int argc, char* argv[] ) { QCoreApplication app( argc, argv ); QTranslator translator; loadTranslations( app, translator ); QStringList const arguments = QCoreApplication::instance()->arguments(); if ( arguments.contains( "--help" ) || arguments.contains( "-h" ) ) { usage(); return 0; } RoutingInstructions directions; WaypointParser parser; if ( arguments.contains( "--routino" ) ) { parser.setLineSeparator( "\n" ); parser.setFieldSeparator( '\t' ); parser.setFieldIndex( WaypointParser::RoadName, 10 ); } else { parser.addJunctionTypeMapping( "Jr", RoutingWaypoint::Roundabout ); } if ( argc > 1 && !( QString( argv[argc-1] ).startsWith( "--" ) ) ) { QString filename( argv[argc-1] ); QFile input( filename ); input.open( QIODevice::ReadOnly ); QTextStream fileStream( &input ); QString content = adjustGosmoreVersion( fileStream, parser ); QTextStream stream( &content ); directions = InstructionTransformation::process( parser.parse( stream ) ); } else { QTextStream console( stdin ); console.setCodec( "UTF-8" ); console.setAutoDetectUnicode( true ); QString content = adjustGosmoreVersion( console, parser ); QTextStream stream( &content ); directions = InstructionTransformation::process( parser.parse( stream ) ); } QTextStream console( stdout ); console.setCodec( "UTF-8" ); if ( arguments.contains( "--dense" ) ) { console << "Content-Type: text/plain\n\n"; } for ( int i = 0; i < directions.size(); ++i ) { console << directions[i] << '\n'; } return 0; }
QVector<GeoDataPlacemark*> GosmoreRunnerPrivate::parseGosmoreInstructions( const QByteArray &content ) { // Determine gosmore version QStringList lines = QString::fromUtf8(content).split(QLatin1Char('\r')); if ( lines.size() > 2 ) { const QStringList fields = lines.at(lines.size()-2).split(QLatin1Char(',')); m_parser.setFieldIndex( WaypointParser::RoadName, fields.size()-1 ); if ( fields.size() < 5 || fields.size() > 6 ) { // Can happen when gosmore changes the output format, returns garbage // or the last street name contains a comma. We may still parse it correctly, just try. mDebug() << "Unexpected number of fields. This gosmore version may be unsupported."; } } QVector<GeoDataPlacemark*> result; QTextStream stream( content ); stream.setCodec("UTF8"); stream.setAutoDetectUnicode( true ); RoutingInstructions directions = InstructionTransformation::process( m_parser.parse( stream ) ); for( int i=0; i<directions.size(); ++i ) { GeoDataPlacemark* placemark = new GeoDataPlacemark( directions[i].instructionText() ); GeoDataExtendedData extendedData; GeoDataData turnType; turnType.setName(QStringLiteral("turnType")); turnType.setValue( qVariantFromValue<int>( int( directions[i].turnType() ) ) ); extendedData.addValue( turnType ); GeoDataData roadName; roadName.setName(QStringLiteral("roadName")); roadName.setValue( directions[i].roadName() ); extendedData.addValue( roadName ); placemark->setExtendedData( extendedData ); Q_ASSERT( !directions[i].points().isEmpty() ); GeoDataLineString* geometry = new GeoDataLineString; QVector<RoutingWaypoint> items = directions[i].points(); for (int j=0; j<items.size(); ++j ) { RoutingPoint point = items[j].point(); GeoDataCoordinates coordinates( point.lon(), point.lat(), 0.0, GeoDataCoordinates::Degree ); geometry->append( coordinates ); } placemark->setGeometry( geometry ); result.push_back( placemark ); } return result; }