added feature factory

This commit is contained in:
Artem Pavlenko 2005-11-24 15:51:29 +00:00
parent fc015c3a10
commit 01f9df9b43
13 changed files with 182 additions and 76 deletions

View file

@ -28,7 +28,7 @@ opts.Add(PathOption('AGG_ROOT','agg source root directory','/opt/agg23'))
opts.Add(PathOption('FREETYPE2_ROOT','freetype2 root directory','/opt/freetype2'))
opts.Add(PathOption('PYTHON_ROOT','python root directory','/opt/python'))
opts.Add('PYTHON_VERSION','python version','2.4')
opts.Add(ListOption('DATASOURCES','list of available datasources','postgis',['postgis','shape']))
opts.Add(ListOption('DATASOURCES','list of available datasources','shape',['postgis','shape','raster']))
opts.Add('POSTGRESQL_ROOT','path to postgresql prefix','/usr/local')
platform = ARGUMENTS.get("OS",Platform())
@ -36,9 +36,9 @@ platform = ARGUMENTS.get("OS",Platform())
build_dir = 'build'
build_prefix = build_dir+'/'+str(platform)
cxx = 'g++'
#cxx = 'g++'
env = Environment(CXX=cxx,ENV=os.environ, options=opts)
env = Environment(ENV=os.environ, options=opts)
cxx_debug='-Wall -ftemplate-depth-100 -O0 -fno-inline -g -pthread -DDEBUG'
cxx_release='-Wall -ftemplate-depth-100 -O3 -finline-functions -Wno-inline -pthread -DNDEBUG'

View file

