QDebug operator<<(QDebug dbg, OGRLayer* layer) { layer->ResetReading(); OGRFeatureDefn* def = layer->GetLayerDefn(); FeaturePtr feat; while ((feat = FeaturePtr(layer->GetNextFeature())) != nullptr) { for (int i = 0; i < def->GetFieldCount(); ++i) { OGRFieldDefn* fdef = def->GetFieldDefn(i); switch (fdef->GetType()) { case OFTInteger: dbg << fdef->GetNameRef() << feat->GetFieldAsInteger(i); break; case OFTReal: dbg << fdef->GetNameRef() << feat->GetFieldAsDouble(i); break; case OFTString: dbg << fdef->GetNameRef() << feat->GetFieldAsString(i); break; default: dbg << "Unknown type:" << fdef->GetType(); } } dbg << "-----"; } return dbg; }
std::tuple<size_t, size_t> countGeometry(OGRLayer* layer) { FeaturePtr feat; size_t numVerts = 0, numObj = 0; while ((feat = FeaturePtr(layer->GetNextFeature())) != nullptr) { countGeometry(feat->GetGeometryRef(), numVerts, numObj); } return std::tuple<size_t, size_t>{numVerts, numObj}; }
void extractGeometry(OGRLayer *layer, OGRCoordinateTransformation* trans, FeatureInfo& info) { FeaturePtr feat; while ((feat = FeaturePtr(layer->GetNextFeature())) != nullptr) { auto geom = feat->GetGeometryRef(); geom->transform(trans); extractGeometry(geom, info); } }
VmbErrorType FeatureContainer::GetFeatureByName( const char *name, FeaturePtr &rFeature ) { VmbError_t res; if ( NULL == name ) { return VmbErrorBadParameter; } if ( NULL == m_pImpl->m_handle ) { return VmbErrorDeviceNotOpen; } FeaturePtrMap::iterator iter = m_pImpl->m_features.find( name ); if ( iter != m_pImpl->m_features.end() ) { rFeature = iter->second; return VmbErrorSuccess; } VmbFeatureInfo_t featureInfo; res = VmbFeatureInfoQuery( m_pImpl->m_handle, name, &featureInfo, sizeof( VmbFeatureInfo_t )); if ( VmbErrorSuccess == res ) { rFeature = FeaturePtr( new Feature( &featureInfo, this )); // Only add visible features to the feature list if ( VmbFeatureVisibilityInvisible != featureInfo.visibility ) { m_pImpl->m_features[name] = rFeature; } } return (VmbErrorType)res; }
VmbErrorType FeatureContainer::GetFeatures( FeaturePtr *pFeatures, VmbUint32_t &rnSize ) { VmbError_t res; if ( NULL == m_pImpl->m_handle ) { return VmbErrorDeviceNotOpen; } // Feature list is static and therefore needs to be fetched only once per lifetime if ( false == m_pImpl->m_bAllFeaturesFetched ) { std::vector<VmbFeatureInfo_t> featureInfoList; res = VmbFeaturesList( m_pImpl->m_handle, NULL, 0, &rnSize, sizeof(VmbFeatureInfo_t) ); if ( 0 == rnSize || VmbErrorSuccess != res ) { return (VmbErrorType)res; } featureInfoList.resize( rnSize ); res = VmbFeaturesList( m_pImpl->m_handle, &featureInfoList[0], rnSize, &rnSize, sizeof(VmbFeatureInfo_t) ); if ( VmbErrorSuccess != res ) { return (VmbErrorType)res; } for ( std::vector<VmbFeatureInfo_t>::iterator iter = featureInfoList.begin(); featureInfoList.end() != iter; ++iter ) { std::string strName = iter->name; if ( 0 != strName.length() ) { if ( SP_ISNULL( m_pImpl->m_features[strName] )) { m_pImpl->m_features[strName] = FeaturePtr( new Feature( &(*iter), this )); } } } m_pImpl->m_bAllFeaturesFetched = true; } else // Features have been fetched before { res = VmbErrorSuccess; } if ( VmbErrorSuccess == res ) { if ( NULL == pFeatures ) { rnSize = (VmbUint32_t)m_pImpl->m_features.size(); return VmbErrorSuccess; } else if ( m_pImpl->m_features.size() <= rnSize ) { VmbUint32_t i = 0; for ( FeaturePtrMap::iterator iter = m_pImpl->m_features.begin(); m_pImpl->m_features.end() != iter; ++iter, ++i ) { pFeatures[i] = iter->second; } rnSize = (VmbUint32_t)m_pImpl->m_features.size(); return VmbErrorSuccess; } else { return VmbErrorMoreData; } } else { return (VmbErrorType)res; } }