[mapguide-users] Thematic Mapping

Chris Claydon chris.claydon at autodesk.com
Mon Feb 2 10:50:04 EST 2009


Hi Padmini,

The InterpolateColor() function in your code below has a method signature like this:

private String InterpolateColor(double portion, String startColor, String endColor, int percentTransparent)

You should set the startColor string to be the first color you want to use in your range of colors, and the endColor string to be the last color. Then, depending on the value of the "portion" parameter that you pass in, the resulting color will fall somewhere in the range you've specified.

In the code you've included below, you have two calls to InterpolateColor(). One of them controls the fill color of your polygons and the other controls the edge color. The problem is that in each call, you've still specified that the startColor is the same as the endColor. For example:

InterpolateColor(portion, "C2C3C4", "C2C3C4", 0) will only ever return you the color that corresponds to "C2C3C4". If you change one of the strings, you should see some color variation. E.g.

InterpolateColor(portion, "00FF00", "FF0000", 0)

Try that and see what happens.

It seems to me that you do not yet have a very strong understanding of how the code below actually functions. I would urge you to spend some time looking at it to try to figure it out. I appreciate that some of it is quite complex, and you should feel free to ask questions on the newsgroup to help you. I can't claim to speak for anyone else on this group, but personally I would rather help others to learn to understand the framework, and write their own code, than simply to provide pre-written solutions to their problems.

Chris.

-----Original Message-----
From: mapguide-users-bounces at lists.osgeo.org [mailto:mapguide-users-bounces at lists.osgeo.org] On Behalf Of padmini godavarthi
Sent: Sunday, February 01, 2009 9:22 PM
To: mapguide-users at lists.osgeo.org
Subject: Re: [mapguide-users] Thematic Mapping


