geojson.input - rely on expectation failure to select optional single Feature/Geometry parser
This commit is contained in:
parent
998164dc72
commit
938702dc8b
1 changed files with 24 additions and 12 deletions
|
@ -345,28 +345,40 @@ void geojson_datasource::initialise_index(Iterator start, Iterator end)
|
||||||
template <typename Iterator>
|
template <typename Iterator>
|
||||||
void geojson_datasource::parse_geojson(Iterator start, Iterator end)
|
void geojson_datasource::parse_geojson(Iterator start, Iterator end)
|
||||||
{
|
{
|
||||||
|
using boost::spirit::qi::expectation_failure;
|
||||||
boost::spirit::standard::space_type space;
|
boost::spirit::standard::space_type space;
|
||||||
mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
|
mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
|
||||||
std::size_t start_id = 1;
|
std::size_t start_id = 1;
|
||||||
|
|
||||||
mapnik::json::default_feature_callback callback(features_);
|
mapnik::json::default_feature_callback callback(features_);
|
||||||
Iterator itr = start;
|
Iterator itr = start;
|
||||||
bool result = boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_fc_grammar)
|
|
||||||
(boost::phoenix::ref(ctx),boost::phoenix::ref(start_id), boost::phoenix::ref(callback)),
|
|
||||||
space);
|
|
||||||
if (!result || itr != end)
|
|
||||||
{
|
|
||||||
if (!inline_string_.empty()) throw mapnik::datasource_exception("geojson_datasource: Failed to parse GeoJSON file from in-memory string");
|
|
||||||
else throw mapnik::datasource_exception("geojson_datasource: Failed to parse GeoJSON file '" + filename_ + "'");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (features_.size() == 0)
|
try
|
||||||
|
{
|
||||||
|
bool result = boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_fc_grammar)
|
||||||
|
(boost::phoenix::ref(ctx),boost::phoenix::ref(start_id), boost::phoenix::ref(callback)),
|
||||||
|
space);
|
||||||
|
if (!result || itr != end)
|
||||||
|
{
|
||||||
|
itr = start;
|
||||||
|
// try parsing as single Feature or single Geometry JSON
|
||||||
|
result = boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_feature_callback_grammar)
|
||||||
|
(boost::phoenix::ref(ctx),boost::phoenix::ref(start_id), boost::phoenix::ref(callback)),
|
||||||
|
space);
|
||||||
|
if (!result || itr != end)
|
||||||
|
{
|
||||||
|
if (!inline_string_.empty()) throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file from in-memory string");
|
||||||
|
else throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file '" + filename_ + "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (expectation_failure<char const*> const& ex)
|
||||||
{
|
{
|
||||||
itr = start;
|
itr = start;
|
||||||
// try parsing as single Feature or single Geometry JSON
|
// try parsing as single Feature or single Geometry JSON
|
||||||
result = boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_feature_callback_grammar)
|
bool result = boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_feature_callback_grammar)
|
||||||
(boost::phoenix::ref(ctx),boost::phoenix::ref(start_id), boost::phoenix::ref(callback)),
|
(boost::phoenix::ref(ctx),boost::phoenix::ref(start_id), boost::phoenix::ref(callback)),
|
||||||
space);
|
space);
|
||||||
if (!result || itr != end)
|
if (!result || itr != end)
|
||||||
{
|
{
|
||||||
if (!inline_string_.empty()) throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file from in-memory string");
|
if (!inline_string_.empty()) throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file from in-memory string");
|
||||||
|
|
Loading…
Reference in a new issue