mapnik/plugins/input/osm/osm.cpp

264 lines
5.1 KiB
C++
Raw Permalink Normal View History

2008-03-01 12:49:37 +01:00
#include "osm.h"
2008-03-02 14:23:50 +01:00
#include "osmparser.h"
2008-03-01 12:49:37 +01:00
#include <libxml/parser.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include "basiccurl.h"
2008-03-01 12:49:37 +01:00
#include <iostream>
using namespace std;
polygon_types osm_way::ptypes;
2008-03-01 12:49:37 +01:00
bool osm_dataset::load(const char* filename,const std::string& parser)
{
2011-04-02 05:45:50 +02:00
if (parser=="libxml2")
{
return osmparser::parse(this,filename);
}
return false;
2008-03-01 12:49:37 +01:00
}
bool osm_dataset::load_from_url(const std::string& url,
2011-04-02 05:45:50 +02:00
const std::string& bbox,
const std::string& parser)
{
2011-04-02 05:45:50 +02:00
if(parser=="libxml2")
{
#ifdef MAPNIK_DEBUG
2011-04-02 05:45:50 +02:00
cerr<<"osm_dataset::load_from_url: url=" << url <<
" bbox="<<bbox<<endl;
#endif
2011-04-02 05:45:50 +02:00
std::ostringstream str;
// use curl to grab the data
// fetch all the data we want - probably from osmxpai
str << url << "?bbox=" << bbox;
#ifdef MAPNIK_DEBUG
2011-04-02 05:45:50 +02:00
cerr << "FULL URL : " << str.str() << endl;
#endif
CURL_LOAD_DATA *resp = grab_http_response(str.str().c_str());
2011-04-02 05:45:50 +02:00
if(resp!=NULL)
{
char *blx = new char[resp->nbytes+1];
memcpy(blx,resp->data,resp->nbytes);
blx[resp->nbytes] = '\0';
#ifdef MAPNIK_DEBUG
2011-04-02 05:45:50 +02:00
cerr<< " CURL RESPONSE: " << blx << endl;
#endif
2011-04-02 05:45:50 +02:00
delete[] blx;
bool success= osmparser::parse(this,resp->data,resp->nbytes);
return success;
}
}
return false;
}
2008-03-01 12:49:37 +01:00
osm_dataset::~osm_dataset()
{
2011-04-02 05:45:50 +02:00
clear();
}
void osm_dataset::clear()
{
#ifdef MAPNIK_DEBUG
2011-04-02 05:45:50 +02:00
cerr<<"osm_dataset::clear()"<<endl;
cerr<<"deleting ways"<<endl;
#endif
2011-04-02 05:45:50 +02:00
for(unsigned int count=0; count<ways.size(); count++)
{
delete ways[count];
ways[count]=NULL;
}
#ifdef MAPNIK_DEBUG
2011-04-02 05:45:50 +02:00
cerr<<"deleting nodes"<<endl;
#endif
2011-04-02 05:45:50 +02:00
for(unsigned int count=0; count<nodes.size(); count++)
{
delete nodes[count];
nodes[count]=NULL;
}
#ifdef MAPNIK_DEBUG
2011-04-02 05:45:50 +02:00
cerr<<"Clearing ways/nodes"<<endl;
#endif
2011-04-02 05:45:50 +02:00
ways.clear();
nodes.clear();
#ifdef MAPNIK_DEBUG
cerr<<"Done"<<endl;
#endif
2008-03-01 12:49:37 +01:00
}
std::string osm_dataset::to_string()
{
2011-04-02 05:45:50 +02:00
std::string result;
2008-03-01 12:49:37 +01:00
2011-04-02 05:45:50 +02:00
for(unsigned int count=0; count<nodes.size(); count++)
{
result += nodes[count]->to_string();
}
for(unsigned int count=0; count<ways.size(); count++)
{
result += ways[count]->to_string();
}
return result;
2008-03-01 12:49:37 +01:00
}
bounds osm_dataset::get_bounds()
{
2011-04-02 05:45:50 +02:00
bounds b (-180,-90,180,90);
for(unsigned int count=0; count<nodes.size();count++)
{
if(nodes[count]->lon > b.w)
b.w=nodes[count]->lon;
if(nodes[count]->lon < b.e)
b.e=nodes[count]->lon;
if(nodes[count]->lat > b.s)
b.s=nodes[count]->lat;
if(nodes[count]->lat < b.n)
b.n=nodes[count]->lat;
}
return b;
2008-03-01 12:49:37 +01:00
}
osm_node *osm_dataset::next_node()
{
2011-04-02 05:45:50 +02:00
if(node_i!=nodes.end())
{
return *(node_i++);
}
return NULL;
2008-03-01 12:49:37 +01:00
}
osm_way *osm_dataset::next_way()
{
2011-04-02 05:45:50 +02:00
if(way_i!=ways.end())
{
return *(way_i++);
}
return NULL;
2008-03-01 12:49:37 +01:00
}
2011-04-02 05:45:50 +02:00
2008-03-01 12:49:37 +01:00
osm_item *osm_dataset::next_item()
{
2011-04-02 05:45:50 +02:00
osm_item *item=NULL;
if(next_item_mode==Node)
{
item = next_node();
if(item==NULL)
{
next_item_mode=Way;
rewind_ways();
item = next_way();
}
}
else
{
item = next_way();
}
return item;
2008-03-01 12:49:37 +01:00
}
2011-04-02 05:45:50 +02:00
2008-03-01 12:49:37 +01:00
std::set<std::string> osm_dataset::get_keys()
{
2011-04-02 05:45:50 +02:00
std::set<std::string> keys;
for(unsigned int count=0; count<nodes.size(); count++)
{
for(std::map<std::string,std::string>::iterator i=
nodes[count]->keyvals.begin(); i!=nodes[count]->keyvals.end(); i++)
{
keys.insert(i->first);
}
}
for(unsigned int count=0; count<ways.size(); count++)
{
for(std::map<std::string,std::string>::iterator i=
ways[count]->keyvals.begin(); i!=ways[count]->keyvals.end(); i++)
{
keys.insert(i->first);
}
}
return keys;
2008-03-01 12:49:37 +01:00
}
2011-04-02 05:45:50 +02:00
2008-03-01 12:49:37 +01:00
std::string osm_item::to_string()
{
2011-04-02 05:45:50 +02:00
std::ostringstream strm;
strm << "id=" << id << std::endl << "Keyvals: " << std::endl;
for(std::map<std::string,std::string>::iterator i=keyvals.begin();
i!=keyvals.end(); i++)
{
strm << "Key " << i->first << " Value " << i->second << std::endl;
}
return strm.str();
2008-03-01 12:49:37 +01:00
}
std::string osm_node::to_string()
{
2011-04-02 05:45:50 +02:00
std::ostringstream strm;
strm << "Node: "<< osm_item::to_string() <<
" Lat=" << lat <<" lon=" <<lon << std::endl;
return strm.str();
2008-03-01 12:49:37 +01:00
}
std::string osm_way::to_string()
{
2011-04-02 05:45:50 +02:00
std::ostringstream strm;
strm << "Way: " << osm_item::to_string() << "Nodes in way:";
2008-03-01 12:49:37 +01:00
2011-04-02 05:45:50 +02:00
for(unsigned int count=0; count<nodes.size(); count++)
{
if(nodes[count]!=NULL)
{
strm << nodes[count]->id << " ";
}
}
strm << std::endl;
return strm.str();
2008-03-01 12:49:37 +01:00
}
bounds osm_way::get_bounds()
{
2011-04-02 05:45:50 +02:00
bounds b (-180,-90,180,90);
for(unsigned int count=0; count<nodes.size();count++)
{
if(nodes[count]->lon > b.w)
b.w=nodes[count]->lon;
if(nodes[count]->lon < b.e)
b.e=nodes[count]->lon;
if(nodes[count]->lat > b.s)
b.s=nodes[count]->lat;
if(nodes[count]->lat < b.n)
b.n=nodes[count]->lat;
}
return b;
2008-03-01 12:49:37 +01:00
}
bool osm_way::is_polygon()
{
2011-04-02 05:45:50 +02:00
for(unsigned int count=0; count<ptypes.ptypes.size(); count++)
{
if(keyvals.find(ptypes.ptypes[count].first) != keyvals.end() &&
keyvals[ptypes.ptypes[count].first] == ptypes.ptypes[count].second)
{
return true;
}
}
return false;
}