zusätzlich brauchst doch dann noch einige Libaries - siehe unten-. Nicht unbedingt alle, aber ohne den Quellcode zu studieren, kann ich Dir nicht sagen, welche Libaries zu weglassen kannst. Das eigentliche C++ Programm (war ursprünglich für highways) ist nicht so dramatisch, aber wie man das unter Windows kompiliert, weiß ich nicht
boost (several libraries)
http://www.boost.org/
Debian/Ubuntu: libboost-dev
zlib (for PBF support)
http://www.zlib.net/
Debian/Ubuntu: zlib1g-dev
shapelib (for shapefile support in osmjs)
http://shapelib.maptools.org/
Debian/Ubuntu: libshp-dev
libsqlite3 (for some applications only)
http://sqlite.org/
Debian/Ubuntu: libsqlite3-dev
libgd (for tagstats and nodedensity applications only)
http://www.libgd.org/
Debian/Ubuntu: libgd2-xpm-dev
GDAL (for OGR support)
http://gdal.org/
Debian/Ubuntu: libgdal1-dev
[http://expat.sourceforge.net/](http://expat.sourceforge.net/)
Debian/Ubuntu: libexpat1-dev
GEOS (for assembling multipolygons etc.)
http://trac.osgeo.org/geos/
Debian/Ubuntu: libgeos-dev
Google sparsehash
http://code.google.com/p/google-sparsehash/
Debian/Ubuntu: libsparsehash-dev
Google V8 Javascript engine (for Javascript support)
http://code.google.com/apis/v8/
Debian/Ubuntu: libv8-dev
LibICU (for UTF-8/UTF-16 conversion, only for Javascript support)
http://site.icu-project.org/
Debian/Ubuntu: libicu-dev
Google protocol buffers (for PBF support)
http://code.google.com/p/protobuf/ (at least Version 2.3.0 needed)
Debian/Ubuntu: libprotobuf-dev protobuf-compiler
Also see http://wiki.openstreetmap.org/wiki/PBF_Format
Doxygen (to build API documentation)
http://www.stack.nl/~dimitri/doxygen/
Debian/Ubuntu: doxygen
libboost-test (for tests)
http://www.boost.org/doc/libs/1_47_0/libs/test/doc/html/index.html
Debian/Ubuntu: libboost-test-dev
OSMPBF (for PBF support)
https://github.com/scrosby/OSM-binary
You need to build this first.
/*
This is an example tool that computes the sums of highway lengths.
by Frederik Ramm <frederik@remote.org>
*/
#include <cstdlib>
#include <osmium.hpp>
#include <osmium/storage/byid.hpp>
#include <osmium/handler/coordinates_for_ways.hpp>
typedef Osmium::Storage::SparseTable<Osmium::OSM::Position> storage_sparsetable_t;
typedef Osmium::Storage::Mmap<Osmium::OSM::Position> storage_mmap_t;
typedef Osmium::Handler::CoordinatesForWays<storage_sparsetable_t, storage_mmap_t> cfw_handler_t;
class RoadLengthHandler : public Osmium::Handler::Base {
storage_sparsetable_t store_pos;
storage_mmap_t store_neg;
cfw_handler_t* handler_cfw;
std::map<std::string, unsigned int> length;
std::string hwy;
public:
RoadLengthHandler()
{
handler_cfw = new cfw_handler_t(store_pos, store_neg);
}
~RoadLengthHandler()
{
}
void init(Osmium::OSM::Meta& meta)
{
handler_cfw->init(meta);
}
void node(const shared_ptr<Osmium::OSM::Node const>& node)
{
handler_cfw->node(node);
}
void after_nodes()
{
handler_cfw->after_nodes();
}
unsigned int distance(double lat1, double lon1, double lat2, double lon2)
{
if ((lon1==lon2)&&(lat1==lat2)) return 0;
double r = 6371000;
lon1 = lon1 * M_PI/180;
lon2 = lon2 * M_PI/180;
lat1 = lat1 * M_PI/180;
lat2 = lat2 * M_PI/180;
double dlat = lat2-lat1;
double dlon = lon2-lon1;
double x = pow(sin(dlat/2),2) + cos(lat1) * cos(lat2) * pow(sin(dlon/2),2);
double y = 2 * atan2(sqrt(x), sqrt(1-x));
return r*y+0.5;
}
unsigned int way_length(const shared_ptr<Osmium::OSM::Way>& way)
{
double last_lat, last_lon, this_lat, this_lon;
unsigned int len = 0;
if (way->node_count() < 2) return 0;
last_lat = way->get_lat(0);
last_lon = way->get_lon(0);
for (unsigned int i=1; i< way->node_count(); i++)
{
this_lat = way->get_lat(i);
this_lon = way->get_lon(i);
len += distance(last_lat, last_lon, this_lat, this_lon);
last_lon = this_lon;
last_lat = this_lat;
}
return len;
}
void way(const shared_ptr<Osmium::OSM::Way>& way)
{
handler_cfw->way(way);
const char* highway = way->tags().get_tag_by_key("voltage");
if (highway)
{
hwy.assign(highway);
length[hwy] += way_length(way);
}
}
void after_ways()
{
for (std::map<std::string, unsigned int>::const_iterator i = length.begin(); i != length.end(); i++)
{
printf("%-20s%8.1fkm\n", i->first.c_str(), i->second / 1000.0);
}
}
};
int main(int argc, char *argv[])
{
Osmium::init(true);
if (argc != 2)
{
std::cerr << "Usage: " << argv[0] << " OSMFILE" << std::endl;
exit(1);
}
Osmium::OSMFile infile(argv[1]);
RoadLengthHandler handler;
infile.read(handler);
}