QgsSymbolV2* QgsGraduatedSymbolRendererV2::symbolForFeature( QgsFeature& feature ) { const QgsAttributeMap& attrMap = feature.attributeMap(); QgsAttributeMap::const_iterator ita = attrMap.find( mAttrNum ); if ( ita == attrMap.end() ) { QgsDebugMsg( "attribute required by renderer not found: " + mAttrName + "(index " + QString::number( mAttrNum ) + ")" ); return NULL; } // find the right category QgsSymbolV2* symbol = symbolForValue( ita->toDouble() ); if ( symbol == NULL ) return NULL; if ( mRotationFieldIdx == -1 && mSizeScaleFieldIdx == -1 ) return symbol; // no data-defined rotation/scaling - just return the symbol // find out rotation, size scale double rotation = 0; double sizeScale = 1; if ( mRotationFieldIdx != -1 ) rotation = attrMap[mRotationFieldIdx].toDouble(); if ( mSizeScaleFieldIdx != -1 ) sizeScale = attrMap[mSizeScaleFieldIdx].toDouble(); // take a temporary symbol (or create it if doesn't exist) QgsSymbolV2* tempSymbol = mTempSymbols[symbol]; // modify the temporary symbol and return it if ( tempSymbol->type() == QgsSymbolV2::Marker ) { QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( tempSymbol ); if ( mRotationFieldIdx != -1 ) markerSymbol->setAngle( rotation ); if ( mSizeScaleFieldIdx != -1 ) markerSymbol->setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() ); markerSymbol->setScaleMethod( mScaleMethod ); } else if ( tempSymbol->type() == QgsSymbolV2::Line ) { QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( tempSymbol ); if ( mSizeScaleFieldIdx != -1 ) lineSymbol->setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() ); } return tempSymbol; }
bool QgsGPXProvider::addFeature( QgsFeature& f ) { unsigned char* geo = f.geometry()->asWkb(); QGis::WkbType wkbType = f.geometry()->wkbType(); bool success = false; QgsGPSObject* obj = NULL; const QgsAttributeMap& attrs( f.attributeMap() ); QgsAttributeMap::const_iterator it; // is it a waypoint? if ( mFeatureType == WaypointType && geo != NULL && wkbType == QGis::WKBPoint ) { // add geometry QgsWaypoint wpt; std::memcpy( &wpt.lon, geo + 5, sizeof( double ) ); std::memcpy( &wpt.lat, geo + 13, sizeof( double ) ); // add waypoint-specific attributes for ( it = attrs.begin(); it != attrs.end(); ++it ) { if ( it.key() == EleAttr ) { bool eleIsOK; double ele = it->toDouble( &eleIsOK ); if ( eleIsOK ) wpt.ele = ele; } else if ( it.key() == SymAttr ) { wpt.sym = it->toString(); } } QgsGPSData::WaypointIterator iter = data->addWaypoint( wpt ); success = true; obj = &( *iter ); } // is it a route? if ( mFeatureType == RouteType && geo != NULL && wkbType == QGis::WKBLineString ) { QgsRoute rte; // reset bounds rte.xMin = std::numeric_limits<double>::max(); rte.xMax = -std::numeric_limits<double>::max(); rte.yMin = std::numeric_limits<double>::max(); rte.yMax = -std::numeric_limits<double>::max(); // add geometry int nPoints; std::memcpy( &nPoints, geo + 5, 4 ); for ( int i = 0; i < nPoints; ++i ) { double lat, lon; std::memcpy( &lon, geo + 9 + 16 * i, sizeof( double ) ); std::memcpy( &lat, geo + 9 + 16 * i + 8, sizeof( double ) ); QgsRoutepoint rtept; rtept.lat = lat; rtept.lon = lon; rte.points.push_back( rtept ); rte.xMin = rte.xMin < lon ? rte.xMin : lon; rte.xMax = rte.xMax > lon ? rte.xMax : lon; rte.yMin = rte.yMin < lat ? rte.yMin : lat; rte.yMax = rte.yMax > lat ? rte.yMax : lat; } // add route-specific attributes for ( it = attrs.begin(); it != attrs.end(); ++it ) { if ( it.key() == NumAttr ) { bool numIsOK; long num = it->toInt( &numIsOK ); if ( numIsOK ) rte.number = num; } } QgsGPSData::RouteIterator iter = data->addRoute( rte ); success = true; obj = &( *iter ); } // is it a track? if ( mFeatureType == TrackType && geo != NULL && wkbType == QGis::WKBLineString ) { QgsTrack trk; QgsTrackSegment trkseg; // reset bounds trk.xMin = std::numeric_limits<double>::max(); trk.xMax = -std::numeric_limits<double>::max(); trk.yMin = std::numeric_limits<double>::max(); trk.yMax = -std::numeric_limits<double>::max(); // add geometry int nPoints; std::memcpy( &nPoints, geo + 5, 4 ); for ( int i = 0; i < nPoints; ++i ) { double lat, lon; std::memcpy( &lon, geo + 9 + 16 * i, sizeof( double ) ); std::memcpy( &lat, geo + 9 + 16 * i + 8, sizeof( double ) ); QgsTrackpoint trkpt; trkpt.lat = lat; trkpt.lon = lon; trkseg.points.push_back( trkpt ); trk.xMin = trk.xMin < lon ? trk.xMin : lon; trk.xMax = trk.xMax > lon ? trk.xMax : lon; trk.yMin = trk.yMin < lat ? trk.yMin : lat; trk.yMax = trk.yMax > lat ? trk.yMax : lat; } // add track-specific attributes for ( it = attrs.begin(); it != attrs.end(); ++it ) { if ( it.key() == NumAttr ) { bool numIsOK; long num = it->toInt( &numIsOK ); if ( numIsOK ) trk.number = num; } } trk.segments.push_back( trkseg ); QgsGPSData::TrackIterator iter = data->addTrack( trk ); success = true; obj = &( *iter ); } // add common attributes if ( obj ) { for ( it = attrs.begin(); it != attrs.end(); ++it ) { if ( it.key() == NameAttr ) { obj->name = it->toString(); } else if ( it.key() == CmtAttr ) { obj->cmt = it->toString(); } else if ( it.key() == DscAttr ) { obj->desc = it->toString(); } else if ( it.key() == SrcAttr ) { obj->src = it->toString(); } else if ( it.key() == URLAttr ) { obj->url = it->toString(); } else if ( it.key() == URLNameAttr ) { obj->urlname = it->toString(); } } } return success; }