[mapguide-internals] RFC60 - Server integration issues
UV
uvwild at gmail.com
Tue Mar 17 12:23:58 EDT 2009
The whole approach regarding integration into the server has changed in
the last week as some more clarity emerged after a number of debugging
session.
We confirmed that the base colors of the map needs to be collected per
BaseGroup and per zoomlevel.
This creates the small problem of providing access to the relevant
objects from within the imageconverter
I made a sequence diagram to support demonstrating this issue and are
trying to enclose it....(link to WIKI below)
The difficulty I am now facing is that the runtime map object MgMap
which has access to the colordata in the map via the VectorLayerDefinitions
needs the current zoom level and the name of the basemaplayergroup to
determine the correct colors from the VectorLayerDefinitions of a map.
1. Most simply I would like to inject the relevant references to the
colormap into imageconverter in AGGImageIO from the rendering service.
However, AGGImageIo is only used as a namespace and not as a real object
instance (static methods and c code only) so this would be working only
for a single user scenario.
2. So the next approach would be to hand down the relevant references
over the stack, down the call graph to the ImageIo,
but this means changing 5-6 method signatures to pass down the map
reference and the basegroupname ..... this feels not so good either....
3. maybe I should create instances of the AGGImageIo and use injection
of the references from the rendering service.....
anyone has a better idea?
diagram at
http://trac.osgeo.org/mapguide/attachment/wiki/MapGuideArchitecture/GetTileSequence.png?format=raw
<GetTileSequence>
//-------------------------------------------------------------------------
// PURPOSE: Accessor method for the base colors defined in this Layer.
// RETURNS: A pointer to the collection of colors per scalerange so we
can compute the colormap from this with a given zoomlevel
// and basemapname.... the colors are indexed with labels from the rules
they are found in
//-------------------------------------------------------------------------
PSCALECOLORMAP VectorLayerDefinition::GetColorScaleMap()
{
if (this->m_colorMap == NULL)
{
this->m_colorMap = new SCALECOLORMAP();
int csrcount = this->m_collScaleRanges.GetCount();
for (int i=0; i< csrcount; i++)
{
PCOLORMULTIMAP cpolorMultiMap = new COLORMULTIMAP();
VectorScaleRange* pvsr = this->m_collScaleRanges.GetAt(i);
// we simply keep all colors in a larger map
// iterate through the featuretypecollection
FeatureTypeStyleCollection* pftsColl =
pvsr->GetFeatureTypeStyles();
int ftsccount = pftsColl->GetCount();
for (int j=0; j< ftsccount; j++)
{
FeatureTypeStyle* pfts = pftsColl->GetAt(j);
// iterate through the rulecollection
RuleCollection* ruleColl = pfts->GetRules();
int rccount = ruleColl->GetCount();
for (int k=0; k < rccount; k++)
{
Rule* rule = ruleColl->GetAt(k);
// get the label which will be the key in the color map
const MdfString& label = rule->GetLegendLabel();
// do the casting to access the relevant members
// this is bad style but we save touching too many
different files
AreaRule* paRule = dynamic_cast<AreaRule*>(rule);
LineRule* plRule = dynamic_cast<LineRule*>(rule);
//PointRule* ppRule =
dynamic_cast<PointRule*>(rule); // only line and area for now
//CompositeRule* pcRule =
dynamic_cast<CompositeRule*>(rule);
if (paRule != NULL)
{
AreaSymbolization2D* pasym =
paRule->GetSymbolization();
pcolorMultiMap ->insert
(LABELCOLORPAIR(label,pasym->GetFill()->GetForegroundColor()));
pcolorMultiMap->insert
(LABELCOLORPAIR(label,pasym->GetFill()->GetBackgroundColor()));
pcolorMultiMap->insert
(LABELCOLORPAIR(label,pasym->GetEdge()->GetColor()));
}
if (plRule != NULL)
{
LineSymbolizationCollection* plsymcol =
plRule->GetSymbolizations();
// iterate through the linesymbolizations
int lsccount = ruleColl->GetCount();
for (int l=0; l < lsccount; l++)
{
LineSymbolization2D* plsym = plsymcol->GetAt(l);
pcolorMultiMap->insert
(LABELCOLORPAIR(label,plsym->GetStroke()->GetColor()));
}
}
} // for GetRules
} // for GetFeatureTypeStyles
// only add colorMultiMaps with values...
if (colorMultiMap->size() > 0)
m_colorMap->insert(INDEXCOLORMAPPAIR(i,colorMultiMap));
} // for m_collScaleRanges
} // if null
return this->m_colorMap;
}
PS to stay aligned with the code base I also rather copied code around
instead of doing method extraction.
......which IMHO would simplify the understanding and the maintenance of
the codebase
-------------- next part --------------
A non-text attachment was scrubbed...
Name: GetTileSequence.png
Type: image/png
Size: 35553 bytes
Desc: not available
Url : http://lists.osgeo.org/pipermail/mapguide-internals/attachments/20090318/f88d2ce8/GetTileSequence-0001.png
More information about the mapguide-internals
mailing list