Hi z,
Thanku very much for ur suggestions.i will respect it.
but i understood the answer given by Chris.
But i think its not correct solution for my original query.
i want to display different colors to the different polygons.
but while applying 2 colors in the InterpolateColor function it doesn't
change in different colors



 while (dataReader.ReadNext())
            {
                value = GetFeaturePropertyValue(dataReader, "FeatId");

                filterText = """ + "FeatId" + "" = ";

                    filterText = filterText + value;

                areaRuleXML = String.Format(areaRuleTemplate,
                                          "FeatId" + ":" + value,
                                            filterText,
InterpolateColor(portion, "C2C3C4", "C2C3C4", 0), InterpolateColor(portion,
"000000", "000000", 0));
                areaDoc = new XmlDocument();
                areaDoc.LoadXml(areaRuleXML);
                areaDoc.Save("C:\\theme.xml");
                areaNode = doc.ImportNode(areaDoc.DocumentElement, true);
                areaTypeStyle.AppendChild(areaNode);


             portion = portion + increment;
            }


it displays some yash color to all the polygons,but i want different color
to the different polygons
Can u plz help me

Thanks and Regards,
Padmini G.



zspitzer wrote:
>
> when someone takes times to provide a response, it's respectful to taking
> a bit more time to read your original email AGAIN !
>
> your calling
>
> InterpolateColor(portion, "C2C3C4", "C2C3C4", 0),
> InterpolateColor(portion,"C2C3C4", "C2C3C4", 0));
>
> which takes two colors to create a range, yet you pass in the same
> color twice....
>
> sorry if I sound a bit grumpy, but it appears that Chris spent more
> time reading
> your email that you did after his reply....
>
> z
>
>
>
> On Sat, Jan 31, 2009 at 7:57 PM, padmini godavarthi
> <godavarthi.padmini at gmail.com> wrote:
>>
>> Hi,
>> Thanks for ur reply.but i didn't get u
>> can u plz tell me briefly so that it will be helpful to me.
>>
>>
>> Thanks and Regards,
>> Padmini.
>>
>>
>> Chris Claydon wrote:
>>>
>>> I would recommend modifying your call to InterpolateColor() so that the
>>> start color and end color correspond to the colors you want. They are
>>> currently both set to the same string.
>>>
>>> -----Original Message-----
>>> From: mapguide-users-bounces at lists.osgeo.org
>>> [mailto:mapguide-users-bounces at lists.osgeo.org] On Behalf Of padmini
>>> godavarthi
>>> Sent: Friday, January 30, 2009 3:59 AM
>>> To: mapguide-users at lists.osgeo.org
>>> Subject: [mapguide-users] Thematic Mapping
>>>
>>>
>>>
>>>
>>> Hi,
>>> iam using mpguide opensource 2.0 (.net 2.0 +IIS 5.1).
>>> I want to do thematic mapping for polygon layer(for example parcel
>>> layer)
>>> i tried to use the code in dotnetviewer sample.its working fine
>>>
>>> iam able to create a thematic layer with same color to the all polygons.
>>> Now my problem is that i want to apply different colours to the
>>> different
>>> polygons
>>>
>>> for example for parcel_id =1   ------------ green colour
>>> for example for parcel_id =2   ------------ Red colour and
>>> soon.........................
>>>
>>> for this can u plz tell me the code for how to do it?
>>>
>>>
>>> my code was as follows
>>> ------------------------------------------------------------------------------------------------------
>>>
>>>
>>> NameValueCollection serverVars = Request.ServerVariables;
>>>         String strServerVars = "";
>>>         foreach (String str in serverVars.AllKeys)
>>>         {
>>>
>>>             strServerVars += "<br>" + str;
>>>
>>>         }
>>>         String platform = serverVars["SERVER_SOFTWARE"];
>>>         String queryStr = serverVars["QUERY_STRING"];
>>>         string queryStr1 = serverVars["Form"];
>>>         NameValueCollection requestParams = Request.HttpMethod == "POST"
>>> ?
>>> Request.Form : Request.QueryString;
>>>         String sessionId = Request.QueryString["SESSION"];
>>>         string realPath = Request.ServerVariables["APPL_PHYSICAL_PATH"];
>>>         String configPath = realPath + "webconfig.ini";
>>>         MapGuideApi.MgInitializeWebTier(configPath);
>>>         MgUserInformation userInfo = new MgUserInformation(sessionId);
>>>         MgSiteConnection siteConnection = new MgSiteConnection();
>>>         siteConnection.Open(userInfo);
>>>         MgResourceService resourceService =
>>> (MgResourceService)siteConnection.CreateService(MgServiceType.ResourceService);
>>>         MgFeatureService featureService =
>>> (MgFeatureService)siteConnection.CreateService(MgServiceType.FeatureService);
>>>
>>>         MgMap map = new MgMap();
>>>         map.Open(resourceService, "mapdata");
>>>         MgLayerCollection layers = map.GetLayers();
>>>         MgLayer layer = (MgLayer)layers.GetItem("property layer");
>>>
>>>         MgResourceIdentifier resId = new
>>> MgResourceIdentifier(layer.GetFeatureSourceId());
>>>         MgResourceIdentifier layerDefResId = layer.GetLayerDefinition();
>>>         MgByteReader byteReader =
>>> resourceService.GetResourceContent(layerDefResId);
>>>
>>>         // Load the Layer Definition and Navigate to the specified
>>> <VectorScaleRange>
>>>
>>>         XmlDocument doc = new XmlDocument();
>>>         String xmlLayerDef = byteReader.ToString();
>>>         doc.LoadXml(xmlLayerDef);
>>>           XmlNodeList nodeList =
>>> doc.GetElementsByTagName("VectorScaleRange");
>>>
>>>     XmlElement vectorScaleRangecElement = (XmlElement)nodeList.Item(0);
>>>         XmlElement areaTypeStyle =
>>> (XmlElement)vectorScaleRangecElement.GetElementsByTagName("AreaTypeStyle").Item(0);
>>>
>>>         // Remove any existing <AreaRule> elements.
>>>
>>>         XmlNodeList areaRuleList =
>>> areaTypeStyle.GetElementsByTagName("AreaRule");
>>>         int count = areaRuleList.Count;
>>>         for (int i = 0; i < count; i++)
>>>         {
>>>             //The areaRuleList shrinks as we remove items, so always
>>>             //remove the first item (don't use the index i)
>>>             areaTypeStyle.RemoveChild(areaRuleList.Item(0));
>>>         }
>>>
>>>         // Now create the new <AreaRule> elements.
>>>
>>>         String areaRuleTemplate =
>>> File.ReadAllText(GetThemeXmlTemplatePath());
>>>         MgFeatureAggregateOptions aggregateOptions = new
>>> MgFeatureAggregateOptions();
>>>
>>>         String value = null;
>>>         String filterText = null;
>>>         String areaRuleXML = null;
>>>         XmlDocument areaDoc = null;
>>>         XmlNode areaNode = null;
>>>         double portion = 0.0;
>>>
>>>             aggregateOptions.AddFeatureProperty("FeatId");
>>>             aggregateOptions.SelectDistinct(true);
>>>                     aggregateOptions.SetFilter(totquery);
>>>                   double increment = (5 > 1) ? 1.0 / (5 - 1) : 1.0;
>>>             MgDataReader dataReader =
>>> featureService.SelectAggregate(resId,
>>> layer.GetFeatureClassName(), aggregateOptions);
>>>             while (dataReader.ReadNext())
>>>             {
>>>                 value = GetFeaturePropertyValue(dataReader, "FeatId");
>>>
>>>                 filterText = "&quot;" + "FeatId" + "&quot; = ";
>>>
>>>                     filterText = filterText + value;
>>>
>>>                 areaRuleXML = String.Format(areaRuleTemplate,
>>>                                           "FeatId" + ":" + value,
>>>                                             filterText,
>>> InterpolateColor(portion, "C2C3C4", "C2C3C4", 0),
>>> InterpolateColor(portion,
>>> "C2C3C4", "C2C3C4", 0));
>>>                 areaDoc = new XmlDocument();
>>>                 areaDoc.LoadXml(areaRuleXML);
>>>                 areaDoc.Save("C:\\theme.xml");
>>>                 areaNode = doc.ImportNode(areaDoc.DocumentElement,
>>> true);
>>>                 areaTypeStyle.AppendChild(areaNode);
>>>
>>>
>>>              portion = portion + increment;
>>>             }
>>>             dataReader.Close();
>>>
>>>
>>>         // Now save our new layer definition to the session and add it
>>> to
>>> the map.
>>>
>>>         String xmlString = doc.DocumentElement.OuterXml;
>>>         String uniqueName = this.MakeUniqueLayerName(map, "property
>>> layer",
>>> "sample");
>>>         String legendLabel = layer.GetLegendLabel();
>>>         if ("sample".Length > 0)
>>>             legendLabel = legendLabel + " (" + "sample" + ")";
>>>
>>>         MgResourceIdentifier layerResId = new
>>> MgResourceIdentifier("Session:" + sessionId + "//" + uniqueName +
>>> ".LayerDefinition");
>>>         resourceService.SetResource(layerResId, new
>>> MgByteReader(xmlString,
>>> "text/xml") , null);
>>>
>>>         MgLayer newLayer = new MgLayer(layerResId, resourceService);
>>>         newLayer.SetName(uniqueName);
>>>         newLayer.SetLegendLabel(legendLabel);
>>>         newLayer.SetDisplayInLegend(layer.GetDisplayInLegend());
>>>         newLayer.SetVisible(true);
>>>         newLayer.SetSelectable(layer.GetSelectable());
>>>         layers.Insert(layers.IndexOf(layer), newLayer);
>>>
>>>         map.Save(resourceService);
>>>
>>>         return uniqueName;
>>>     }
>>> ---------------------------------------------
>>>  private String InterpolateColor(double portion, String startColor,
>>> String
>>> endColor, int percentTransparent)
>>>     {
>>>         int alpha = (int)(255 * (100.0 - percentTransparent) / 100.0);
>>>         String result = "";
>>>         if (startColor.Equals(endColor))
>>>         {
>>>             result = String.Format("{0:X2}{1}", alpha, startColor);
>>>         }
>>>         else
>>>         {
>>>             int red = CalculateRGB(portion, startColor.Substring(0, 2),
>>> endColor.Substring(0, 2));
>>>             int green = CalculateRGB(portion, startColor.Substring(2,
>>> 2),
>>> endColor.Substring(2, 2));
>>>             int blue = CalculateRGB(portion, startColor.Substring(4, 2),
>>> endColor.Substring(4, 2));
>>>             result = String.Format("{0:X2}{1:X2}{2:X2}{3:X2}", alpha,
>>> red,
>>> green, blue);
>>>         }
>>>         return result;
>>>     }
>>>
>>>     private String MakeUniqueLayerName(MgMap map, String layerName,
>>> String
>>> themeName)
>>>     {
>>>         String desiredName = "_" + layerName + themeName;
>>>         String uniqueName = desiredName;
>>>         int index = 1;
>>>
>>>         while (map.GetLayers().Contains(uniqueName))
>>>         {
>>>             uniqueName = desiredName + index.ToString();
>>>             index++;
>>>         }
>>>         return uniqueName;
>>>     }
>>>     private int CalculateRGB(double portion, String startRGB, String
>>> endRGB)
>>>     {
>>>         double result = Int32.Parse(startRGB, NumberStyles.HexNumber) +
>>> portion * (Int32.Parse(endRGB, NumberStyles.HexNumber) -
>>> Int32.Parse(startRGB, NumberStyles.HexNumber));
>>>         return (int)result;
>>>     }
>>>     String GetThemeXmlTemplatePath()
>>>     {
>>>         String xmlTemplatePath ="D:\\arearuletemplate.xml";
>>>         return xmlTemplatePath;
>>>     }
>>> ---------------------------------------
>>> can u plz tell me the solution?
>>>
>>> Regards,
>>> Padmini.
>>>
>>>
>>>
>>>
>>>
>>> --
>>> View this message in context:
>>> http://n2.nabble.com/Thematic-Mapping-tp2244230p2244230.html
>>> Sent from the MapGuide Users mailing list archive at Nabble.com.
>>>
>>> _______________________________________________
>>> mapguide-users mailing list
>>> mapguide-users at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>> _______________________________________________
>>> mapguide-users mailing list
>>> mapguide-users at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>>
>>>
>>
>> --
>> View this message in context:
>> http://n2.nabble.com/Thematic-Mapping-tp2244230p2249312.html
>> Sent from the MapGuide Users mailing list archive at Nabble.com.
>>
>> _______________________________________________
>> mapguide-users mailing list
>> mapguide-users at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>
>
>
>
> --
> Zac Spitzer -
> http://zacster.blogspot.com
> +61 405 847 168
> _______________________________________________
> mapguide-users mailing list
> mapguide-users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>
>

--
View this message in context: http://n2.nabble.com/Thematic-Mapping-tp2244230p2256479.html
Sent from the MapGuide Users mailing list archive at Nabble.com.

_______________________________________________
mapguide-users mailing list
mapguide-users at lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/mapguide-users


More information about the mapguide-users mailing list