mapnik,agg,line_pattern_symbolizer,rasterizer_outline_aa
От: pivcorp Россия  
Дата: 08.07.11 11:21
Оценка:
Добрый день

Есть необходимость нарисовать линию используя в качестве шаблона картинку.
Картинка шириной 1 высотой 11.
Использую LinePatternSymbolizer
Получаю вместо линии нечто прерывистое
Вопрос, как нарисовать сплошную линию используя в качестве шаблона картинку?

Код мапника который это рисует такой

  template <typename T>
   void  agg_renderer<T>::process(line_pattern_symbolizer const& sym,
                               Feature const& feature,
                               proj_transform const& prj_trans)
   {

      typedef  coord_transform2<CoordTransform,geometry2d> path_type;
      typedef agg::line_image_pattern<agg::pattern_filter_bilinear_rgba8> pattern_type;
      typedef agg::renderer_base<agg::pixfmt_rgba32_plain> renderer_base;
      typedef agg::renderer_outline_image<renderer_base, pattern_type> renderer_type;
      typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;

      agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
      agg::pixfmt_rgba32_plain pixf(buf);

      ImageData32 pat =  * sym.get_image();
      renderer_base ren_base(pixf);
      agg::pattern_filter_bilinear_rgba8 filter;
      pattern_source source(pat);
      pattern_type pattern (filter,source);
      renderer_type ren(ren_base, pattern);
#if 0
      ren.clip_box(0,0,width_,height_);
#endif
      rasterizer_type ras(ren);

      for (unsigned i=0;i<feature.num_geometries();++i)
      {

         geometry2d const& geom = feature.get_geometry(i);
 
         if (geom.num_points() > 1)
         {

            path_type path(t_,geom,prj_trans);
            ras.add_path(path);
         }

      }
   }


Засада как я понял в rasterizer_outline_aa, как сказано в здесь
Автор: McSeem2
Дата: 19.08.04

Вообще, расчет сочленений при данном способе рисования — самая сложная проблема, она полностью не решена и вряд ли будет. При рисовании линии учитываются только два примыкающих отрезка, что может приводить к дефектам при рисовании очень толстых и коротких линий (толстая кривая, аппроксимированная которкими отрезками).


Т.е. чтобы нарисовать нормальную сплошную линию мне надо применить другой способ рисования.
Подскажите, пожалуйста, как переписать этот код, чтобы он рисовал нормальную сплошную линию при помощи картинки?
Чем заменить rasterizer_outline_aa?
mapnik agg line_pattern_symbolizer rasterizer_outline_aa linepatternsymbolizer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.