added initial version of easymapnik: command line tool for generating Mapnik maps from OSM XML data
This commit is contained in:
parent
021c7c0044
commit
c6c1cc32d7
5 changed files with 597 additions and 0 deletions
97
plugins/input/osm/demo/GoogleProjection.h
Normal file
97
plugins/input/osm/demo/GoogleProjection.h
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
#ifndef GOOGLEPROJECTION_H
|
||||||
|
#define GOOGLEPROJECTION_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
using std::vector;
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#define max(a,b) (((a)>(b))?(a):(b))
|
||||||
|
#define min(a,b) (((a)<(b))?(a):(b))
|
||||||
|
|
||||||
|
struct ScreenPos
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
ScreenPos() { x=y=0; }
|
||||||
|
ScreenPos(int x,int y) { this->x=x; this->y=y; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct EarthPoint
|
||||||
|
{
|
||||||
|
double x,y;
|
||||||
|
EarthPoint() { x=y=0.0; }
|
||||||
|
EarthPoint(double x,double y) { this->x=x; this->y=y; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class GoogleProjection
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
vector<double> Bc,Cc,zc,Ac;
|
||||||
|
int levels;
|
||||||
|
|
||||||
|
double minmax (double a,double b, double c)
|
||||||
|
{
|
||||||
|
a = max(a,b);
|
||||||
|
a = min(a,c);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
GoogleProjection(int levels=18)
|
||||||
|
{
|
||||||
|
this->levels=levels;
|
||||||
|
double c = 256;
|
||||||
|
double e;
|
||||||
|
for (int d=0; d<levels; d++)
|
||||||
|
{
|
||||||
|
e = c/2;
|
||||||
|
Bc.push_back(c/360.0);
|
||||||
|
Cc.push_back(c/(2 * M_PI));
|
||||||
|
zc.push_back(e);
|
||||||
|
Ac.push_back(c);
|
||||||
|
c *= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScreenPos fromLLToPixel(double lon,double lat,int zoom)
|
||||||
|
{
|
||||||
|
double d = zc[zoom];
|
||||||
|
double e = round(d + lon * Bc[zoom]);
|
||||||
|
double f = minmax(sin((M_PI/180.0) * lat),-0.9999,0.9999);
|
||||||
|
double g = round(d + 0.5*log((1+f)/(1-f))*-Cc[zoom]);
|
||||||
|
return ScreenPos(e,g);
|
||||||
|
}
|
||||||
|
|
||||||
|
EarthPoint fromPixelToLL(int x,int y,int zoom)
|
||||||
|
{
|
||||||
|
double e = zc[zoom];
|
||||||
|
double f = (x - e)/Bc[zoom];
|
||||||
|
double g = (y - e)/-Cc[zoom];
|
||||||
|
double h = (180.0/M_PI) * ( 2 * atan(exp(g)) - 0.5 * M_PI);
|
||||||
|
return EarthPoint(f,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert to the zoom independent Google system; TBH I don't really
|
||||||
|
// understand what it represents....
|
||||||
|
static EarthPoint fromLLToGoog(double lon,double lat)
|
||||||
|
{
|
||||||
|
double a = log(tan((90+lat)*M_PI / 360))/(M_PI / 180);
|
||||||
|
double custLat = a * 20037508.34 / 180;
|
||||||
|
double custLon=lon;
|
||||||
|
custLon = custLon * 20037508.34 / 180;
|
||||||
|
return EarthPoint(custLon,custLat);
|
||||||
|
}
|
||||||
|
|
||||||
|
// other way round
|
||||||
|
static EarthPoint fromGoogToLL(double x,double y)
|
||||||
|
{
|
||||||
|
double lat_deg,lon_deg;
|
||||||
|
lat_deg = (y / 20037508.34) * 180;
|
||||||
|
lon_deg = (x / 20037508.34) * 180;
|
||||||
|
lat_deg = 180/M_PI *
|
||||||
|
(2 * atan(exp(lat_deg * M_PI / 180)) - M_PI / 2);
|
||||||
|
return EarthPoint(lon_deg,lat_deg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // GOOGLEPROJECTION_H
|
322
plugins/input/osm/demo/MapSource.cpp
Normal file
322
plugins/input/osm/demo/MapSource.cpp
Normal file
|
@ -0,0 +1,322 @@
|
||||||
|
#include "MapSource.h"
|
||||||
|
|
||||||
|
|
||||||
|
void MapSource::process_cmd_line_args(int argc,char *argv[])
|
||||||
|
{
|
||||||
|
std::string bbox="";
|
||||||
|
|
||||||
|
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
|
||||||
|
width=800;
|
||||||
|
height=600;
|
||||||
|
|
||||||
|
while(argc>0)
|
||||||
|
{
|
||||||
|
if(argv[0][0]=='-' && strlen(argv[0])>1)
|
||||||
|
{
|
||||||
|
switch(argv[0][1])
|
||||||
|
{
|
||||||
|
case 's': setSource(argv[1]);
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'w': width=atoi(argv[1]);
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'h': height=atoi(argv[1]);
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'x': xmlfile=argv[1];
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i': osmfile=argv[1];
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'b': bbox=argv[1];
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'z': zoom_start=atoi(argv[1]);
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Z': zoom_end=atoi(argv[1]);
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 't': tiled=true;
|
||||||
|
argv+=1;
|
||||||
|
argc-=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'm': multirqst=true;
|
||||||
|
argv+=1;
|
||||||
|
argc-=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'u': url=argv[1];
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'o': outfile=argv[1];
|
||||||
|
argv+=2;
|
||||||
|
argc-=2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
argv++;
|
||||||
|
argc--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(bbox!="")
|
||||||
|
{
|
||||||
|
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
|
||||||
|
boost::char_separator<char> comma(",");
|
||||||
|
tokenizer t (bbox,comma);
|
||||||
|
int count=0;
|
||||||
|
for(tokenizer::iterator i=t.begin(); i!=t.end(); i++)
|
||||||
|
{
|
||||||
|
if(count==0)
|
||||||
|
w=atof(i->c_str());
|
||||||
|
else if (count==1)
|
||||||
|
s=atof(i->c_str());
|
||||||
|
else if (count==2)
|
||||||
|
e=atof(i->c_str());
|
||||||
|
else if (count==3)
|
||||||
|
n=atof(i->c_str());
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(zoom_end == -1)
|
||||||
|
zoom_end = zoom_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapSource::generateMaps()
|
||||||
|
{
|
||||||
|
if(tiled)
|
||||||
|
{
|
||||||
|
|
||||||
|
// code to convert a bbox to a series of tiles (see FreemapMobile?)
|
||||||
|
// iterate through each tile and convert back to bboxes, zooming
|
||||||
|
// for each (can use old 'render' code for this)
|
||||||
|
|
||||||
|
// break the input into a series of 0.1 x 0.1 requests to osmxapi
|
||||||
|
double curlon, curlat,nextlon,nextlat;
|
||||||
|
curlon= (getSource()=="api" && multirqst)? 0.1*((int)(w*10)):w;
|
||||||
|
while(curlon<e)
|
||||||
|
{
|
||||||
|
nextlon=(getSource()=="api" && multirqst) ? curlon+0.1 : e;
|
||||||
|
curlat=(getSource()=="api" && multirqst)
|
||||||
|
? 0.1*((int)(s*10)) : s;
|
||||||
|
while(curlat<n)
|
||||||
|
{
|
||||||
|
nextlat=(getSource()=="api" && multirqst)?curlat+0.1 : n;
|
||||||
|
parameters p;
|
||||||
|
if(getSource()=="api")
|
||||||
|
{
|
||||||
|
std::ostringstream str;
|
||||||
|
str<<curlon<<","<<curlat<<","<<nextlon<<","<<nextlat;
|
||||||
|
|
||||||
|
p["url"] = url;
|
||||||
|
p["file"] = "";
|
||||||
|
p["bbox"] = str.str();
|
||||||
|
}
|
||||||
|
else if (getSource()=="osm")
|
||||||
|
{
|
||||||
|
p["file"] = osmfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map m (width, height);
|
||||||
|
p["type"] ="osm";
|
||||||
|
load_map(m,xmlfile);
|
||||||
|
setOSMLayers(m,p);
|
||||||
|
addSRTMLayers(m,curlon,curlat,nextlon,nextlat);
|
||||||
|
// lonToX() and latToY() give *pixel* coordinates
|
||||||
|
GoogleProjection proj;
|
||||||
|
|
||||||
|
// See email Chris Schmidt 12/02/09
|
||||||
|
double metres_per_pixel = (20037508.34/pow(2.0,
|
||||||
|
7+zoom_start));
|
||||||
|
|
||||||
|
for(int z=zoom_start; z<=zoom_end; z++)
|
||||||
|
{
|
||||||
|
ScreenPos pxStart =
|
||||||
|
proj.fromLLToPixel(curlon,nextlat,z),
|
||||||
|
pxEnd=proj.fromLLToPixel(nextlon,curlat,z);
|
||||||
|
EarthPoint bl,tr;
|
||||||
|
Image32 buf(m.getWidth(),m.getHeight());
|
||||||
|
|
||||||
|
for(int tileX=pxStart.x/256; tileX <=pxEnd.x/256; tileX++)
|
||||||
|
{
|
||||||
|
for(int tileY=pxStart.y/256;
|
||||||
|
tileY<=pxEnd.y/256; tileY++)
|
||||||
|
{
|
||||||
|
|
||||||
|
double metres_w =( (tileX*256.0) *
|
||||||
|
metres_per_pixel ) -
|
||||||
|
20037814.088;
|
||||||
|
double metres_s = 20034756.658 -
|
||||||
|
((tileY*256.0) * metres_per_pixel );
|
||||||
|
|
||||||
|
double metres_e = metres_w + (metres_per_pixel*256);
|
||||||
|
double metres_n = metres_s + (metres_per_pixel*256);
|
||||||
|
|
||||||
|
Envelope<double> bb
|
||||||
|
(metres_w-32*metres_per_pixel,
|
||||||
|
metres_s-32*metres_per_pixel,
|
||||||
|
metres_e+32*metres_per_pixel,
|
||||||
|
metres_n+32*metres_per_pixel);
|
||||||
|
m.zoomToBox(bb);
|
||||||
|
agg_renderer<Image32> r(m,buf);
|
||||||
|
r.apply();
|
||||||
|
|
||||||
|
string filename="";
|
||||||
|
std::ostringstream str;
|
||||||
|
str<< z<< "."<<tileX<<"." << tileY << ".png";
|
||||||
|
save_to_file<ImageData32>
|
||||||
|
(buf.data(),str.str(),"png");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
metres_per_pixel /= 2;
|
||||||
|
}
|
||||||
|
curlat = nextlat;
|
||||||
|
}
|
||||||
|
curlon = nextlon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// standard rendering
|
||||||
|
Map m(width,height);
|
||||||
|
parameters p;
|
||||||
|
p["type"] = "osm";
|
||||||
|
p["file"] = osmfile;
|
||||||
|
load_map(m,xmlfile);
|
||||||
|
setOSMLayers(m,p);
|
||||||
|
|
||||||
|
Envelope<double> latlon=
|
||||||
|
(hasBbox()) ?
|
||||||
|
Envelope<double>(w,s,e,n):
|
||||||
|
m.getLayer(0).envelope();
|
||||||
|
|
||||||
|
EarthPoint bottomLeft =
|
||||||
|
GoogleProjection::fromLLToGoog(latlon.minx(),latlon.miny()),
|
||||||
|
topRight =
|
||||||
|
GoogleProjection::fromLLToGoog(latlon.maxx(),latlon.maxy());
|
||||||
|
Envelope<double> bb =
|
||||||
|
Envelope<double>(bottomLeft.x,bottomLeft.y,
|
||||||
|
topRight.x,topRight.y);
|
||||||
|
m.zoomToBox(bb);
|
||||||
|
Image32 buf (m.getWidth(), m.getHeight());
|
||||||
|
agg_renderer<Image32> r(m,buf);
|
||||||
|
r.apply();
|
||||||
|
|
||||||
|
save_to_file<ImageData32>(buf.data(),outfile,"png");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapSource::setOSMLayers(Map& m, const parameters &p)
|
||||||
|
{
|
||||||
|
parameters q;
|
||||||
|
for(int count=0; count<m.layerCount(); count++)
|
||||||
|
{
|
||||||
|
q = m.getLayer(count).datasource()->params();
|
||||||
|
if(boost::get<std::string>(q["type"])=="osm")
|
||||||
|
{
|
||||||
|
m.getLayer(count).set_datasource
|
||||||
|
(datasource_cache::instance()->create(p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapSource::addSRTMLayers(Map& m,double w,double s,double e,double n)
|
||||||
|
{
|
||||||
|
// Get the layers from the map
|
||||||
|
vector<Layer> layers=m.layers();
|
||||||
|
cerr<<"***addSRTMLayers():w s e n="<<w<<" "<<s<<" "<<e<<" "<<n<<endl;
|
||||||
|
int i=0;
|
||||||
|
|
||||||
|
// Find the index of the SRTM layer
|
||||||
|
while(i<layers.size() && layers[i].name()!="srtm")
|
||||||
|
i++;
|
||||||
|
|
||||||
|
// Return if we can't find an SRTM layer
|
||||||
|
if(i==layers.size())
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
// Set the specific latlon shapefile for the first SRTM layer
|
||||||
|
|
||||||
|
parameters p;
|
||||||
|
p["type"] = "shape";
|
||||||
|
std::stringstream str;
|
||||||
|
int lon=floor(w),lat=floor(s);
|
||||||
|
str<<(lat<0 ? "S":"N")<<setw(2)<<setfill('0')<<
|
||||||
|
(lat<0 ? -lat:lat)<<
|
||||||
|
(lon>=0 ? "E":"W") << setw(3)<<setfill('0')
|
||||||
|
<<(lon>=0 ? lon:-lon)<<"c10";
|
||||||
|
p["file"] = str.str();
|
||||||
|
cerr<<"ADDING SRTM LAYER: " << p["file"] << endl;
|
||||||
|
m.getLayer(i).set_datasource(datasource_cache::instance()->create(p));
|
||||||
|
|
||||||
|
// do we have more than one srtm layer?
|
||||||
|
if(floor(w) != floor(e) || floor(s) != floor(n))
|
||||||
|
{
|
||||||
|
// remove all layers from the SRTM layer onwards. This is because there
|
||||||
|
// are multiple SRTM layers (if the current tile spans a lat/lon square
|
||||||
|
// boundary)
|
||||||
|
for(int j=i+1; j<layers.size(); j++)
|
||||||
|
m.removeLayer(j);
|
||||||
|
|
||||||
|
for(int lon=floor(w); lon<=floor(e); lon++)
|
||||||
|
{
|
||||||
|
for(int lat=floor(s); lat<=floor(n); lat++)
|
||||||
|
{
|
||||||
|
// if this isn't the bottom left lat/lon square, add another
|
||||||
|
// SRTM layer for it
|
||||||
|
if(lon!=floor(w) && lat!=floor(s))
|
||||||
|
{
|
||||||
|
parameters p;
|
||||||
|
p["type"] = "shape";
|
||||||
|
std::stringstream str;
|
||||||
|
str<<(lat<0 ? "S":"N")<<setw(2)<<setfill('0')<<
|
||||||
|
(lat<0 ? -lat:lat)<<
|
||||||
|
(lon>=0 ? "E":"W") << setw(3)<<setfill('0')
|
||||||
|
<<(lon>=0 ? lon:-lon)<<"c10";
|
||||||
|
p["file"] = str.str();
|
||||||
|
cerr<<"ADDING SRTM LAYER: " << p["file"] << endl;
|
||||||
|
Layer layer("srtm_" + str.str());
|
||||||
|
layer.add_style("contours");
|
||||||
|
layer.add_style("contours-text");
|
||||||
|
layer.set_datasource
|
||||||
|
(datasource_cache::instance()->create(p));
|
||||||
|
m.addLayer(layer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Add the other layers back
|
||||||
|
for(int j=i+1; j<layers.size(); j++)
|
||||||
|
m.addLayer(layers[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
96
plugins/input/osm/demo/MapSource.h
Executable file
96
plugins/input/osm/demo/MapSource.h
Executable file
|
@ -0,0 +1,96 @@
|
||||||
|
#ifndef MAPSOURCE_H
|
||||||
|
#define MAPSOURCE_H
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <cmath>
|
||||||
|
#include <fstream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include <boost/tokenizer.hpp>
|
||||||
|
#include <mapnik/map.hpp>
|
||||||
|
#include <mapnik/layer.hpp>
|
||||||
|
#include <mapnik/envelope.hpp>
|
||||||
|
#include <mapnik/agg_renderer.hpp>
|
||||||
|
#include <mapnik/image_util.hpp>
|
||||||
|
#include <mapnik/load_map.hpp>
|
||||||
|
#include <mapnik/datasource_cache.hpp>
|
||||||
|
#include <mapnik/font_engine_freetype.hpp>
|
||||||
|
#include <mapnik/projection.hpp>
|
||||||
|
#include "MapSource.h"
|
||||||
|
#include "GoogleProjection.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace mapnik;
|
||||||
|
|
||||||
|
|
||||||
|
class MapSource
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::string source; // osm. postgis or api
|
||||||
|
std::string osmfile;
|
||||||
|
std::string xmlfile;
|
||||||
|
std::string url;
|
||||||
|
std::string outfile;
|
||||||
|
int width, height;
|
||||||
|
double w,s,e,n;
|
||||||
|
bool useBbox, tiled, multirqst;
|
||||||
|
int zoom_start,zoom_end;
|
||||||
|
|
||||||
|
static void setOSMLayers(Map& m, const parameters &p);
|
||||||
|
static void addSRTMLayers(Map& m,double w,double s,double e,double n);
|
||||||
|
|
||||||
|
public:
|
||||||
|
MapSource()
|
||||||
|
{
|
||||||
|
osmfile="";
|
||||||
|
source="";
|
||||||
|
xmlfile="";
|
||||||
|
outfile="";
|
||||||
|
width=height=-1;
|
||||||
|
w=-181;
|
||||||
|
e=181;
|
||||||
|
n=91;
|
||||||
|
s=-91;
|
||||||
|
zoom_start=zoom_end=-1;
|
||||||
|
tiled=false;
|
||||||
|
multirqst=false;
|
||||||
|
//url="http://xapi.openstreetmap.org/api/0.5/map";
|
||||||
|
url="http://osmxapi.hypercube.telascience.org/api/0.5/map";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool isValid()
|
||||||
|
{
|
||||||
|
return xmlfile!="" && ((tiled==false&&outfile!="" &&
|
||||||
|
width>0 && height>0) ||
|
||||||
|
(tiled==true&&zoom_start>=0)) &&
|
||||||
|
((source=="osm" && osmfile!="" && width>0 && height>0) ||
|
||||||
|
(source=="api" && hasBbox() && zoom_start>=0 && tiled==true));
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSource(const std::string & src)
|
||||||
|
{
|
||||||
|
if(src=="api" || src=="osm")
|
||||||
|
{
|
||||||
|
source=src;
|
||||||
|
if(src=="api")
|
||||||
|
width=height=256;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getSource()
|
||||||
|
{
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasBbox()
|
||||||
|
{
|
||||||
|
return w>=-180 && w<=180 && s>=-90 && s<=90
|
||||||
|
&& e>=-180 && e<=180 && n>=-90 && n<=90 && w<e && s<n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void process_cmd_line_args(int argc,char *argv[]);
|
||||||
|
void generateMaps();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
9
plugins/input/osm/demo/README
Normal file
9
plugins/input/osm/demo/README
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
easymapnik: a command line tool for generating Mapnik maps from OSM data
|
||||||
|
bypassing the need to set up a PostGIS database or to deal with large
|
||||||
|
planet files. easymapnik is aimed at the user who wishes to create a
|
||||||
|
custom Mapnik OSM "slippy map" of their own local area (e.g. a county or city)
|
||||||
|
easily.
|
||||||
|
|
||||||
|
Sample command line for compiling (Mac OS X 10.5):
|
||||||
|
|
||||||
|
g++ -I/usr/local/include/mapnik -I/opt/local/include -I/usr/X11/include -I/usr/X11/include/freetype2 -I../../agg/include -L/usr/local/lib -L/opt/local/lib -lmapnik easymapnik.cpp MapSource.cpp -o easymapnik -lboost_thread-mt
|
73
plugins/input/osm/demo/easymapnik.cpp
Normal file
73
plugins/input/osm/demo/easymapnik.cpp
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#include "MapSource.h"
|
||||||
|
|
||||||
|
void usage();
|
||||||
|
void help();
|
||||||
|
|
||||||
|
|
||||||
|
//////////// modes ////////////////////////////////
|
||||||
|
//
|
||||||
|
// render an OSM file:
|
||||||
|
// Input: XMLfile OSMfile width height [bbox]
|
||||||
|
//
|
||||||
|
// render live data in 256x256 tiles:
|
||||||
|
// Input: XMLfile bbox
|
||||||
|
|
||||||
|
int main(int argc,char *argv[])
|
||||||
|
{
|
||||||
|
if(argc<2 || (argc>=2 && !strcmp(argv[1],"-h")))
|
||||||
|
{
|
||||||
|
usage();
|
||||||
|
help();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MapSource s ;
|
||||||
|
s.process_cmd_line_args(argc,argv);
|
||||||
|
|
||||||
|
if(!s.isValid())
|
||||||
|
{
|
||||||
|
cerr << "Invalid combination of command-line parameters!" << endl<<endl;
|
||||||
|
usage();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
datasource_cache::instance()->register_datasources
|
||||||
|
("/usr/local/lib/mapnik/input");
|
||||||
|
freetype_engine::register_font
|
||||||
|
("/usr/local/lib/mapnik/fonts/DejaVuSans.ttf");
|
||||||
|
|
||||||
|
s.generateMaps();
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void usage()
|
||||||
|
{
|
||||||
|
cerr << "Usage: render_new -s source [-w width] [-h height] -x xmlfile "
|
||||||
|
<< endl <<
|
||||||
|
"[-i InOSMFile] [-o OutPNGFile] [-t] [-z startzoom] [-Z endzoom] "
|
||||||
|
<< endl <<
|
||||||
|
"[-b bbox] [-u serverURL] [-m]" << endl << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void help()
|
||||||
|
{
|
||||||
|
cerr << "Source should be 'osm' or 'api', indicating OSM files and "
|
||||||
|
<< endl << "retrieval direct from a server (e.g. OSMXAPI) respectively."
|
||||||
|
<< endl <<
|
||||||
|
"-t indicates tiled mode (generate 'Google' style tiles); you must "
|
||||||
|
<< endl <<
|
||||||
|
"supply at least a start zoom, and a bounding box, for this."
|
||||||
|
<< endl <<
|
||||||
|
"-m means 'multirequest'; if you're requesting a relatively large "
|
||||||
|
<< endl <<
|
||||||
|
"area from the server (e.g. OSMXAPI), it will fetch it in "
|
||||||
|
<< "0.1x0.1 degree tiles. "
|
||||||
|
<< endl << "This speeds up processing considerably." << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
Loading…
Reference in a new issue