feature_ptr ogr_index_featureset<filterT>::next() { while (itr_ != ids_.end()) { int pos = *itr_++; layer_.SetNextByIndex (pos); OGRFeature *poFeature = layer_.GetNextFeature(); if (poFeature == nullptr) { return feature_ptr(); } // ogr feature ids start at 0, so add one to stay // consistent with other mapnik datasources that start at 1 mapnik::value_integer feature_id = (poFeature->GetFID() + 1); feature_ptr feature(feature_factory::create(ctx_,feature_id)); OGRGeometry* geom=poFeature->GetGeometryRef(); if (geom && !geom->IsEmpty()) { geom->getEnvelope(&feature_envelope_); if (!filter_.pass(mapnik::box2d<double>(feature_envelope_.MinX,feature_envelope_.MinY, feature_envelope_.MaxX,feature_envelope_.MaxY))) continue; auto geom_corrected = ogr_converter::convert_geometry(geom); mapnik::geometry::correct(geom_corrected); feature->set_geometry(std::move(geom_corrected)); } else { MAPNIK_LOG_DEBUG(ogr) << "ogr_index_featureset: Feature with null geometry=" << poFeature->GetFID(); OGRFeature::DestroyFeature( poFeature ); continue; } int fld_count = layerdef_->GetFieldCount(); for (int i = 0; i < fld_count; i++) { OGRFieldDefn* fld = layerdef_->GetFieldDefn (i); OGRFieldType type_oid = fld->GetType (); std::string fld_name = fld->GetNameRef (); switch (type_oid) { case OFTInteger: { feature->put<mapnik::value_integer>(fld_name,poFeature->GetFieldAsInteger (i)); break; } #if GDAL_VERSION_MAJOR >= 2 case OFTInteger64: { feature->put<mapnik::value_integer>( fld_name, poFeature->GetFieldAsInteger64(i)); break; } #endif case OFTReal: { feature->put(fld_name,poFeature->GetFieldAsDouble (i)); break; } case OFTString: case OFTWideString: // deprecated ! { feature->put(fld_name,tr_->transcode(poFeature->GetFieldAsString (i))); break; } case OFTIntegerList: #if GDAL_VERSION_MAJOR >= 2 case OFTInteger64List: #endif case OFTRealList: case OFTStringList: case OFTWideStringList: // deprecated ! { MAPNIK_LOG_WARN(ogr) << "ogr_index_featureset: Unhandled type_oid=" << type_oid; break; } case OFTBinary: { MAPNIK_LOG_WARN(ogr) << "ogr_index_featureset: Unhandled type_oid=" << type_oid; //feature->put(name,feat->GetFieldAsBinary (i, size)); break; } case OFTDate: case OFTTime: case OFTDateTime: // unhandled ! { MAPNIK_LOG_WARN(ogr) << "ogr_index_featureset: Unhandled type_oid=" << type_oid; break; } } } OGRFeature::DestroyFeature( poFeature ); return feature; } return feature_ptr(); }