@ -86,6 +86,11 @@ namespace mapnik
{
return raster_;
}
void set_raster(raster_type const& raster)
{
raster_=raster;
}
void reserve_props(unsigned n)
{
props_.reserve(n);

View file

@ -0,0 +1,37 @@
/* This file is part of Mapnik (c++ mapping toolkit)
* Copyright (C) 2005 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 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.
*/
//$Id$
#ifndef FEATURE_FACTORY_HPP
#define FEATURE_FACTORY_HPP
#include "feature.hpp"
namespace mapnik
{
struct feature_factory
{
static Feature* create (int fid)
{
return new Feature(fid);
}
};
}
#endif //FEATURE_FACTORY_HPP

View file

@ -71,7 +71,7 @@ namespace mapnik
{
cont_.push_back(x,y,SEG_LINETO);
}
template <typename Transform>
class path_iterator
{

View file

@ -65,8 +65,8 @@ namespace mapnik
void add_to_selection(ref_ptr<Feature>& feature) const;
std::vector<ref_ptr<Feature> >& selection() const;
void clear_selection() const;
const datasource_p& datasource() const;
const Envelope<double>& envelope() const;
datasource_p const& datasource() const;
Envelope<double> const& envelope() const;
virtual ~Layer();
private:
void swap(const Layer& other);

View file

@ -28,10 +28,10 @@ namespace mapnik
class Map
{
private:
static const int MIN_MAPSIZE=16;
static const int MAX_MAPSIZE=1024;
int width_;
int height_;
static const unsigned MIN_MAPSIZE=16;
static const unsigned MAX_MAPSIZE=1024;
unsigned width_;
unsigned height_;
int srid_;
Color background_;
std::vector<Layer> layers_;
@ -46,8 +46,11 @@ namespace mapnik
void removeLayer(size_t index);
void removeLayer(const char* lName);
std::vector<Layer> const& layers() const;
int getWidth() const;
int getHeight() const;
unsigned getWidth() const;
unsigned getHeight() const;
void setWidth(unsigned width);
void setHeight(unsigned height);
void resize(unsigned width,unsigned height);
int srid() const;
void setBackground(const Color& c);
const Color& getBackground() const;

View file

@ -57,6 +57,7 @@
#include "wkb.hpp"
#include "map.hpp"
#include "feature_type_style.hpp"
#include "feature_factory.hpp"
#include "math_expr.hpp"
#include "value.hpp"
#include "expression.hpp"
@ -73,4 +74,4 @@ namespace mapnik
{
}
#endif //MAPNIK_HPP
#endif //MAPNIK_HPP

View file

@ -23,8 +23,6 @@
#include "symbolizer.hpp"
#include "image_reader.hpp"
//#include "scanline_aa.hpp"
//#include "line_aa.hpp"
#include "agg_basics.h"
#include "agg_rendering_buffer.h"
#include "agg_rasterizer_scanline_aa.h"
@ -33,6 +31,7 @@
#include "agg_renderer_scanline.h"
#include "agg_pixfmt_rgba.h"
#include "agg_path_storage.h"
#include "agg_span_allocator.h"
#include "agg_span_pattern_rgba.h"
namespace mapnik
@ -50,8 +49,6 @@ namespace mapnik
void render(geometry_type& geom,Image32& image) const
{
//ScanlineRasterizerAA<Image32> rasterizer(image);
//rasterizer.render<SHIFT8>(geom,fill_);
typedef agg::renderer_base<agg::pixfmt_rgba32> ren_base;
typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
agg::row_ptr_cache<agg::int8u> buf(image.raw_data(),image.width(),image.height(),
@ -62,14 +59,14 @@ namespace mapnik
double r=fill_.red()/255.0;
double g=fill_.green()/255.0;
double b=fill_.blue()/255.0;
double a=fill_.alpha()/255.0;
renderer ren(renb);
agg::rasterizer_scanline_aa<> ras;
agg::scanline_u8 sl;
ras.clip_box(0,0,image.width(),image.height());
ras.add_path(geom);
ren.color(agg::rgba(r, g, b, 1.0));
ren.color(agg::rgba(r, g, b, a));
agg::render_scanlines(ras, sl, ren);
}
@ -92,8 +89,6 @@ namespace mapnik
try
{
std::auto_ptr<ImageReader> reader(get_image_reader(type,file));
std::cout<<"image width="<<reader->width()<<std::endl;
std::cout<<"image height="<<reader->height()<<std::endl;
reader->read(0,0,pattern_);
}
catch (...)
@ -107,7 +102,6 @@ namespace mapnik
void render(geometry_type& geom,Image32& image) const
{
typedef agg::renderer_base<agg::pixfmt_rgba32> ren_base;
typedef agg::renderer_scanline_aa_solid<ren_base> renderer_solid;
agg::row_ptr_cache<agg::int8u> buf(image.raw_data(),image.width(),image.height(),
image.width()*4);
@ -124,19 +118,23 @@ namespace mapnik
agg::order_rgba,
wrap_x_type,
wrap_y_type> span_gen_type;
typedef agg::renderer_scanline_aa<ren_base, span_gen_type> renderer_type;
typedef agg::renderer_scanline_aa<ren_base,
agg::span_allocator<agg::rgba8>,
span_gen_type> renderer_type;
unsigned offset_x = 0;
unsigned offset_y = 0;
agg::span_allocator<agg::rgba8> sa;
span_gen_type sg(sa, pattern_rbuf, offset_x, offset_y);
renderer_type rp(renb, sg);
span_gen_type sg(pattern_rbuf,offset_x, offset_y);
renderer_type rp(renb,sa, sg);
agg::rasterizer_scanline_aa<> ras;
agg::scanline_u8 sl;
ras.clip_box(0,0,image.width(),image.height());
ras.add_path(geom);
//ren.color(agg::rgba(r, g, b, 1.0));
agg::render_scanlines(ras, sl, rp);
}

View file

@ -33,29 +33,39 @@ namespace mapnik
{
private:
Envelope<double> bbox_;
unsigned width_;
unsigned height_;
filter<Feature>* filter_;
std::set<std::string> names_;
public:
query()
query(unsigned width,unsigned height)
: bbox_(std::numeric_limits<double>::min(),
std::numeric_limits<double>::min(),
std::numeric_limits<double>::max(),
std::numeric_limits<double>::max()),
width_(width),
height_(height),
filter_(new all_filter<Feature>)
{}
query(const Envelope<double>& bbox)
query(const Envelope<double>& bbox,unsigned width,unsigned height)
: bbox_(bbox),
width_(width),
height_(height),
filter_(new all_filter<Feature>)
{}
query(const Envelope<double>& bbox,const filter<Feature>& f)
query(const Envelope<double>& bbox,unsigned width,unsigned height,const filter<Feature>& f)
: bbox_(bbox),
width_(width),
height_(height),
filter_(f.clone())
{}
query(const query& other)
: bbox_(other.bbox_),
width_(other.width_),
height_(other.height_),
filter_(other.filter_->clone())
{}
@ -65,6 +75,8 @@ namespace mapnik
delete filter_;
filter_=tmp;
bbox_=other.bbox_;
width_=other.width_;
height_=other.height_;
names_=other.names_;
return *this;
}
@ -79,6 +91,16 @@ namespace mapnik
return bbox_;
}
unsigned get_width() const
{
return width_;
}
unsigned get_height() const
{
return height_;
}
void set_filter(const filter<Feature>& f)
{
filter<Feature>* tmp=f.clone();

View file

@ -39,8 +39,11 @@ namespace mapnik
static void render(const Map& map,Image& image);
private:
Renderer();
static void renderLayer(const Layer& l,const CoordTransform& t,const Envelope<double>& bbox,Image& image);
static void render_vector_layer(const Layer& l,unsigned width,unsigned height,
const Envelope<double>& bbox,Image& image);
static void render_raster_layer(const Layer& l,unsigned width,unsigned height,
const Envelope<double>& bbox,Image& image);
};
}
#endif //RENDER_HPP
#endif //RENDER_HPP

View file

@ -18,13 +18,12 @@
# $Id$
#edit this file
PREFIX = '/opt/mapnik'
BOOST_ROOT = '/opt/boost'
FREETYPE2_ROOT = '/opt/freetype2'
BOOST_ROOT = '/home/artem/projects/boost_1_33_0'
FREETYPE2_ROOT = '/usr/include/freetype2'
PYTHON_VERSION = '2.4'
PYTHON_ROOT = '/opt/python'
AGG_ROOT = '/opt/agg23'
AGG_ROOT = '/opt/agg24'
# postgis datasource
POSTGRESQL_ROOT = '/opt/postgresql8'

View file

@ -77,15 +77,43 @@ namespace mapnik
return layers_;
}
int Map::getWidth() const
unsigned Map::getWidth() const
{
return width_;
}
int Map::getHeight() const
unsigned Map::getHeight() const
{
return height_;
}
void Map::setWidth(unsigned width)
{
if (width >= MIN_MAPSIZE && width <= MAX_MAPSIZE)
{
width_=width;
fixAspectRatio();
}
}
void Map::setHeight(unsigned height)
{
if (height >= MIN_MAPSIZE && height <= MAX_MAPSIZE)
{
height_=height;
fixAspectRatio();
}
}
void Map::resize(unsigned width,unsigned height)
{
if (width >= MIN_MAPSIZE && width <= MAX_MAPSIZE &&
height >= MIN_MAPSIZE && height <= MAX_MAPSIZE)
{
width_=width;
height_=height;
fixAspectRatio();
}
}
int Map::srid() const
{
@ -121,28 +149,15 @@ namespace mapnik
{
double ratio1 = (double) width_ / (double) height_;
double ratio2 = currentExtent_.width() / currentExtent_.height();
if (ratio1 >= 1.0)
{
if (ratio2 > ratio1)
{
currentExtent_.height(currentExtent_.width() / ratio1);
}
else
{
currentExtent_.width(currentExtent_.height() * ratio1);
}
}
else
{
if (ratio2 > ratio1)
{
currentExtent_.width(currentExtent_.height() * ratio1);
}
else
{
currentExtent_.height(currentExtent_.width() / ratio1);
}
}
if (ratio2 > ratio1)
{
currentExtent_.height(currentExtent_.width() / ratio1);
}
else if (ratio2 < ratio1)
{
currentExtent_.width(currentExtent_.height() * ratio1);
}
}
const Envelope<double>& Map::getCurrentExtent() const

View file

@ -43,15 +43,12 @@ namespace mapnik
{
template <typename Image>
void Renderer<Image>::renderLayer(const Layer& l,const CoordTransform& t,
void Renderer<Image>::render_vector_layer(const Layer& l,unsigned width,unsigned height,
const Envelope<double>& bbox,Image& image)
{
const datasource_p& ds=l.datasource();
if (!ds) return;
//volatile named_style_cache* styles=named_style_cache::instance();
//get copy
CoordTransform t(width,height,bbox);
std::vector<std::string> const& namedStyles=l.styles();
std::vector<std::string>::const_iterator stylesIter=namedStyles.begin();
while (stylesIter!=namedStyles.end())
@ -62,7 +59,7 @@ namespace mapnik
attribute_collector<Feature> collector(names);
property_index<Feature> indexer(names);
query q(bbox);
query q(bbox,width,height);
double scale = 1.0/t.scale();
std::vector<rule_type*> if_rules;
std::vector<rule_type*> else_rules;
@ -148,7 +145,6 @@ namespace mapnik
}
}
}
//delete feature;
}
}
@ -176,6 +172,28 @@ namespace mapnik
}
}
}
template <typename Image>
void Renderer<Image>::render_raster_layer(const Layer& l,unsigned width,unsigned height,
const Envelope<double>& bbox,Image& image)
{
const datasource_p& ds=l.datasource();
if (!ds) return;
query q(bbox,width,height);
featureset_ptr fs=ds->features(q);
if (fs)
{
feature_ptr feature;
while ((feature = fs->next()))
{
raster_ptr const& raster=feature->get_raster();
if (raster)
{
image.set_rectangle(raster->x_,raster->y_,raster->data_);
}
}
}
}
template <typename Image>
void Renderer<Image>::render(const Map& map,Image& image)
@ -183,26 +201,31 @@ namespace mapnik
timer clock;
//////////////////////////////////////////////////////
const Envelope<double>& extent=map.getCurrentExtent();
std::cout<<"BBOX:"<<extent<<"\n";
std::cout<<"BBOX:"<<extent<<std::endl;
double scale=map.scale();
std::cout<<" scale="<<scale<<"\n";
std::cout<<" scale="<<scale<<std::endl;
unsigned width=map.getWidth();
unsigned height=map.getHeight();
CoordTransform t(width,height,extent);
const Color& background=map.getBackground();
Color const& background=map.getBackground();
image.setBackground(background);
for (size_t n=0;n<map.layerCount();++n)
{
const Layer& l=map.getLayer(n);
if (l.isVisible(scale))
{
//TODO make datasource to return its extent!!!
renderLayer(l,t,extent,image);
if (l.isVisible(scale)) // TODO: extent check
{
if (l.datasource()->type() == datasource::Vector)
{
render_vector_layer(l,width,height,extent,image);
}
else if (l.datasource()->type() == datasource::Raster)
{
render_raster_layer(l,width,height,extent,image);
}
}
}
}
clock.stop();
}