📄 ogrfeaturestyle.cpp
字号:
CSLDestroy( papszToken ); CSLDestroy( papszToken2 ); return FALSE; } break; case OGRSTCSymbol: if (!EQUAL(papszToken[0],"SYMBOL")) { CPLError(CE_Failure, CPLE_AppDefined, "Error in the Type of StyleTool %s should be a SYMBOL Type\n", papszToken[0]); CSLDestroy( papszToken ); CSLDestroy( papszToken2 ); return FALSE; } break; case OGRSTCLabel: if (!EQUAL(papszToken[0],"LABEL")) { CPLError(CE_Failure, CPLE_AppDefined, "Error in the Type of StyleTool %s should be a LABEL Type\n", papszToken[0]); CSLDestroy( papszToken ); CSLDestroy( papszToken2 ); return FALSE; } break; case OGRSTCVector: if (!EQUAL(papszToken[0],"VECTOR")) { CPLError(CE_Failure, CPLE_AppDefined, "Error in the Type of StyleTool %s should be a VECTOR Type\n", papszToken[0]); CSLDestroy( papszToken ); CSLDestroy( papszToken2 ); return FALSE; } break; default: CPLError(CE_Failure, CPLE_AppDefined, "Error in the Type of StyleTool, Type undetermined\n"); CSLDestroy( papszToken ); CSLDestroy( papszToken2 ); return FALSE; break; } //////////////////////////////////////////////////////////////////////// // Here we will loop on each element in the StyleString. If it's // a valid element, we will add it in the StyleTool with // SetParamStr(). // // It's important to note that the SetInternalUnit...() is use to update // the unit of the StyleTool param (m_eUnit). // See OGRStyleTool::SetParamStr(). // There's a StyleTool unit (m_eUnit), which is the output unit, and each // parameter of the style have its own unit value (the input unit). Here we // set m_eUnit to the input unit and in SetParamStr(), we will use this // value to set the input unit. Then after the loop we will reset m_eUnit // to it's original value. (Yes it's a side effect / black magic) // // The pasStyle variable is a global variable passed in argument to the // function. See at the top of this file the four OGRStyleParamId // variable. They are used to register the valid parameter of each // StyleTool. //////////////////////////////////////////////////////////////////////// // Save Scale and output Units because the parsing code will alter // the values eLastUnit = m_eUnit; double dSavedScale = m_dfScale; int i, nElements = CSLCount(papszToken2); for ( i = 0; i < nElements; i++ ) { char **papszStylePair = CSLTokenizeString2( papszToken2[i], ":", CSLT_HONOURSTRINGS ); int j, nTokens = CSLCount(papszStylePair); if ( nTokens < 1 || nTokens > 2 ) { CPLError( CE_Warning, CPLE_AppDefined, "Error in the StyleTool String %s", m_pszStyleString ); CPLError( CE_Warning, CPLE_AppDefined, "Malformed element #%d (\"%s\") skipped", i, papszToken2[i] ); CSLDestroy(papszStylePair); continue; } for ( j = 0; j < nCount; j++ ) { if ( EQUAL(pasStyle[j].pszToken, papszStylePair[0]) ) { if (nTokens == 2 && pasStyle[j].bGeoref == TRUE) SetInternalInputUnitFromParam(papszStylePair[1]); // Set either the actual value of style parameter or "1" // for boolean parameters which do not have values. // "1" means that boolean parameter is present in the style // string. OGRStyleTool::SetParamStr( pasStyle[j], pasValue[j], (nTokens == 2) ? papszStylePair[1] : "1" ); break; } } CSLDestroy( papszStylePair ); } m_eUnit = eLastUnit; m_dfScale = dSavedScale; CSLDestroy(papszToken2); CSLDestroy(papszToken); return TRUE;}/************************************************************************//* SetInternalInputUnitFromParam() *//************************************************************************/void OGRStyleTool::SetInternalInputUnitFromParam(char *pszString){ char *pszUnit; if (pszString == NULL) return; pszUnit = strstr(pszString,"g"); if (pszUnit) { SetUnit(OGRSTUGround); pszUnit[0]= '\0'; return; } pszUnit = strstr(pszString,"px"); if (pszUnit) { SetUnit(OGRSTUPixel); pszUnit[0]= '\0'; return; } pszUnit = strstr(pszString,"pt"); if (pszUnit) { SetUnit(OGRSTUPoints); pszUnit[0]= '\0'; return; } pszUnit = strstr(pszString,"mm"); if (pszUnit) { SetUnit(OGRSTUMM); pszUnit[0]= '\0'; return; } pszUnit = strstr(pszString,"cm"); if (pszUnit) { SetUnit(OGRSTUCM); pszUnit[0]= '\0'; return; } pszUnit = strstr(pszString,"in"); if (pszUnit) { SetUnit(OGRSTUInches); pszUnit[0]= '\0'; return; } SetUnit(OGRSTUMM);}/************************************************************************//* ComputeWithUnit() *//************************************************************************/double OGRStyleTool::ComputeWithUnit(double dfValue, OGRSTUnitId eInputUnit){ OGRSTUnitId eOutputUnit = GetUnit(); double dfNewValue = dfValue; // dfValue in Meter; if (eOutputUnit == eInputUnit) return dfValue; switch (eInputUnit) { case OGRSTUGround: dfNewValue = dfValue / m_dfScale; break; case OGRSTUPixel: dfNewValue = dfValue / (72.0 * 39.37); break; case OGRSTUPoints: dfNewValue =dfValue / (72.0 * 39.37); break; case OGRSTUMM: dfNewValue = 0.001 * dfValue; break; case OGRSTUCM: dfNewValue = 0.01 * dfValue; break; case OGRSTUInches: dfNewValue = dfValue / 39.37; break; default: break; //imp } switch (eOutputUnit) { case OGRSTUGround: dfNewValue *= m_dfScale; break; case OGRSTUPixel: dfNewValue *= (72.0 * 39.37); break; case OGRSTUPoints: dfNewValue *= (72.0 * 39.37); break; case OGRSTUMM: dfNewValue *= 1000.0; break; case OGRSTUCM: dfNewValue *= 100.0; break; case OGRSTUInches: dfNewValue *= 39.37; break; default: break; // imp } return dfNewValue;}/************************************************************************//* ComputeWithUnit() *//************************************************************************/int OGRStyleTool::ComputeWithUnit(int nValue, OGRSTUnitId eUnit){ return (int) ComputeWithUnit((double )nValue, eUnit);}/************************************************************************//* GetParamStr() *//************************************************************************/const char *OGRStyleTool::GetParamStr(OGRStyleParamId &sStyleParam , OGRStyleValue &sStyleValue, GBool &bValueIsNull){ if (!Parse()) { bValueIsNull = TRUE; return NULL; } bValueIsNull = !sStyleValue.bValid; if (bValueIsNull == TRUE) return NULL; switch (sStyleParam.eType) { // if sStyleParam.bGeoref == TRUE , need to convert to output value; case OGRSTypeString: return sStyleValue.pszValue; case OGRSTypeDouble: if (sStyleParam.bGeoref) return CPLSPrintf("%f",ComputeWithUnit(sStyleValue.dfValue, sStyleValue.eUnit)); else return CPLSPrintf("%f",sStyleValue.dfValue); case OGRSTypeInteger: if (sStyleParam.bGeoref) return CPLSPrintf("%d",ComputeWithUnit(sStyleValue.nValue, sStyleValue.eUnit)); else return CPLSPrintf("%d",sStyleValue.nValue); case OGRSTypeBoolean: return CPLSPrintf("%d",sStyleValue.nValue); default: bValueIsNull = TRUE; return NULL; }}/****************************************************************************//* int OGRStyleTool::GetParamNum(OGRStyleParamId sStyleParam , *//* OGRStyleValue sStyleValue, *//* GBool &bValueIsNull) *//* *//****************************************************************************/int OGRStyleTool::GetParamNum(OGRStyleParamId &sStyleParam , OGRStyleValue &sStyleValue, GBool &bValueIsNull){ return (int)GetParamDbl(sStyleParam,sStyleValue,bValueIsNull);}/****************************************************************************//* double OGRStyleTool::GetParamDbl(OGRStyleParamId sStyleParam , *//* OGRStyleValue sStyleValue, *//* GBool &bValueIsNull) *//* *//****************************************************************************/double OGRStyleTool::GetParamDbl(OGRStyleParamId &sStyleParam , OGRStyleValue &sStyleValue, GBool &bValueIsNull){ if (!Parse()) { bValueIsNull = TRUE; return 0; } bValueIsNull = !sStyleValue.bValid; if (bValueIsNull == TRUE) return 0; switch (sStyleParam.eType) { // if sStyleParam.bGeoref == TRUE , need to convert to output value; case OGRSTypeString: if (sStyleParam.bGeoref) return ComputeWithUnit(atof(sStyleValue.pszValue), sStyleValue.eUnit); else return atof(sStyleValue.pszValue); case OGRSTypeDouble: if (sStyleParam.bGeoref) return ComputeWithUnit(sStyleValue.dfValue, sStyleValue.eUnit); else return sStyleValue.dfValue; case OGRSTypeInteger: if (sStyleParam.bGeoref) return (double)ComputeWithUnit(sStyleValue.nValue, sStyleValue.eUnit); else return (double)sStyleValue.nValue; case OGRSTypeBoolean:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -