void ParseStyles ( DocumentPtr poKmlDocument, OGRStyleTable ** poStyleTable ) { /***** if document is null just bail now *****/ if ( !poKmlDocument ) return; /***** loop over the Styles *****/ size_t nKmlStyles = poKmlDocument->get_styleselector_array_size ( ); size_t iKmlStyle; /***** Lets first build the style table. *****/ /***** to begin this is just proper styles. *****/ for ( iKmlStyle = 0; iKmlStyle < nKmlStyles; iKmlStyle++ ) { StyleSelectorPtr poKmlStyle = poKmlDocument->get_styleselector_array_at ( iKmlStyle ); /***** Everything that is not a style you skip *****/ if ( !poKmlStyle->IsA ( kmldom::Type_Style ) ) continue; /***** We need to check to see if this is the first style. if it *****/ /***** is we will not have a style table and need to create one *****/ if ( !*poStyleTable ) *poStyleTable = new OGRStyleTable ( ); /***** TODO:: Not sure we need to do this as we seem *****/ /***** to cast to element and then back to style. *****/ ElementPtr poKmlElement = AsElement ( poKmlStyle ); kml2styletable ( *poStyleTable, AsStyle ( poKmlElement ) ); } /***** Now we have to loop back around and get the style maps. We *****/ /***** have to do this a second time since the stylemap might matter *****/ /***** and we are just looping reference styles that are farther *****/ /***** down in the file. Order through the XML as it is parsed. *****/ for ( iKmlStyle = 0; iKmlStyle < nKmlStyles; iKmlStyle++ ) { StyleSelectorPtr poKmlStyle = poKmlDocument->get_styleselector_array_at ( iKmlStyle ); /***** Everything that is not a stylemap you skip *****/ if ( !poKmlStyle->IsA ( kmldom::Type_StyleMap ) ) continue; /***** We need to check to see if this is the first style. if it *****/ /***** is we will not have a style table and need to create one *****/ if ( !*poStyleTable ) *poStyleTable = new OGRStyleTable ( ); /***** copy the style the style map points to since *****/ char *pszStyleMapId = CPLStrdup ( poKmlStyle->get_id().c_str ( ) ); poKmlStyle = StyleFromStyleMap(kmldom::AsStyleMap(poKmlStyle), *poStyleTable); if (poKmlStyle == NULL) { CPLFree(pszStyleMapId); continue; } char *pszStyleId = CPLStrdup ( poKmlStyle->get_id().c_str ( ) ); /***** TODO:: Not sure we need to do this as we seem *****/ /***** to cast to element and then back to style. *****/ ElementPtr poKmlElement = AsElement ( poKmlStyle ); kml2styletable ( *poStyleTable, AsStyle ( poKmlElement ) ); // Change the name of the new style in the style table const char *pszTest = NULL; pszTest = (*poStyleTable)->Find(pszStyleId); // If we found the style we want in the style table we... if ( pszTest ) { (*poStyleTable)->AddStyle(pszStyleMapId, pszTest); (*poStyleTable)->RemoveStyle ( pszStyleId ); } CPLFree ( pszStyleId ); CPLFree ( pszStyleMapId ); } return; }