148 lines
5 KiB
C++
148 lines
5 KiB
C++
/*****************************************************************************
|
|
*
|
|
* This file is part of Mapnik (c++ mapping toolkit)
|
|
*
|
|
* Copyright (C) 2010 Hermann Kraus
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*****************************************************************************/
|
|
|
|
|
|
#ifndef METAWRITER_JSON_HPP
|
|
#define METAWRITER_JSON_HPP
|
|
|
|
// mapnik
|
|
#include <mapnik/metawriter.hpp>
|
|
#include <mapnik/parse_path.hpp>
|
|
|
|
// boost
|
|
#include <boost/shared_ptr.hpp>
|
|
|
|
// stl
|
|
#include <fstream>
|
|
|
|
namespace mapnik {
|
|
|
|
|
|
/** Write JSON data to a stream object. */
|
|
class metawriter_json_stream : public metawriter, private boost::noncopyable
|
|
{
|
|
public:
|
|
metawriter_json_stream(metawriter_properties dflt_properties);
|
|
~metawriter_json_stream();
|
|
virtual void add_box(box2d<double> const& box, Feature const& feature,
|
|
CoordTransform const& t,
|
|
metawriter_properties const& properties);
|
|
virtual void add_text(placement const& p,
|
|
face_set_ptr face,
|
|
Feature const& feature,
|
|
CoordTransform const& t,
|
|
metawriter_properties const& properties);
|
|
virtual void add_polygon(path_type & path,
|
|
Feature const& feature,
|
|
CoordTransform const& t,
|
|
metawriter_properties const& properties);
|
|
virtual void add_line(path_type & path,
|
|
Feature const& feature,
|
|
CoordTransform const& t,
|
|
metawriter_properties const& properties);
|
|
|
|
virtual void start(metawriter_property_map const& properties);
|
|
virtual void stop();
|
|
/** Set output stream. This function has to be called before the first output is made. */
|
|
void set_stream(std::ostream *f) { f_ = f; }
|
|
/** Get output stream. */
|
|
std::ostream *get_stream() const { return f_; }
|
|
/** Only write header/footer to file with one or more features. */
|
|
void set_output_empty(bool output_empty) { output_empty_ = output_empty; }
|
|
/** See set_output_empty(). */
|
|
bool get_output_empty() { return output_empty_; }
|
|
virtual void set_map_srs(projection const& proj);
|
|
protected:
|
|
enum {
|
|
HEADER_NOT_WRITTEN = -1,
|
|
STOPPED = -2,
|
|
STARTED = 0
|
|
};
|
|
/** Features written. */
|
|
int count_;
|
|
bool output_empty_;
|
|
/** Transformation from map srs to output srs. */
|
|
proj_transform *trans_;
|
|
projection output_srs_;
|
|
virtual void write_header();
|
|
inline void write_feature_header(std::string type) {
|
|
#ifdef MAPNIK_DEBUG
|
|
if (count_ == STOPPED)
|
|
{
|
|
std::cerr << "WARNING: Metawriter not started before using it.\n";
|
|
}
|
|
#endif
|
|
if (count_ == HEADER_NOT_WRITTEN) write_header();
|
|
if (count_++) *f_ << ",\n";
|
|
|
|
*f_ << "{ \"type\": \"Feature\",\n \"geometry\": { \"type\": \""<<type<<"\",\n \"coordinates\":";
|
|
}
|
|
void write_properties(Feature const& feature, metawriter_properties const& properties);
|
|
inline void write_point(CoordTransform const& t, double x, double y, bool last = false)
|
|
{
|
|
double z = 0.0;
|
|
t.backward(&x, &y);
|
|
trans_->forward(x, y, z);
|
|
*f_ << "["<<x<<","<<y<<"]";
|
|
if (!last) {
|
|
*f_ << ",";
|
|
}
|
|
}
|
|
void write_line_polygon(path_type & path, CoordTransform const& t, bool polygon);
|
|
|
|
private:
|
|
std::ostream *f_;
|
|
};
|
|
|
|
/** Shared pointer to metawriter_json_stream object. */
|
|
typedef boost::shared_ptr<metawriter_json_stream> metawriter_json_stream_ptr;
|
|
|
|
/** JSON writer. */
|
|
class metawriter_json : public metawriter_json_stream
|
|
{
|
|
public:
|
|
metawriter_json(metawriter_properties dflt_properties, path_expression_ptr fn);
|
|
|
|
virtual void start(metawriter_property_map const& properties);
|
|
virtual void stop();
|
|
/** Set filename template.
|
|
*
|
|
* This template is processed with values from Map's metawriter properties to
|
|
* create the actual filename during start() call.
|
|
*/
|
|
void set_filename(path_expression_ptr fn);
|
|
/** Get filename template. */
|
|
path_expression_ptr get_filename() const;
|
|
private:
|
|
path_expression_ptr fn_;
|
|
std::fstream f_;
|
|
std::string filename_;
|
|
protected:
|
|
virtual void write_header();
|
|
};
|
|
|
|
/** Shared pointer to metawriter_json object. */
|
|
typedef boost::shared_ptr<metawriter_json> metawriter_json_ptr;
|
|
|
|
}
|
|
|
|
#endif
|