void OgrWriter::_addFeature(OGRLayer* layer, shared_ptr<Feature> f, shared_ptr<Geometry> g) { OGRFeature* poFeature = OGRFeature::CreateFeature( layer->GetLayerDefn() ); // set all the column values. const QVariantMap& vm = f->getValues(); for (QVariantMap::const_iterator it = vm.constBegin(); it != vm.constEnd(); ++it) { const QVariant& v = it.value(); QByteArray ba = it.key().toUtf8(); // If the field DOESN'T exist in the output layer, skip it. if (poFeature->GetFieldIndex(ba.constData()) == -1) { continue; } switch (v.type()) { case QVariant::Invalid: poFeature->UnsetField(poFeature->GetFieldIndex(ba.constData())); break; case QVariant::Int: poFeature->SetField(ba.constData(), v.toInt()); break; case QVariant::Double: poFeature->SetField(ba.constData(), v.toDouble()); break; case QVariant::String: { QByteArray vba = v.toString().toUtf8(); poFeature->SetField(ba.constData(), vba.constData()); break; } default: strictError("Can't convert the provided value into an OGR value. (" + v.toString() + ")"); return; } } // convert the geometry. shared_ptr<GeometryCollection> gc = dynamic_pointer_cast<GeometryCollection>(g); if (gc.get() != 0) { for (size_t i = 0; i < gc->getNumGeometries(); i++) { const Geometry* child = gc->getGeometryN(i); _addFeatureToLayer(layer, f, child, poFeature); } } else { _addFeatureToLayer(layer, f, g.get(), poFeature); } OGRFeature::DestroyFeature(poFeature); }