static ContainerPtr MyGetContainerFromRoot ( KmlFactory *m_poKmlFactory, ElementPtr poKmlRoot ) { ContainerPtr poKmlContainer = NULL; if ( poKmlRoot ) { /***** skip over the <kml> we want the container *****/ if ( poKmlRoot->IsA ( kmldom::Type_kml ) ) { KmlPtr poKmlKml = AsKml ( poKmlRoot ); if ( poKmlKml->has_feature ( ) ) { FeaturePtr poKmlFeat = poKmlKml->get_feature ( ); if ( poKmlFeat->IsA ( kmldom::Type_Container ) ) poKmlContainer = AsContainer ( poKmlFeat ); else if ( poKmlFeat->IsA ( kmldom::Type_Placemark ) ) { poKmlContainer = m_poKmlFactory->CreateDocument ( ); poKmlContainer->add_feature ( kmldom::AsFeature(kmlengine::Clone(poKmlFeat)) ); } } } else if ( poKmlRoot->IsA ( kmldom::Type_Container ) ) poKmlContainer = AsContainer ( poKmlRoot ); } return poKmlContainer; }
OGRErr OGRLIBKMLLayer::ICreateFeature ( OGRFeature * poOgrFeat ) { if ( !bUpdate ) return OGRERR_UNSUPPORTED_OPERATION; if( m_bRegionBoundsAuto && poOgrFeat->GetGeometryRef() != NULL && !(poOgrFeat->GetGeometryRef()->IsEmpty()) ) { OGREnvelope sEnvelope; poOgrFeat->GetGeometryRef()->getEnvelope(&sEnvelope); m_dfRegionMinX = MIN(m_dfRegionMinX, sEnvelope.MinX); m_dfRegionMinY = MIN(m_dfRegionMinY, sEnvelope.MinY); m_dfRegionMaxX = MAX(m_dfRegionMaxX, sEnvelope.MaxX); m_dfRegionMaxY = MAX(m_dfRegionMaxY, sEnvelope.MaxY); } FeaturePtr poKmlFeature = feat2kml ( m_poOgrDS, this, poOgrFeat, m_poOgrDS->GetKmlFactory ( ), m_bUseSimpleField ); if( m_poKmlLayer != NULL ) m_poKmlLayer->add_feature ( poKmlFeature ); else { CPLAssert( m_poKmlUpdate != NULL ); KmlFactory *poKmlFactory = m_poOgrDS->GetKmlFactory ( ); CreatePtr poCreate = poKmlFactory->CreateCreate(); ContainerPtr poContainer; if( m_bUpdateIsFolder ) poContainer = poKmlFactory->CreateFolder(); else poContainer = poKmlFactory->CreateDocument(); poContainer->set_targetid(OGRLIBKMLGetSanitizedNCName(GetName())); poContainer->add_feature ( poKmlFeature ); poCreate->add_container(poContainer); m_poKmlUpdate->add_updateoperation(poCreate); } /***** update the layer class count of features *****/ if( m_poKmlLayer != NULL ) { nFeatures++; const char* pszId = CPLSPrintf("%s.%d", OGRLIBKMLGetSanitizedNCName(GetName()).c_str(), nFeatures); poOgrFeat->SetFID(nFeatures); poKmlFeature->set_id(pszId); } else { if( poOgrFeat->GetFID() < 0 ) { static int bAlreadyWarned = FALSE; if( !bAlreadyWarned ) { bAlreadyWarned = TRUE; CPLError(CE_Warning, CPLE_AppDefined, "It is recommended to define a FID when calling CreateFeature() in a update document"); } } else { const char* pszId = CPLSPrintf("%s." CPL_FRMT_GIB, OGRLIBKMLGetSanitizedNCName(GetName()).c_str(), poOgrFeat->GetFID()); poOgrFeat->SetFID(nFeatures); poKmlFeature->set_id(pszId); } } /***** mark the layer as updated *****/ bUpdated = TRUE; m_poOgrDS->Updated ( ); return OGRERR_NONE; }