Skip to content

Commit

Permalink
Workaround for exporting layers which more geometry types (e.g. polyg…
Browse files Browse the repository at this point in the history
…ons and multipolygons).

git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@6905 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
wonder committed Apr 20, 2007
1 parent 5a894b1 commit caff0a2
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 19 deletions.
72 changes: 53 additions & 19 deletions src/core/qgsvectorfilewriter.cpp
Expand Up @@ -40,7 +40,6 @@ QgsVectorFileWriter::QgsVectorFileWriter(const QString& shapefileName,
const QgsSpatialRefSys* srs)
: mDS(NULL), mLayer(NULL), mGeom(NULL), mError(NoError)
{

// save the layer as a shapefile
QString driverName = "ESRI Shapefile";

Expand Down Expand Up @@ -142,38 +141,41 @@ QgsVectorFileWriter::QgsVectorFileWriter(const QString& shapefileName,

QgsDebugMsg("Done creating fields");

mWkbType = geometryType;
// create geometry which will be used for import
mGeom = createEmptyGeometry(mWkbType);
}

OGRGeometry* QgsVectorFileWriter::createEmptyGeometry(QGis::WKBTYPE wkbType)
{
// create instance of OGR geometry (will be used to import from WKB)
switch (geometryType)
switch (wkbType)
{
case QGis::WKBPoint:
case QGis::WKBPoint25D:
mGeom = new OGRPoint;
break;
return new OGRPoint;
case QGis::WKBLineString:
case QGis::WKBLineString25D:
mGeom = new OGRLineString;
break;
return new OGRLineString;
case QGis::WKBPolygon:
case QGis::WKBPolygon25D:
mGeom = new OGRPolygon;
break;
return new OGRPolygon;
case QGis::WKBMultiPoint:
case QGis::WKBMultiPoint25D:
mGeom = new OGRMultiPoint;
break;
return new OGRMultiPoint;
case QGis::WKBMultiLineString:
case QGis::WKBMultiLineString25D:
mGeom = new OGRMultiLineString;
break;
return new OGRMultiLineString;
case QGis::WKBMultiPolygon:
case QGis::WKBMultiPolygon25D:
mGeom = new OGRMultiPolygon;
break;
return new OGRMultiPolygon;
default:
assert(0 && "invalid WKB type");
return NULL;
}
}


QgsVectorFileWriter::WriterError QgsVectorFileWriter::hasError()
{
return mError;
Expand Down Expand Up @@ -220,16 +222,47 @@ bool QgsVectorFileWriter::addFeature(QgsFeature& feature)
assert(0 && "invalid variant type");
}
}

// build geometry from WKB
QgsGeometry* geom = feature.geometry();
if (mGeom->importFromWkb(geom->wkbBuffer(), geom->wkbSize()) != OGRERR_NONE)

if (geom->wkbType() != mWkbType)
{
QgsDebugMsg("Failed to import geometry from WKB");
// there's a problem when layer type is set as wkbtype Polygon
// although there are also features of type MultiPolygon
// (at least in OGR provider)
// If the feature's wkbtype is different from the layer's wkbtype,
// try to export it too.
//
// Btw. OGRGeometry must be exactly of the type of the geometry which it will receive
// i.e. Polygons can't be imported to OGRMultiPolygon

OGRGeometry* mGeom2 = createEmptyGeometry(geom->wkbType());

OGRErr err = mGeom2->importFromWkb(geom->wkbBuffer(), geom->wkbSize());
if (err != OGRERR_NONE)
{
QgsDebugMsg("Failed to import geometry from WKB: " + QString::number(err));
OGRFeature::DestroyFeature(poFeature);
return false;
}

// pass ownership to geometry
poFeature->SetGeometryDirectly(mGeom2);
}
else
{
OGRErr err = mGeom->importFromWkb(geom->wkbBuffer(), geom->wkbSize());
if (err != OGRERR_NONE)
{
QgsDebugMsg("Failed to import geometry from WKB: " + QString::number(err));
OGRFeature::DestroyFeature(poFeature);
return false;
}

// set geometry (ownership is not passed to OGR)
poFeature->SetGeometry(mGeom);
// set geometry (ownership is not passed to OGR)
poFeature->SetGeometry(mGeom);
}

// put the created feature to layer
if (mLayer->CreateFeature(poFeature) != OGRERR_NONE)
Expand Down Expand Up @@ -290,3 +323,4 @@ QgsVectorFileWriter::WriterError

return NoError;
}

5 changes: 5 additions & 0 deletions src/core/qgsvectorfilewriter.h
Expand Up @@ -74,6 +74,8 @@ class CORE_EXPORT QgsVectorFileWriter

protected:

OGRGeometry* createEmptyGeometry(QGis::WKBTYPE wkbType);

OGRDataSource* mDS;
OGRLayer* mLayer;
OGRGeometry* mGeom;
Expand All @@ -84,6 +86,9 @@ class CORE_EXPORT QgsVectorFileWriter
WriterError mError;

QTextCodec* mCodec;

/** geometry type which is being used */
QGis::WKBTYPE mWkbType;
};

#endif

0 comments on commit caff0a2

Please sign in to comment.