extraction is now able to handle bzip2 compressed input files
This commit is contained in:
		
							parent
							
								
									d07dd71078
								
							
						
					
					
						commit
						65351959fe
					
				
							
								
								
									
										84
									
								
								DataStructures/InputReaderFactory.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								DataStructures/InputReaderFactory.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,84 @@ | ||||
| /*
 | ||||
|     open source routing machine | ||||
|     Copyright (C) Dennis Luxen, others 2010 | ||||
| 
 | ||||
| This program is free software; you can redistribute it and/or modify | ||||
| it under the terms of the GNU AFFERO General Public License as published by | ||||
| the Free Software Foundation; either version 3 of the License, or | ||||
| any later version. | ||||
| 
 | ||||
| This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU Affero General Public License | ||||
| along with this program; if not, write to the Free Software | ||||
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
| or see http://www.gnu.org/licenses/agpl.txt.
 | ||||
|  */ | ||||
| 
 | ||||
| #ifndef BZ2INPUTREADER_H | ||||
| #define BZ2INPUTREADER_H | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <libxml/xmlreader.h> | ||||
| 
 | ||||
| #include <bzlib.h> | ||||
| 
 | ||||
| struct Context { | ||||
|     FILE* file; | ||||
|     BZFILE* bz2; | ||||
|     bool error; | ||||
| }; | ||||
| 
 | ||||
