Index: ogrvrtlayer.cpp =================================================================== --- ogrvrtlayer.cpp (revision 15551) +++ ogrvrtlayer.cpp (working copy) @@ -69,7 +69,7 @@ iFIDField = -1; eGeometryType = VGS_Direct; - iGeomField = iGeomXField = iGeomYField = iGeomZField = -1; + iGeomField = iGeomXField = iGeomYField = iGeomZField = iGeomAggrField = -1; pszAttrFilter = NULL; panSrcField = NULL; @@ -375,6 +375,30 @@ return FALSE; } } + else if( EQUAL(pszEncoding,"PolylineFromColumns") ) + { + eGeometryType = VGS_PolylineFromColumns; + bUseSpatialSubquery = + CSLTestBoolean( + CPLGetXMLValue(psLTree, + "GeometryField.useSpatialSubquery", + "TRUE")); + iGeomXField = poSrcLayer->GetLayerDefn()->GetFieldIndex( + CPLGetXMLValue( psLTree, "GeometryField.x", "missing" ) ); + iGeomYField = poSrcLayer->GetLayerDefn()->GetFieldIndex( + CPLGetXMLValue( psLTree, "GeometryField.y", "missing" ) ); + iGeomZField = poSrcLayer->GetLayerDefn()->GetFieldIndex( + CPLGetXMLValue( psLTree, "GeometryField.z", "missing" ) ); + iGeomAggrField = poSrcLayer->GetLayerDefn()->GetFieldIndex( + CPLGetXMLValue( psLTree, "GeometryField.aggr", "missing" ) ); + + if( iGeomXField == -1 || iGeomYField == -1 || iGeomAggrField == -1 ) + { + CPLError( CE_Failure, CPLE_AppDefined, + "Unable to identify source X, Y or Aggr field for PolylineFromColumns encoding." ); + return FALSE; + } + } else { CPLError( CE_Failure, CPLE_AppDefined, @@ -476,7 +500,8 @@ /* Do we want to let source layer do spatial restriction? */ /* -------------------------------------------------------------------- */ char *pszFilter = NULL; - if( m_poFilterGeom && bUseSpatialSubquery && eGeometryType == VGS_PointFromColumns ) + if( m_poFilterGeom && bUseSpatialSubquery && + (eGeometryType == VGS_PointFromColumns || eGeometryType == VGS_PolylineFromColumns)) { const char *pszXField, *pszYField; @@ -543,29 +568,78 @@ if( !ResetSourceReading() ) return NULL; } + + if( eGeometryType == VGS_PolylineFromColumns ) + { + OGRMultiLineString *poMulti = new OGRMultiLineString; + OGRFeature *poFeature = new OGRFeature( poFeatureDefn ); + OGRFeature *poSrcFeat; + int aggr = -1; + OGRLineString *current = NULL; - for( ; TRUE; ) + + while ((poSrcFeat = poSrcLayer->GetNextFeature()) != NULL) { + double dfZ = 0.0; + + if (aggr < poSrcFeat->GetFieldAsInteger( iGeomAggrField )) { + if (current) + poMulti->addGeometryDirectly( current ); + + /* Create new Linestring */ + current = new OGRLineString(); + } + + aggr = poSrcFeat->GetFieldAsInteger( iGeomAggrField ); + + if( iGeomZField != -1 ) + dfZ = poSrcFeat->GetFieldAsDouble( iGeomZField ); + + current->addPoint(poSrcFeat->GetFieldAsDouble( iGeomXField ), + poSrcFeat->GetFieldAsDouble( iGeomYField ), + dfZ ); + + delete poSrcFeat; + } + + if (current) + poMulti->addGeometryDirectly( current ); + + poFeature->SetGeometryDirectly(poMulti); + + delete poSrcLayer; + + poSrcLayer = NULL; + + return poFeature; + } + else { - OGRFeature *poSrcFeature, *poFeature; + for( ; TRUE; ) + { + OGRFeature *poSrcFeature, *poFeature; - poSrcFeature = poSrcLayer->GetNextFeature(); - if( poSrcFeature == NULL ) - return NULL; + poSrcFeature = poSrcLayer->GetNextFeature(); + if( poSrcFeature == NULL ) + return NULL; - poFeature = TranslateFeature( poSrcFeature ); - delete poSrcFeature; + poFeature = TranslateFeature( poSrcFeature ); + delete poSrcFeature; - if( poFeature == NULL ) - return NULL; + if( poFeature == NULL ) + return NULL; - if( (m_poFilterGeom == NULL - || FilterGeometry( poFeature->GetGeometryRef() ) ) - && (m_poAttrQuery == NULL - || m_poAttrQuery->Evaluate( poFeature )) ) - return poFeature; + if( (m_poFilterGeom == NULL + || FilterGeometry( poFeature->GetGeometryRef() ) ) + && (m_poAttrQuery == NULL + || m_poAttrQuery->Evaluate( poFeature )) ) + return poFeature; - delete poFeature; + delete poFeature; + } } + + /* Should not happen */ + return NULL; } /************************************************************************/ Index: ogr_vrt.h =================================================================== --- ogr_vrt.h (revision 15551) +++ ogr_vrt.h (working copy) @@ -37,7 +37,8 @@ typedef enum { VGS_None, VGS_Direct, - VGS_PointFromColumns, + VGS_PointFromColumns, + VGS_PolylineFromColumns, VGS_WKT, VGS_WKB, VGS_Shape @@ -74,7 +75,7 @@ int iGeomField; // VGS_PointFromColumn - int iGeomXField, iGeomYField, iGeomZField; + int iGeomXField, iGeomYField, iGeomZField, iGeomAggrField; int bUseSpatialSubquery;