don't throw for OGR layers with no features - refs #2260 #2352 #2354

Conflicts:
	tests/python_tests/ogr_test.py
This commit is contained in:
Dane Springmeyer 2014-08-15 19:48:27 -07:00
parent 67379d1bba
commit a4c926ac8a
3 changed files with 46 additions and 3 deletions

View File

@ -264,9 +264,16 @@ void ogr_datasource::init(mapnik::parameters const& params)
OGRErr e = layer->GetExtent(&envelope);
if (e == OGRERR_FAILURE)
{
std::ostringstream s;
s << "OGR Plugin: Extent missing for layer '" << layer->GetName() << "'. Use <extent> paramater to define a custom extent value.";
throw datasource_exception(s.str());
if (layer->GetFeatureCount() == 0)
{
MAPNIK_LOG_ERROR(ogr) << "could not determine extent, layer '" << layer->GetName() << "' appears to have no features";
}
else
{
std::ostringstream s;
s << "OGR Plugin: Cannot determine extent for layer '" << layer->GetName() << "'. Please provide a manual extent string (minx,miny,maxx,maxy).";
throw datasource_exception(s.str());
}
}
extent_.init(envelope.MinX, envelope.MinY, envelope.MaxX, envelope.MaxY);
}

9
tests/data/gpx/empty.gpx Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" standalone="yes"?>
<gpx version="1.0">
<name>Empty GPX</name>
<desc></desc>
<wpt lat="48" lon="-122">
<ele>0</ele>
<time>2001-11-28T21:06:52Z</time>
</wpt>
</gpx>

View File

@ -69,6 +69,33 @@ if 'ogr' in mapnik.DatasourceCache.plugin_names():
eq_(e.maxx,1)
eq_(e.maxy,1)
def test_ogr_reading_gpx_waypoint():
ds = mapnik.Ogr(file='../data/gpx/empty.gpx',layer='waypoints')
e = ds.envelope()
eq_(e.minx,-122)
eq_(e.miny,48)
eq_(e.maxx,-122)
eq_(e.maxy,48)
def test_ogr_empty_data_should_not_throw():
default_logging_severity = mapnik.logger.get_severity()
mapnik.logger.set_severity(mapnik.severity_type.None)
# use logger to silence expected warnings
for layer in ['routes', 'tracks', 'route_points', 'track_points']:
ds = mapnik.Ogr(file='../data/gpx/empty.gpx',layer=layer)
e = ds.envelope()
eq_(e.minx,0)
eq_(e.miny,0)
eq_(e.maxx,0)
eq_(e.maxy,0)
mapnik.logger.set_severity(default_logging_severity)
# disabled because OGR prints an annoying error: ERROR 1: Invalid Point object. Missing 'coordinates' member.
#def test_handling_of_null_features():
# ds = mapnik.Ogr(file='../data/json/null_feature.geojson',layer_by_index=0)
# fs = ds.all_features()
# eq_(len(fs),1)
if __name__ == "__main__":
setup()
exit(run_all(eval(x) for x in dir() if x.startswith("test_")))