void createkmlliststyle ( KmlFactory * poKmlFactory, const char* pszBaseName, ContainerPtr poKmlLayerContainer, DocumentPtr poKmlDocument, const CPLString& osListStyleType, const CPLString& osListStyleIconHref) { if( osListStyleType.size() || osListStyleIconHref.size() ) { StylePtr poKmlStyle = poKmlFactory->CreateStyle ( ); const char* pszStyleName = CPLSPrintf("%s_liststyle", OGRLIBKMLGetSanitizedNCName(pszBaseName).c_str()); poKmlStyle->set_id ( pszStyleName ); ListStylePtr poKmlListStyle = poKmlFactory->CreateListStyle ( ); poKmlStyle->set_liststyle ( poKmlListStyle ); if( osListStyleType.size() ) { if( EQUAL(osListStyleType, "check") ) poKmlListStyle->set_listitemtype( kmldom::LISTITEMTYPE_CHECK ); else if( EQUAL(osListStyleType, "radioFolder") ) poKmlListStyle->set_listitemtype( kmldom::LISTITEMTYPE_RADIOFOLDER ); else if( EQUAL(osListStyleType, "checkOffOnly") ) poKmlListStyle->set_listitemtype( kmldom::LISTITEMTYPE_CHECKOFFONLY ); else if( EQUAL(osListStyleType, "checkHideChildren") ) poKmlListStyle->set_listitemtype( kmldom::LISTITEMTYPE_CHECKHIDECHILDREN ); else { CPLError(CE_Warning, CPLE_AppDefined, "Invalid value for list style type: %s. Defaulting to Check", osListStyleType.c_str()); poKmlListStyle->set_listitemtype( kmldom::LISTITEMTYPE_CHECK ); } } if( osListStyleIconHref.size() ) { ItemIconPtr poItemIcon = poKmlFactory->CreateItemIcon ( ); poItemIcon->set_href( osListStyleIconHref.c_str() ); poKmlListStyle->add_itemicon(poItemIcon); } poKmlDocument->add_styleselector ( poKmlStyle ); poKmlLayerContainer->set_styleurl( CPLSPrintf("#%s", pszStyleName) ); } }
void styletable2kml ( OGRStyleTable * poOgrStyleTable, KmlFactory * poKmlFactory, ContainerPtr poKmlContainer ) { /***** just return if the styletable is null *****/ if ( !poOgrStyleTable ) return; /***** parse the style table *****/ poOgrStyleTable->ResetStyleStringReading ( ); const char *pszStyleString; while ( ( pszStyleString = poOgrStyleTable->GetNextStyle ( ) ) ) { const char *pszStyleName = poOgrStyleTable->GetLastStyleName ( ); /***** add the style header to the kml *****/ StylePtr poKmlStyle = poKmlFactory->CreateStyle ( ); poKmlStyle->set_id ( pszStyleName + 1 ); /***** parse the style string *****/ addstylestring2kml ( pszStyleString, poKmlStyle, poKmlFactory, NULL, NULL ); /***** add the style to the container *****/ DocumentPtr poKmlDocument = AsDocument ( poKmlContainer ); //ObjectPtr pokmlObject = boost::static_pointer_cast <kmldom::Object> () ; //poKmlContainer->add_feature ( AsFeature( poKmlStyle) ); poKmlDocument->add_styleselector ( poKmlStyle ); } return; }
void styletable2kml ( OGRStyleTable * poOgrStyleTable, KmlFactory * poKmlFactory, ContainerPtr poKmlContainer, char** papszOptions ) { /***** just return if the styletable is null *****/ if ( !poOgrStyleTable ) return; std::set<CPLString> aoSetNormalStyles; std::set<CPLString> aoSetHighlightStyles; poOgrStyleTable->ResetStyleStringReading ( ); const char *pszStyleString; /* Collect styles that end with _normal or _highlight */ while ( poOgrStyleTable->GetNextStyle ( ) != NULL ) { const char *pszStyleName = poOgrStyleTable->GetLastStyleName ( ); if( strlen(pszStyleName) > strlen("_normal") && EQUAL(pszStyleName + strlen(pszStyleName) - strlen("_normal"), "_normal") ) { CPLString osName(pszStyleName); osName.resize(strlen(pszStyleName) - strlen("_normal")); aoSetNormalStyles.insert(osName); } else if( strlen(pszStyleName) > strlen("_highlight") && EQUAL(pszStyleName + strlen(pszStyleName) - strlen("_highlight"), "_highlight") ) { CPLString osName(pszStyleName); osName.resize(strlen(pszStyleName) - strlen("_highlight")); aoSetHighlightStyles.insert(osName); } } /***** parse the style table *****/ poOgrStyleTable->ResetStyleStringReading ( ); while ( ( pszStyleString = poOgrStyleTable->GetNextStyle ( ) ) != NULL ) { const char *pszStyleName = poOgrStyleTable->GetLastStyleName ( ); if( aoSetNormalStyles.find(pszStyleName) != aoSetNormalStyles.end() && aoSetHighlightStyles.find(pszStyleName) != aoSetHighlightStyles.end() ) { continue; } /***** add the style header to the kml *****/ StylePtr poKmlStyle = poKmlFactory->CreateStyle ( ); poKmlStyle->set_id ( pszStyleName ); /***** parse the style string *****/ addstylestring2kml ( pszStyleString, poKmlStyle, poKmlFactory, NULL ); /***** add balloon style *****/ const char* pszBalloonStyleBgColor = CSLFetchNameValue(papszOptions, CPLSPrintf("%s_balloonstyle_bgcolor", pszStyleName)); const char* pszBalloonStyleText = CSLFetchNameValue(papszOptions, CPLSPrintf("%s_balloonstyle_text", pszStyleName)); int nR, nG, nB, nA; OGRStylePen oStyleTool; if( (pszBalloonStyleBgColor != NULL && oStyleTool.GetRGBFromString ( pszBalloonStyleBgColor, nR, nG, nB, nA ) ) || pszBalloonStyleText != NULL ) { BalloonStylePtr poKmlBalloonStyle = poKmlFactory->CreateBalloonStyle(); if( pszBalloonStyleBgColor != NULL && oStyleTool.GetRGBFromString ( pszBalloonStyleBgColor, nR, nG, nB, nA ) ) poKmlBalloonStyle->set_bgcolor ( Color32 ( static_cast<GByte>(nA), static_cast<GByte>(nB), static_cast<GByte>(nG), static_cast<GByte>(nR) ) ); if( pszBalloonStyleText != NULL ) poKmlBalloonStyle->set_text(pszBalloonStyleText); poKmlStyle->set_balloonstyle ( poKmlBalloonStyle ); } /***** add the style to the container *****/ DocumentPtr poKmlDocument = AsDocument ( poKmlContainer ); poKmlDocument->add_styleselector ( poKmlStyle ); } /* Find style name that end with _normal and _highlight to create */ /* a StyleMap from both */ std::set<CPLString>::iterator aoSetNormalStylesIter = aoSetNormalStyles.begin(); for( ; aoSetNormalStylesIter != aoSetNormalStyles.end(); ++aoSetNormalStylesIter ) { CPLString osStyleName(*aoSetNormalStylesIter); if( aoSetHighlightStyles.find(osStyleName) != aoSetHighlightStyles.end() ) { StyleMapPtr poKmlStyleMap = poKmlFactory->CreateStyleMap ( ); poKmlStyleMap->set_id ( osStyleName ); PairPtr poKmlPairNormal = poKmlFactory->CreatePair ( ); poKmlPairNormal->set_key(STYLESTATE_NORMAL); poKmlPairNormal->set_styleurl(CPLSPrintf("#%s_normal", osStyleName.c_str())); poKmlStyleMap->add_pair(poKmlPairNormal); PairPtr poKmlPairHightlight = poKmlFactory->CreatePair ( ); poKmlPairHightlight->set_key(STYLESTATE_HIGHLIGHT); poKmlPairHightlight->set_styleurl(CPLSPrintf("#%s_highlight", osStyleName.c_str())); poKmlStyleMap->add_pair(poKmlPairHightlight); /***** add the style to the container *****/ DocumentPtr poKmlDocument = AsDocument ( poKmlContainer ); poKmlDocument->add_styleselector ( poKmlStyleMap ); } } return; }