| int readFromBz2Stream( void* pointer, char* buffer, int len ) | ||||
| { | ||||
|     Context* context = (Context*) pointer; | ||||
|     if ( len == 0 || context->error ) | ||||
|         return 0; | ||||
| 
 | ||||
|     int error = 0; | ||||
|     int read = BZ2_bzRead( &error, context->bz2, buffer, len ); | ||||
|     if ( error == BZ_OK ) | ||||
|         return read; | ||||
| 
 | ||||
|     context->error = true; | ||||
|     if ( error == BZ_STREAM_END ) | ||||
|         return read; | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| int closeBz2Stream( void *pointer ) | ||||
| { | ||||
|     Context* context = (Context*) pointer; | ||||
|     BZ2_bzclose( context->bz2 ); | ||||
|     fclose( context->file ); | ||||
|     delete context; | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| xmlTextReaderPtr inputReaderFactory( const char* name ) | ||||
| { | ||||
|     std::string inputName(name); | ||||
| 
 | ||||
|     if(inputName.find(".osm.bz2")!=string::npos) | ||||
|     { | ||||
|         Context* context = new Context; | ||||
|         context->error = false; | ||||
|         context->file = fopen( name, "r" ); | ||||
|         int error; | ||||
|         context->bz2 = BZ2_bzReadOpen( &error, context->file, 0, 0, NULL, 0 ); | ||||
|         if ( context->bz2 == NULL || context->file == NULL ) { | ||||
|             delete context; | ||||
|             return NULL; | ||||
|         } | ||||
| 
 | ||||
|         return xmlReaderForIO( readFromBz2Stream, closeBz2Stream, (void*) context, NULL, NULL, 0 ); | ||||
|     } else { | ||||
|         return xmlNewTextReaderFilename(name); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #endif // BZ2INPUTREADER_H
 | ||||
| @ -21,6 +21,7 @@ or see http://www.gnu.org/licenses/agpl.txt. | ||||
| #ifndef EXTRACTORSTRUCTS_H_ | ||||
| #define EXTRACTORSTRUCTS_H_ | ||||
| 
 | ||||
| #include <climits> | ||||
| #include <cmath> | ||||
| 
 | ||||
| /*     Default Speed Profile:
 | ||||
| @ -62,6 +63,12 @@ struct _Node : NodeInfo{ | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| struct _Coordinate { | ||||
| 	int lat; | ||||
| 	int lon; | ||||
| 	_Coordinate () : lat(INT_MIN), lon(INT_MIN) {}; | ||||
| }; | ||||
| 
 | ||||
| struct _Way { | ||||
| 	std::vector< NodeID > path; | ||||
| 	enum { | ||||
| @ -74,11 +81,16 @@ struct _Way { | ||||
| }; | ||||
| 
 | ||||
| struct _Edge { | ||||
| 	_Edge() {}; | ||||
| 	_Edge(NodeID s, NodeID t) : start(s), target(t) { } | ||||
| 	NodeID start; | ||||
| 	NodeID target; | ||||
| 	short type; | ||||
| 	short direction; | ||||
| 	double speed; | ||||
| 
 | ||||
| 	_Coordinate startCoord; | ||||
| 	_Coordinate targetCoord; | ||||
| }; | ||||
| 
 | ||||
| struct Settings { | ||||
| @ -101,7 +113,7 @@ struct Settings { | ||||
| 
 | ||||
| struct Cmp : public std::binary_function<NodeID, NodeID, bool> | ||||
| { | ||||
|     typedef unsigned value_type; | ||||
| 	typedef NodeID value_type; | ||||
| 	bool operator ()  (const NodeID & a, const NodeID & b) const | ||||
| 	{ | ||||
| 		return a < b; | ||||
| @ -116,6 +128,40 @@ struct Cmp : public std::binary_function<NodeID, NodeID, bool> | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| struct CompareEdgeByStart : public std::binary_function<_Edge, _Edge, bool> | ||||
| { | ||||
| 	typedef _Edge value_type; | ||||
| 	bool operator ()  (const _Edge & a, const _Edge & b) const | ||||
| 	{ | ||||
| 		return a.start < b.start; | ||||
| 	} | ||||
| 	value_type max_value() | ||||
| 	{ | ||||
| 		return _Edge(UINT_MAX, UINT_MAX); | ||||
| 	} | ||||
| 	value_type min_value() | ||||
| 	{ | ||||
| 		return _Edge(0, 0); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| struct CompareEdgeByTarget : public std::binary_function<_Edge, _Edge, bool> | ||||
| { | ||||
| 	typedef _Edge value_type; | ||||
| 	bool operator ()  (const _Edge & a, const _Edge & b) const | ||||
| 	{ | ||||
| 		return a.target < b.target; | ||||
| 	} | ||||
| 	value_type max_value() | ||||
| 	{ | ||||
| 		return _Edge(UINT_MAX, UINT_MAX); | ||||
| 	} | ||||
| 	value_type min_value() | ||||
| 	{ | ||||
| 		return _Edge(0, 0); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| _Way _ReadXMLWay( xmlTextReaderPtr& inputReader, Settings& settings ) { | ||||
| 	_Way way; | ||||
| 	way.direction = _Way::notSure; | ||||
|  | ||||
| @ -4,3 +4,4 @@ Scons		1.3+ | ||||
| Boost		1.37+ | ||||
| sparsehash 	1.4+ | ||||
| stxxl		1.2.1+ | ||||
| libz2-dev	1.0.5+ | ||||
| @ -53,6 +53,9 @@ if not conf.CheckCXXHeader('google/sparse_hash_map'): | ||||
| if not conf.CheckCXXHeader('boost/asio.hpp'): | ||||
| 	print "boost/asio.hpp not found. Exiting" | ||||
| 	Exit(-1) | ||||
| if not conf.CheckLibWithHeader('bz2', 'bzlib.h', 'CXX'): | ||||
| 	print "bz2 library not found. Exiting" | ||||
| 	Exit(-1) | ||||
| if not conf.CheckLib('boost_thread'): | ||||
| 	if not conf.CheckLib('boost_thread-mt'): | ||||
| 		print "boost thread library not found. Exiting" | ||||
| @ -87,8 +90,8 @@ env.Append(LINKFLAGS = ' -fopenmp') | ||||
| env.Program("extractNetwork.cpp") | ||||
| env.Program("extractLargeNetwork.cpp")	 | ||||
| env.Program("createHierarchy.cpp") | ||||
| env.Append(CCFLAGS = ' -lboost_regex -lboost_iostreams -lboost_system') | ||||
| env.Append(LINKFLAGS = ' -lboost_regex -lboost_iostreams -lboost_system') | ||||
| env.Append(CCFLAGS = ' -lboost_regex -lboost_iostreams -lboost_system -lbz2') | ||||
| env.Append(LINKFLAGS = ' -lboost_regex -lboost_iostreams -lboost_system -lbz2') | ||||
| env.Program("routed.cpp") | ||||
| env = conf.Finish() | ||||
| 
 | ||||
|  | ||||
| @ -36,6 +36,7 @@ or see http://www.gnu.org/licenses/agpl.txt. | ||||
| #include <stxxl.h> | ||||
| 
 | ||||
| #include "typedefs.h" | ||||
| #include "DataStructures/InputReaderFactory.h" | ||||
| #include "DataStructures/extractorStructs.h" | ||||
| 
 | ||||
| using namespace std; | ||||
| @ -61,11 +62,12 @@ int main (int argc, char *argv[]) | ||||
|         exit(-1); | ||||
|     } | ||||
|     cout << "reading input file. This may take some time ..." << flush; | ||||
|     xmlTextReaderPtr inputReader = inputReaderFactory(argv[1]); | ||||
| 
 | ||||
|     double time = get_timestamp(); | ||||
|     settings.speedProfile.names.insert(settings.speedProfile.names.begin(), names, names+13); | ||||
|     settings.speedProfile.speed.insert(settings.speedProfile.speed.begin(), speeds, speeds+13); | ||||
| 
 | ||||
| 	xmlTextReaderPtr inputReader = xmlNewTextReaderFilename( argv[1] ); | ||||
|     nodeMap->set_empty_key(UINT_MAX); | ||||
|     try { | ||||
|         while ( xmlTextReaderRead( inputReader ) == 1 ) { | ||||
| @ -118,6 +120,9 @@ int main (int argc, char *argv[]) | ||||
|             } | ||||
|             xmlFree( currentName ); | ||||
|         } | ||||
|         cout << "raw no. of nodes: " << allNodes.size() << endl; | ||||
|         cout << "raw no. of edges: " << allEdges.size() << endl; | ||||
| 
 | ||||
|         cout << "ok, after " << get_timestamp() - time << "s" << endl; | ||||
|         time = get_timestamp(); | ||||
|         unsigned memory_to_use = 1024 * 1024 * 1024; | ||||
| @ -138,17 +143,23 @@ int main (int argc, char *argv[]) | ||||
|         time = get_timestamp(); | ||||
| 
 | ||||
|         string name(argv[1]); | ||||
| 		int pos=name.find(".osm"); // pos=9
 | ||||
|         int pos; | ||||
|         pos = name.find(".osm.bz2"); | ||||
|         if(pos!=string::npos) | ||||
|         { | ||||
|             name.replace(pos, 8, ".osrm"); | ||||
|         } else { | ||||
|             pos=name.find(".osm"); | ||||
|             if(pos!=string::npos) | ||||
|             { | ||||
|                 name.replace(pos, 5, ".osrm"); | ||||
|             } else { | ||||
|                 name.append(".osrm"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         ofstream fout; | ||||
|         fout.open(name.c_str()); | ||||
| 		//        ifstream inway("_ways", ios::binary);
 | ||||
| 
 | ||||
|         cout << "Confirming used nodes ..." << flush; | ||||
|         NodeID counter = 0; | ||||
| @ -268,7 +279,7 @@ int main (int argc, char *argv[]) | ||||
|     allEdges.clear(); | ||||
|     confirmedEdges.clear(); | ||||
| 
 | ||||
| 	xmlFreeTextReader(inputReader); | ||||
|     //    xmlFreeTextReader(inputReader);
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user