add twkb support to sqlite plugin

This commit is contained in:
Rinigus 2017-04-23 22:48:35 +03:00
parent 7bd317a1bf
commit 9de7397043
4 changed files with 21 additions and 3 deletions

View file

@ -68,7 +68,8 @@ sqlite_datasource::sqlite_datasource(parameters const& params)
row_limit_(*params.get<mapnik::value_integer>("row_limit", 0)),
intersects_token_("!intersects!"),
desc_(sqlite_datasource::name(), *params.get<std::string>("encoding", "utf-8")),
format_(mapnik::wkbAuto)
format_(mapnik::wkbAuto),
twkb_encoding_(false)
{
/* TODO
- throw if no primary key but spatial index is present?
@ -113,6 +114,11 @@ sqlite_datasource::sqlite_datasource(parameters const& params)
{
format_ = mapnik::wkbGeneric;
}
else if (*wkb == "twkb")
{
format_ = mapnik::wkbGeneric;
twkb_encoding_ = true;
}
else
{
format_ = mapnik::wkbAuto;
@ -448,7 +454,10 @@ boost::optional<mapnik::datasource_geometry_t> sqlite_datasource::get_geometry_t
if (data)
{
mapnik::geometry::geometry<double> geom = mapnik::geometry_utils::from_wkb(data, size, format_);
mapnik::geometry::geometry<double> geom;
if (twkb_encoding_) geom = mapnik::geometry_utils::from_twkb(data, size);
else geom = mapnik::geometry_utils::from_wkb(data, size, format_);
if (mapnik::geometry::is_empty(geom))
{
continue;
@ -547,6 +556,7 @@ featureset_ptr sqlite_datasource::features(query const& q) const
desc_.get_encoding(),
e,
format_,
twkb_encoding_,
has_spatial_index_,
using_subquery_);
}
@ -627,6 +637,7 @@ featureset_ptr sqlite_datasource::features_at_point(coord2d const& pt, double to
desc_.get_encoding(),
e,
format_,
twkb_encoding_,
has_spatial_index_,
using_subquery_);
}

View file

@ -82,6 +82,7 @@ private:
const std::string intersects_token_;
mapnik::layer_descriptor desc_;
mapnik::wkbFormat format_;
bool twkb_encoding_;
bool use_spatial_index_;
bool has_spatial_index_;
bool using_subquery_;

View file

@ -49,6 +49,7 @@ sqlite_featureset::sqlite_featureset(std::shared_ptr<sqlite_resultset> rs,
std::string const& encoding,
mapnik::box2d<double> const& bbox,
mapnik::wkbFormat format,
bool twkb_encoding,
bool spatial_index,
bool using_subquery)
: rs_(rs),
@ -56,6 +57,7 @@ sqlite_featureset::sqlite_featureset(std::shared_ptr<sqlite_resultset> rs,
tr_(new transcoder(encoding)),
bbox_(bbox),
format_(format),
twkb_encoding_(twkb_encoding),
spatial_index_(spatial_index),
using_subquery_(using_subquery)
{}
@ -81,7 +83,9 @@ feature_ptr sqlite_featureset::next()
}
feature_ptr feature = feature_factory::create(ctx_,rs_->column_integer64(1));
mapnik::geometry::geometry<double> geom = geometry_utils::from_wkb(data, size, format_);
mapnik::geometry::geometry<double> geom;
if (twkb_encoding_) geom = geometry_utils::from_twkb(data, size);
else geom = geometry_utils::from_wkb(data, size, format_);
if (mapnik::geometry::is_empty(geom))
{
continue;

View file

@ -44,6 +44,7 @@ public:
std::string const& encoding,
mapnik::box2d<double> const& bbox,
mapnik::wkbFormat format,
bool twkb_encoding,
bool spatial_index,
bool using_subquery);
virtual ~sqlite_featureset();
@ -55,6 +56,7 @@ private:
const std::unique_ptr<mapnik::transcoder> tr_;
mapnik::box2d<double> bbox_;
mapnik::wkbFormat format_;
bool twkb_encoding_;
bool spatial_index_;
bool using_subquery_;