Windows support, thanks sivetic
This commit is contained in:
parent
0c4c1ce878
commit
54d8a362fc
@ -26,7 +26,9 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#else
|
#else
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef _WIN32
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
#include "Contractor.h"
|
#include "Contractor.h"
|
||||||
|
|
||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
@ -169,7 +171,7 @@ private:
|
|||||||
cout << "Scanning for useless shortcuts" << endl;
|
cout << "Scanning for useless shortcuts" << endl;
|
||||||
BuildOutgoingGraph();
|
BuildOutgoingGraph();
|
||||||
#pragma omp parallel for
|
#pragma omp parallel for
|
||||||
for ( unsigned i = 0; i < ( unsigned ) _graph.size(); i++ ) {
|
for ( int i = 0; i < ( unsigned ) _graph.size(); i++ ) {
|
||||||
for ( unsigned edge = _firstEdge[_graph[i].source]; edge < _firstEdge[_graph[i].source + 1]; ++edge ) {
|
for ( unsigned edge = _firstEdge[_graph[i].source]; edge < _firstEdge[_graph[i].source + 1]; ++edge ) {
|
||||||
if ( edge == i )
|
if ( edge == i )
|
||||||
continue;
|
continue;
|
||||||
@ -265,8 +267,8 @@ private:
|
|||||||
data->_heapForward->Insert( source, 0, source );
|
data->_heapForward->Insert( source, 0, source );
|
||||||
data->_heapBackward->Insert( target, 0, target );
|
data->_heapBackward->Insert( target, 0, target );
|
||||||
|
|
||||||
int targetDistance = std::numeric_limits< int >::max();
|
int targetDistance = (std::numeric_limits< int >::max)();
|
||||||
NodeID middle = std::numeric_limits<NodeID>::max();
|
NodeID middle = (std::numeric_limits<NodeID>::max)();
|
||||||
|
|
||||||
while ( data->_heapForward->Size() + data->_heapBackward->Size() > 0 ) {
|
while ( data->_heapForward->Size() + data->_heapBackward->Size() > 0 ) {
|
||||||
if ( data->_heapForward->Size() > 0 ) {
|
if ( data->_heapForward->Size() > 0 ) {
|
||||||
|
@ -109,7 +109,7 @@ public:
|
|||||||
edge.source = i->source();
|
edge.source = i->source();
|
||||||
edge.target = i->target();
|
edge.target = i->target();
|
||||||
|
|
||||||
edge.data.distance = std::max((int)i->weight(), 1 );
|
edge.data.distance = (std::max)((int)i->weight(), 1 );
|
||||||
assert( edge.data.distance > 0 );
|
assert( edge.data.distance > 0 );
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if ( edge.data.distance > 24 * 60 * 60 * 10 ) {
|
if ( edge.data.distance > 24 * 60 * 60 * 10 ) {
|
||||||
@ -157,26 +157,26 @@ public:
|
|||||||
forwardEdge.data.middleName.nameID = backwardEdge.data.middleName.nameID = middle;
|
forwardEdge.data.middleName.nameID = backwardEdge.data.middleName.nameID = middle;
|
||||||
forwardEdge.data.shortcut = backwardEdge.data.shortcut = false;
|
forwardEdge.data.shortcut = backwardEdge.data.shortcut = false;
|
||||||
forwardEdge.data.originalEdges = backwardEdge.data.originalEdges = 1;
|
forwardEdge.data.originalEdges = backwardEdge.data.originalEdges = 1;
|
||||||
forwardEdge.data.distance = backwardEdge.data.distance = std::numeric_limits< int >::max();
|
forwardEdge.data.distance = backwardEdge.data.distance = (std::numeric_limits< int >::max)();
|
||||||
//remove parallel edges
|
//remove parallel edges
|
||||||
while ( i < edges.size() && edges[i].source == source && edges[i].target == target ) {
|
while ( i < edges.size() && edges[i].source == source && edges[i].target == target ) {
|
||||||
if ( edges[i].data.forward )
|
if ( edges[i].data.forward )
|
||||||
forwardEdge.data.distance = std::min( edges[i].data.distance, forwardEdge.data.distance );
|
forwardEdge.data.distance = (std::min)( edges[i].data.distance, forwardEdge.data.distance );
|
||||||
if ( edges[i].data.backward )
|
if ( edges[i].data.backward )
|
||||||
backwardEdge.data.distance = std::min( edges[i].data.distance, backwardEdge.data.distance );
|
backwardEdge.data.distance = (std::min)( edges[i].data.distance, backwardEdge.data.distance );
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
//merge edges (s,t) and (t,s) into bidirectional edge
|
//merge edges (s,t) and (t,s) into bidirectional edge
|
||||||
if ( forwardEdge.data.distance == backwardEdge.data.distance ) {
|
if ( forwardEdge.data.distance == backwardEdge.data.distance ) {
|
||||||
if ( (int)forwardEdge.data.distance != std::numeric_limits< int >::max() ) {
|
if ( (int)forwardEdge.data.distance != (std::numeric_limits< int >::max)() ) {
|
||||||
forwardEdge.data.backward = true;
|
forwardEdge.data.backward = true;
|
||||||
edges[edge++] = forwardEdge;
|
edges[edge++] = forwardEdge;
|
||||||
}
|
}
|
||||||
} else { //insert seperate edges
|
} else { //insert seperate edges
|
||||||
if ( (int)forwardEdge.data.distance != std::numeric_limits< int >::max() ) {
|
if ( (int)forwardEdge.data.distance != (std::numeric_limits< int >::max)() ) {
|
||||||
edges[edge++] = forwardEdge;
|
edges[edge++] = forwardEdge;
|
||||||
}
|
}
|
||||||
if ( (int)backwardEdge.data.distance != std::numeric_limits< int >::max() ) {
|
if ( (int)backwardEdge.data.distance != (std::numeric_limits< int >::max)() ) {
|
||||||
edges[edge++] = backwardEdge;
|
edges[edge++] = backwardEdge;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -485,7 +485,7 @@ private:
|
|||||||
continue;
|
continue;
|
||||||
const NodeID target = _graph->GetTarget( outEdge );
|
const NodeID target = _graph->GetTarget( outEdge );
|
||||||
const int pathDistance = inData.distance + outData.distance;
|
const int pathDistance = inData.distance + outData.distance;
|
||||||
maxDistance = std::max( maxDistance, pathDistance );
|
maxDistance = (std::max)( maxDistance, pathDistance );
|
||||||
if ( !heap.WasInserted( target ) )
|
if ( !heap.WasInserted( target ) )
|
||||||
heap.Insert( target, pathDistance, _HeapData(true) );
|
heap.Insert( target, pathDistance, _HeapData(true) );
|
||||||
else if ( pathDistance < heap.GetKey( target ) )
|
else if ( pathDistance < heap.GetKey( target ) )
|
||||||
@ -563,7 +563,7 @@ private:
|
|||||||
if ( u == node )
|
if ( u == node )
|
||||||
continue;
|
continue;
|
||||||
neighbours.push_back( u );
|
neighbours.push_back( u );
|
||||||
( *nodeData )[u].depth = std::max(( *nodeData )[node].depth + 1, ( *nodeData )[u].depth );
|
( *nodeData )[u].depth = (std::max)(( *nodeData )[node].depth + 1, ( *nodeData )[u].depth );
|
||||||
}
|
}
|
||||||
//eliminate duplicate entries ( forward + backward edges )
|
//eliminate duplicate entries ( forward + backward edges )
|
||||||
std::sort( neighbours.begin(), neighbours.end() );
|
std::sort( neighbours.begin(), neighbours.end() );
|
||||||
|
@ -32,7 +32,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#include <google/sparse_hash_map>
|
#include <google/sparse_hash_map>
|
||||||
#include <google/sparsetable>
|
#include <google/sparsetable>
|
||||||
|
|
||||||
template< typename NodeID, typename Key, bool initialize = false >
|
template< typename NodeID, typename Key, bool initialize = true >
|
||||||
class ArrayStorage {
|
class ArrayStorage {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ public:
|
|||||||
void Clear() {
|
void Clear() {
|
||||||
heap.resize( 1 );
|
heap.resize( 1 );
|
||||||
insertedNodes.clear();
|
insertedNodes.clear();
|
||||||
heap[0].weight = std::numeric_limits< Weight >::min();
|
heap[0].weight = (std::numeric_limits< Weight >::min)();
|
||||||
nodeIndex.Clear();
|
nodeIndex.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,7 +208,7 @@ public:
|
|||||||
for ( typename std::vector< HeapElement >::iterator i = heap.begin() + 1, iend = heap.end(); i != iend; ++i )
|
for ( typename std::vector< HeapElement >::iterator i = heap.begin() + 1, iend = heap.end(); i != iend; ++i )
|
||||||
insertedNodes[i->index].key = 0;
|
insertedNodes[i->index].key = 0;
|
||||||
heap.resize( 1 );
|
heap.resize( 1 );
|
||||||
heap[0].weight = std::numeric_limits< Weight >::min();
|
heap[0].weight = (std::numeric_limits< Weight >::min)();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DecreaseKey( NodeID node, Weight weight ) {
|
void DecreaseKey( NodeID node, Weight weight ) {
|
||||||
|
@ -200,12 +200,12 @@ class DynamicGraph {
|
|||||||
|
|
||||||
bool isDummy( EdgeIterator edge ) const
|
bool isDummy( EdgeIterator edge ) const
|
||||||
{
|
{
|
||||||
return m_edges[edge].target == std::numeric_limits< NodeIterator >::max();
|
return m_edges[edge].target == (std::numeric_limits< NodeIterator >::max)();
|
||||||
}
|
}
|
||||||
|
|
||||||
void makeDummy( EdgeIterator edge )
|
void makeDummy( EdgeIterator edge )
|
||||||
{
|
{
|
||||||
m_edges[edge].target = std::numeric_limits< NodeIterator >::max();
|
m_edges[edge].target = (std::numeric_limits< NodeIterator >::max)();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Node {
|
struct Node {
|
||||||
|
@ -61,7 +61,7 @@ struct _Node : NodeInfo{
|
|||||||
return _Node(0,0,0);
|
return _Node(0,0,0);
|
||||||
}
|
}
|
||||||
static _Node max_value() {
|
static _Node max_value() {
|
||||||
return _Node(numeric_limits<int>::max(), numeric_limits<int>::max(), numeric_limits<unsigned int>::max());
|
return _Node((numeric_limits<int>::max)(), (numeric_limits<int>::max)(), (numeric_limits<unsigned int>::max)());
|
||||||
}
|
}
|
||||||
NodeID key() const {
|
NodeID key() const {
|
||||||
return id;
|
return id;
|
||||||
@ -157,7 +157,7 @@ struct _Edge {
|
|||||||
return _Edge(0,0);
|
return _Edge(0,0);
|
||||||
}
|
}
|
||||||
static _Edge max_value() {
|
static _Edge max_value() {
|
||||||
return _Edge(numeric_limits<unsigned>::max(), numeric_limits<unsigned>::max());
|
return _Edge((numeric_limits<unsigned>::max)(), (numeric_limits<unsigned>::max)());
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -194,10 +194,10 @@ struct _RawRestrictionContainer {
|
|||||||
_RawRestrictionContainer(bool isOnly = false) : fromWay(UINT_MAX), toWay(UINT_MAX), viaWay(UINT_MAX) { restriction.flags.isOnly = isOnly;}
|
_RawRestrictionContainer(bool isOnly = false) : fromWay(UINT_MAX), toWay(UINT_MAX), viaWay(UINT_MAX) { restriction.flags.isOnly = isOnly;}
|
||||||
|
|
||||||
static _RawRestrictionContainer min_value() {
|
static _RawRestrictionContainer min_value() {
|
||||||
return _RawRestrictionContainer(numeric_limits<unsigned>::min(), numeric_limits<unsigned>::min(), numeric_limits<unsigned>::min(), numeric_limits<unsigned>::min());
|
return _RawRestrictionContainer((numeric_limits<unsigned>::min)(), (numeric_limits<unsigned>::min)(), (numeric_limits<unsigned>::min)(), (numeric_limits<unsigned>::min)());
|
||||||
}
|
}
|
||||||
static _RawRestrictionContainer max_value() {
|
static _RawRestrictionContainer max_value() {
|
||||||
return _RawRestrictionContainer(numeric_limits<unsigned>::max(), numeric_limits<unsigned>::max(), numeric_limits<unsigned>::max(), numeric_limits<unsigned>::max());
|
return _RawRestrictionContainer((numeric_limits<unsigned>::max)(), (numeric_limits<unsigned>::max)(), (numeric_limits<unsigned>::max)(), (numeric_limits<unsigned>::max)());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -238,10 +238,10 @@ struct _WayIDStartAndEndEdge {
|
|||||||
_WayIDStartAndEndEdge(unsigned w, NodeID fs, NodeID ft, NodeID ls, NodeID lt) : wayID(w), firstStart(fs), firstTarget(ft), lastStart(ls), lastTarget(lt) {}
|
_WayIDStartAndEndEdge(unsigned w, NodeID fs, NodeID ft, NodeID ls, NodeID lt) : wayID(w), firstStart(fs), firstTarget(ft), lastStart(ls), lastTarget(lt) {}
|
||||||
|
|
||||||
static _WayIDStartAndEndEdge min_value() {
|
static _WayIDStartAndEndEdge min_value() {
|
||||||
return _WayIDStartAndEndEdge(numeric_limits<unsigned>::min(), numeric_limits<unsigned>::min(), numeric_limits<unsigned>::min(), numeric_limits<unsigned>::min(), numeric_limits<unsigned>::min());
|
return _WayIDStartAndEndEdge((numeric_limits<unsigned>::min)(), (numeric_limits<unsigned>::min)(), (numeric_limits<unsigned>::min)(), (numeric_limits<unsigned>::min)(), (numeric_limits<unsigned>::min)());
|
||||||
}
|
}
|
||||||
static _WayIDStartAndEndEdge max_value() {
|
static _WayIDStartAndEndEdge max_value() {
|
||||||
return _WayIDStartAndEndEdge(numeric_limits<unsigned>::max(), numeric_limits<unsigned>::max(), numeric_limits<unsigned>::max(), numeric_limits<unsigned>::max(), numeric_limits<unsigned>::max());
|
return _WayIDStartAndEndEdge((numeric_limits<unsigned>::max)(), (numeric_limits<unsigned>::max)(), (numeric_limits<unsigned>::max)(), (numeric_limits<unsigned>::max)(), (numeric_limits<unsigned>::max)());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,6 +28,11 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#include <limits>
|
#include <limits>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <stxxl.h>
|
#include <stxxl.h>
|
||||||
|
#include <omp.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <math.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
#include <google/dense_hash_map>
|
#include <google/dense_hash_map>
|
||||||
@ -160,7 +165,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
NNGrid(const char* rif, const char* _i, unsigned numberOfThreads = omp_get_num_procs()): cellCache(500), fileCache(500) {
|
NNGrid(const char* rif, const char* _i, unsigned numberOfThreads = omp_get_num_procs()): cellCache(500), fileCache(500) {
|
||||||
iif = _i;
|
iif = std::string(_i);
|
||||||
ramIndexTable.resize((1024*1024), UINT_MAX);
|
ramIndexTable.resize((1024*1024), UINT_MAX);
|
||||||
ramInFile.open(rif, std::ios::in | std::ios::binary);
|
ramInFile.open(rif, std::ios::in | std::ios::binary);
|
||||||
}
|
}
|
||||||
@ -271,7 +276,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_Coordinate tmp;
|
_Coordinate tmp;
|
||||||
double dist = numeric_limits<double>::max();
|
double dist = (numeric_limits<double>::max)();
|
||||||
timestamp = get_timestamp();
|
timestamp = get_timestamp();
|
||||||
for(std::vector<_Edge>::iterator it = candidates.begin(); it != candidates.end(); it++) {
|
for(std::vector<_Edge>::iterator it = candidates.begin(); it != candidates.end(); it++) {
|
||||||
double r = 0.;
|
double r = 0.;
|
||||||
@ -286,7 +291,7 @@ public:
|
|||||||
nodesOfEdge.projectedPoint.lon = tmp.lon;
|
nodesOfEdge.projectedPoint.lon = tmp.lon;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(dist != numeric_limits<double>::max()) {
|
if(dist != (numeric_limits<double>::max)()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -307,7 +312,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
_Coordinate tmp;
|
_Coordinate tmp;
|
||||||
double dist = numeric_limits<double>::max();
|
double dist = (numeric_limits<double>::max)();
|
||||||
// timestamp = get_timestamp();
|
// timestamp = get_timestamp();
|
||||||
for(std::vector<_Edge>::iterator it = candidates.begin(); it != candidates.end(); it++) {
|
for(std::vector<_Edge>::iterator it = candidates.begin(); it != candidates.end(); it++) {
|
||||||
double r = 0.;
|
double r = 0.;
|
||||||
@ -342,7 +347,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_Coordinate tmp;
|
_Coordinate tmp;
|
||||||
double dist = numeric_limits<double>::max();
|
double dist = (numeric_limits<double>::max)();
|
||||||
timestamp = get_timestamp();
|
timestamp = get_timestamp();
|
||||||
for(std::vector<_Edge>::iterator it = candidates.begin(); it != candidates.end(); it++) {
|
for(std::vector<_Edge>::iterator it = candidates.begin(); it != candidates.end(); it++) {
|
||||||
double r = 0.;
|
double r = 0.;
|
||||||
@ -366,7 +371,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_Coordinate tmp;
|
_Coordinate tmp;
|
||||||
double dist = numeric_limits<double>::max();
|
double dist = (numeric_limits<double>::max)();
|
||||||
for(std::vector<_Edge>::iterator it = candidates.begin(); it != candidates.end(); it++) {
|
for(std::vector<_Edge>::iterator it = candidates.begin(); it != candidates.end(); it++) {
|
||||||
double r = 0.;
|
double r = 0.;
|
||||||
double tmpDist = ComputeDistance(startCoord, it->startCoord, it->targetCoord, tmp, &r);
|
double tmpDist = ComputeDistance(startCoord, it->startCoord, it->targetCoord, tmp, &r);
|
||||||
@ -561,7 +566,7 @@ private:
|
|||||||
// if(cellCache.exists(startIndexInFile)) {
|
// if(cellCache.exists(startIndexInFile)) {
|
||||||
// cellCache.fetch(startIndexInFile, cellIndex);
|
// cellCache.fetch(startIndexInFile, cellIndex);
|
||||||
// } else {
|
// } else {
|
||||||
std::ifstream localStream(iif, std::ios::in | std::ios::binary);
|
std::ifstream localStream(iif.c_str(), std::ios::in | std::ios::binary);
|
||||||
localStream.seekg(startIndexInFile);
|
localStream.seekg(startIndexInFile);
|
||||||
localStream.read((char*) &cellIndex[0], 32*32*sizeof(unsigned));
|
localStream.read((char*) &cellIndex[0], 32*32*sizeof(unsigned));
|
||||||
localStream.close();
|
localStream.close();
|
||||||
@ -579,7 +584,7 @@ private:
|
|||||||
// if(fileCache.exists(position)) {
|
// if(fileCache.exists(position)) {
|
||||||
// fileCache.fetch(position, result);
|
// fileCache.fetch(position, result);
|
||||||
// } else {
|
// } else {
|
||||||
std::ifstream localStream(iif, std::ios::in | std::ios::binary);
|
std::ifstream localStream(iif.c_str(), std::ios::in | std::ios::binary);
|
||||||
localStream.seekg(position);
|
localStream.seekg(position);
|
||||||
DiskEdge diskEdge;
|
DiskEdge diskEdge;
|
||||||
do {
|
do {
|
||||||
@ -655,7 +660,7 @@ private:
|
|||||||
ifstream ramInFile;
|
ifstream ramInFile;
|
||||||
stxxl::vector<GridEntry> * entries;
|
stxxl::vector<GridEntry> * entries;
|
||||||
std::vector<unsigned> ramIndexTable; //4 MB for first level index in RAM
|
std::vector<unsigned> ramIndexTable; //4 MB for first level index in RAM
|
||||||
const char * iif;
|
std::string iif;
|
||||||
LRUCache<int,std::vector<unsigned> > cellCache;
|
LRUCache<int,std::vector<unsigned> > cellCache;
|
||||||
LRUCache<int,std::vector<_Edge> > fileCache;
|
LRUCache<int,std::vector<_Edge> > fileCache;
|
||||||
};
|
};
|
||||||
|
@ -373,18 +373,20 @@ private:
|
|||||||
if ( size > MAX_BLOB_HEADER_SIZE || size < 0 ) {
|
if ( size > MAX_BLOB_HEADER_SIZE || size < 0 ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
char data[size];
|
char *data = (char*)malloc(size);
|
||||||
stream.read(data, size*sizeof(data[0]));
|
stream.read(data, size*sizeof(data[0]));
|
||||||
|
|
||||||
if ( !(threadData->PBFBlobHeader).ParseFromArray( data, size ) ){
|
if ( !(threadData->PBFBlobHeader).ParseFromArray( data, size ) ){
|
||||||
|
free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
free(data);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool unpackZLIB(std::fstream & stream, _ThreadData * threadData) {
|
bool unpackZLIB(std::fstream & stream, _ThreadData * threadData) {
|
||||||
unsigned rawSize = threadData->PBFBlob.raw_size();
|
unsigned rawSize = threadData->PBFBlob.raw_size();
|
||||||
char unpackedDataArray[rawSize];
|
char* unpackedDataArray = (char*)malloc(rawSize);
|
||||||
z_stream compressedDataStream;
|
z_stream compressedDataStream;
|
||||||
compressedDataStream.next_in = ( unsigned char* ) threadData->PBFBlob.zlib_data().data();
|
compressedDataStream.next_in = ( unsigned char* ) threadData->PBFBlob.zlib_data().data();
|
||||||
compressedDataStream.avail_in = threadData->PBFBlob.zlib_data().size();
|
compressedDataStream.avail_in = threadData->PBFBlob.zlib_data().size();
|
||||||
@ -396,6 +398,7 @@ private:
|
|||||||
int ret = inflateInit( &compressedDataStream );
|
int ret = inflateInit( &compressedDataStream );
|
||||||
if ( ret != Z_OK ) {
|
if ( ret != Z_OK ) {
|
||||||
std::cerr << "[error] failed to init zlib stream" << std::endl;
|
std::cerr << "[error] failed to init zlib stream" << std::endl;
|
||||||
|
free(unpackedDataArray);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,12 +406,14 @@ private:
|
|||||||
if ( ret != Z_STREAM_END ) {
|
if ( ret != Z_STREAM_END ) {
|
||||||
std::cerr << "[error] failed to inflate zlib stream" << std::endl;
|
std::cerr << "[error] failed to inflate zlib stream" << std::endl;
|
||||||
std::cerr << "[error] Error type: " << ret << std::endl;
|
std::cerr << "[error] Error type: " << ret << std::endl;
|
||||||
|
free(unpackedDataArray);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = inflateEnd( &compressedDataStream );
|
ret = inflateEnd( &compressedDataStream );
|
||||||
if ( ret != Z_OK ) {
|
if ( ret != Z_OK ) {
|
||||||
std::cerr << "[error] failed to deinit zlib stream" << std::endl;
|
std::cerr << "[error] failed to deinit zlib stream" << std::endl;
|
||||||
|
free(unpackedDataArray);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,6 +421,7 @@ private:
|
|||||||
for(unsigned i = 0; i < rawSize; i++) {
|
for(unsigned i = 0; i < rawSize; i++) {
|
||||||
threadData->charBuffer[i] = unpackedDataArray[i];
|
threadData->charBuffer[i] = unpackedDataArray[i];
|
||||||
}
|
}
|
||||||
|
free(unpackedDataArray);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -433,11 +439,12 @@ private:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char data[size];
|
char* data = (char*)malloc(size);
|
||||||
stream.read(data, sizeof(data[0])*size);
|
stream.read(data, sizeof(data[0])*size);
|
||||||
|
|
||||||
if ( !threadData->PBFBlob.ParseFromArray( data, size ) ) {
|
if ( !threadData->PBFBlob.ParseFromArray( data, size ) ) {
|
||||||
std::cerr << "[error] failed to parse blob" << std::endl;
|
std::cerr << "[error] failed to parse blob" << std::endl;
|
||||||
|
free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,16 +458,20 @@ private:
|
|||||||
} else if ( threadData->PBFBlob.has_zlib_data() ) {
|
} else if ( threadData->PBFBlob.has_zlib_data() ) {
|
||||||
if ( !unpackZLIB(stream, threadData) ) {
|
if ( !unpackZLIB(stream, threadData) ) {
|
||||||
std::cerr << "[error] zlib data encountered that could not be unpacked" << std::endl;
|
std::cerr << "[error] zlib data encountered that could not be unpacked" << std::endl;
|
||||||
|
free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if ( threadData->PBFBlob.has_lzma_data() ) {
|
} else if ( threadData->PBFBlob.has_lzma_data() ) {
|
||||||
if ( !unpackLZMA(stream, threadData) )
|
if ( !unpackLZMA(stream, threadData) )
|
||||||
std::cerr << "[error] lzma data encountered that could not be unpacked" << std::endl;
|
std::cerr << "[error] lzma data encountered that could not be unpacked" << std::endl;
|
||||||
|
free(data);
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
std::cerr << "[error] Blob contains no data" << std::endl;
|
std::cerr << "[error] Blob contains no data" << std::endl;
|
||||||
|
free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
free(data);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,8 +24,30 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#include <climits>
|
#include <climits>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <sys/time.h>
|
|
||||||
#include <tr1/functional_hash.h>
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.14159265358979323846
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <sys/timeb.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <winsock.h>
|
||||||
|
void gettimeofday(struct timeval* t,void* timezone)
|
||||||
|
{ struct _timeb timebuffer;
|
||||||
|
_ftime( &timebuffer );
|
||||||
|
t->tv_sec=timebuffer.time;
|
||||||
|
t->tv_usec=1000*timebuffer.millitm;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <boost/functional/hash.hpp>
|
||||||
|
#else
|
||||||
|
#include <tr1/functional_hash.h>
|
||||||
|
#endif
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
|
|
||||||
/** Returns a timestamp (now) in seconds (incl. a fractional part). */
|
/** Returns a timestamp (now) in seconds (incl. a fractional part). */
|
||||||
|
@ -44,7 +44,7 @@ static double GetAngleBetweenTwoEdges(const _Coordinate& A, const _Coordinate& C
|
|||||||
int v2x = B.lon - C.lon;
|
int v2x = B.lon - C.lon;
|
||||||
int v2y = B.lat - C.lat;
|
int v2y = B.lat - C.lat;
|
||||||
|
|
||||||
double angle = (atan2(v2y,v2x) - atan2(v1y,v1x) )*180/M_PI;
|
double angle = (atan2((double)v2y,v2x) - atan2((double)v1y,v1x) )*180/M_PI;
|
||||||
while(angle < 0)
|
while(angle < 0)
|
||||||
angle += 360;
|
angle += 360;
|
||||||
|
|
||||||
|
@ -157,7 +157,7 @@ public:
|
|||||||
}
|
}
|
||||||
descriptorState.distanceOfInstruction += ApproximateDistance(descriptorState.currentCoordinate, descriptorState.nextCoordinate);
|
descriptorState.distanceOfInstruction += ApproximateDistance(descriptorState.currentCoordinate, descriptorState.nextCoordinate);
|
||||||
lastNodeID = it->node;
|
lastNodeID = it->node;
|
||||||
if(it != path.begin()-1) {
|
if(it != path.begin()) {
|
||||||
descriptorState.previousCoordinate = descriptorState.currentCoordinate;
|
descriptorState.previousCoordinate = descriptorState.currentCoordinate;
|
||||||
descriptorState.currentCoordinate = descriptorState.nextCoordinate;
|
descriptorState.currentCoordinate = descriptorState.nextCoordinate;
|
||||||
}
|
}
|
||||||
|
42
README.TXT
42
README.TXT
@ -24,6 +24,48 @@ Once the dependencies are properly installed running 'scons' should build the
|
|||||||
binaries. The Sconstruct has been built for Ubuntu 10.04, but it should work
|
binaries. The Sconstruct has been built for Ubuntu 10.04, but it should work
|
||||||
under any recent Linux.
|
under any recent Linux.
|
||||||
|
|
||||||
|
Compiling Under Windows
|
||||||
|
---
|
||||||
|
|
||||||
|
Visual Studio 2008 solution and projects are included for Windows compilation, and
|
||||||
|
can be found in the vsproject directory. All required dependencies need to be
|
||||||
|
present, and the osrm.vsprops file will need to be edited to point to the various
|
||||||
|
dependency directories. The suggested directory structure for dependencies is:
|
||||||
|
|
||||||
|
lib\
|
||||||
|
boost\
|
||||||
|
boost (contains includes)
|
||||||
|
lib
|
||||||
|
bzip2\
|
||||||
|
bin (contains libbz2.dll)
|
||||||
|
include
|
||||||
|
lib
|
||||||
|
iconv\
|
||||||
|
bin
|
||||||
|
include
|
||||||
|
lib
|
||||||
|
libxml2\
|
||||||
|
bin
|
||||||
|
include
|
||||||
|
lib
|
||||||
|
protobuf
|
||||||
|
bin (contains protoc.exe)
|
||||||
|
include
|
||||||
|
lib (contains libprotobuf.lib and libprotobuf-debug.lib)
|
||||||
|
sparsehash
|
||||||
|
src
|
||||||
|
stxxl
|
||||||
|
include
|
||||||
|
lib (contains libstxxl.lib and libstxxl-debug.lib)
|
||||||
|
zlib
|
||||||
|
bin
|
||||||
|
include
|
||||||
|
lib (zlib.lib and zlibd.lib)
|
||||||
|
|
||||||
|
Using the above structure, the only changes necessary for compilations are setting
|
||||||
|
the base paths in osrm.vsprops.
|
||||||
|
|
||||||
|
|
||||||
Running the Server
|
Running the Server
|
||||||
---
|
---
|
||||||
Running the server requires preprocessing data from Openstreetmap. To do so you
|
Running the server requires preprocessing data from Openstreetmap. To do so you
|
||||||
|
@ -80,7 +80,7 @@ int main (int argc, char *argv[]) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
ifstream in;
|
ifstream in;
|
||||||
in.open (argv[1]);
|
in.open (argv[1], ifstream::in | ifstream::binary);
|
||||||
if (!in.is_open()) {
|
if (!in.is_open()) {
|
||||||
cerr << "Cannot open " << argv[1] << endl; exit(-1);
|
cerr << "Cannot open " << argv[1] << endl; exit(-1);
|
||||||
}
|
}
|
||||||
|
55
routed.cpp
55
routed.cpp
@ -39,26 +39,56 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#include "Plugins/RoutePlugin.h"
|
#include "Plugins/RoutePlugin.h"
|
||||||
#include "Plugins/ViaRoutePlugin.h"
|
#include "Plugins/ViaRoutePlugin.h"
|
||||||
#include "Util/InputFileUtil.h"
|
#include "Util/InputFileUtil.h"
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
#include "Util/LinuxStackTrace.h"
|
#include "Util/LinuxStackTrace.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
typedef http::RequestHandler RequestHandler;
|
typedef http::RequestHandler RequestHandler;
|
||||||
|
|
||||||
int main (int argc, char *argv[]) {
|
#ifdef _WIN32
|
||||||
installCrashHandler(argv[0]);
|
boost::function0<void> console_ctrl_function;
|
||||||
|
|
||||||
if(testDataFiles(argc, argv)==false) {
|
BOOL WINAPI console_ctrl_handler(DWORD ctrl_type)
|
||||||
std::cerr << "[error] at least one data file name seems to be bogus!" << std::endl;
|
{
|
||||||
exit(-1);
|
switch (ctrl_type)
|
||||||
}
|
{
|
||||||
|
case CTRL_C_EVENT:
|
||||||
|
case CTRL_BREAK_EVENT:
|
||||||
|
case CTRL_CLOSE_EVENT:
|
||||||
|
case CTRL_SHUTDOWN_EVENT:
|
||||||
|
console_ctrl_function();
|
||||||
|
return TRUE;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main (int argc, char *argv[]) {
|
||||||
|
#ifndef _WIN32
|
||||||
|
installCrashHandler(argv[0]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Bug - testing not necessary. testDataFiles also tries to open the first
|
||||||
|
// argv, which is the name of exec file
|
||||||
|
//if(testDataFiles(argc, argv)==false) {
|
||||||
|
//std::cerr << "[error] at least one data file name seems to be bogus!" << std::endl;
|
||||||
|
//exit(-1);
|
||||||
|
//}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
std::cout << "[server] starting up engines, saved at " << __TIMESTAMP__ << std::endl;
|
std::cout << "[server] starting up engines, saved at " << __TIMESTAMP__ << std::endl;
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
int sig = 0;
|
int sig = 0;
|
||||||
sigset_t new_mask;
|
sigset_t new_mask;
|
||||||
sigset_t old_mask;
|
sigset_t old_mask;
|
||||||
sigfillset(&new_mask);
|
sigfillset(&new_mask);
|
||||||
pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask);
|
pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask);
|
||||||
|
#endif
|
||||||
|
|
||||||
ServerConfiguration serverConfig("server.ini");
|
ServerConfiguration serverConfig("server.ini");
|
||||||
Server * s = ServerFactory::CreateServer(serverConfig);
|
Server * s = ServerFactory::CreateServer(serverConfig);
|
||||||
@ -82,6 +112,7 @@ int main (int argc, char *argv[]) {
|
|||||||
|
|
||||||
boost::thread t(boost::bind(&Server::Run, s));
|
boost::thread t(boost::bind(&Server::Run, s));
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
sigset_t wait_mask;
|
sigset_t wait_mask;
|
||||||
pthread_sigmask(SIG_SETMASK, &old_mask, 0);
|
pthread_sigmask(SIG_SETMASK, &old_mask, 0);
|
||||||
sigemptyset(&wait_mask);
|
sigemptyset(&wait_mask);
|
||||||
@ -89,8 +120,18 @@ int main (int argc, char *argv[]) {
|
|||||||
sigaddset(&wait_mask, SIGQUIT);
|
sigaddset(&wait_mask, SIGQUIT);
|
||||||
sigaddset(&wait_mask, SIGTERM);
|
sigaddset(&wait_mask, SIGTERM);
|
||||||
pthread_sigmask(SIG_BLOCK, &wait_mask, 0);
|
pthread_sigmask(SIG_BLOCK, &wait_mask, 0);
|
||||||
std::cout << "[server] running and waiting for requests" << std::endl;
|
|
||||||
sigwait(&wait_mask, &sig);
|
sigwait(&wait_mask, &sig);
|
||||||
|
#else
|
||||||
|
// Set console control handler to allow server to be stopped.
|
||||||
|
console_ctrl_function = boost::bind(&Server::Stop, s);
|
||||||
|
SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
|
||||||
|
|
||||||
|
s->Run();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
std::cout << "[server] running and waiting for requests" << std::endl;
|
||||||
|
|
||||||
std::cout << std::endl << "[server] shutting down" << std::endl;
|
std::cout << std::endl << "[server] shutting down" << std::endl;
|
||||||
s->Stop();
|
s->Stop();
|
||||||
t.join();
|
t.join();
|
||||||
|
@ -44,6 +44,15 @@ using namespace std;
|
|||||||
|
|
||||||
#define DELETE(x) { if(NULL != x) { delete x; x = NULL; } }
|
#define DELETE(x) { if(NULL != x) { delete x; x = NULL; } }
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.14159265358979323846
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_ROUNDF
|
||||||
|
#include <boost/math/tr1.hpp>
|
||||||
|
using namespace boost::math;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef unsigned int NodeID;
|
typedef unsigned int NodeID;
|
||||||
typedef unsigned int EdgeID;
|
typedef unsigned int EdgeID;
|
||||||
typedef unsigned int EdgeWeight;
|
typedef unsigned int EdgeWeight;
|
||||||
|
Loading…
Reference in New Issue
Block a user