[mapguide-users] Changing existing dynamic layer's Filter onthe fly

Jonio, Dennis (Aviation) DJonio at miami-airport.com
Thu Nov 15 09:17:08 EST 2007


Maksim, 

 

This is what I am doing in codebehind and it works ... I have to clobber
the existing layers in this particular group and rebuild them. I have
this  "third" dimension thingee to deal with. For you I am sure it all
is very obvious.

 

Kenneth,

I am working in MGOS 1.1 ....

Where is this:

MgMap map = new MgMap();

map.Open("map", srv);

 

map.Layers("layername").Filter = "Column = 5";

map.Save();

 

???????????????????

 

 

 

   public void GenerateSpatialQueryFilteredLayer(MgMap map,
MgResourceService resourceService, string keys, Hashtable htFloors,
MgLayer fromLayer)

    {

        // Set the group

        MgLayerGroup mglg_root = this.CreateLayerGroup(map,
"_SpatialQueryResults", null);

        // Remove all the layers from the last query

        MgLayer layer = null;

        ArrayList layers_to_be_removed = new ArrayList();

        for (int i = 0; i < map.GetLayers().GetCount(); i++)

        {

            MgLayer nextLayer = (MgLayer)map.GetLayers().GetItem(i);

            MgLayerGroup actual_group = nextLayer.GetGroup();

            if (actual_group != null)

            {

                if (actual_group.Name == mglg_root.Name)

                    layers_to_be_removed.Add(nextLayer);

            }

        }

        for (int i = 0; i < layers_to_be_removed.Count; i++)

        {

            if (layers_to_be_removed[i] != null)

            {

                bool IsRemoved =
map.GetLayers().Remove((MgLayerBase)layers_to_be_removed[i]);

                // Lets try one more time if we failed .... no good
reason ... just try

                if (IsRemoved == false)

                {

                    IsRemoved =
map.GetLayers().Remove((MgLayerBase)layers_to_be_removed[i]);

                }

            }

        }        

        map.Save(resourceService);

        

        // Get the floors from the passed in hashtable so we can make up
a layer for each

        ArrayList al = new ArrayList();

        IDictionaryEnumerator ide = htFloors.GetEnumerator();

        while (ide.MoveNext())

        {

            DictionaryEntry de = (DictionaryEntry)ide.Current;

            al.Add((string)de.Key);

        }

        al.Sort(null);

        string[] Floors = (string[])al.ToArray(typeof(string));

 

        // Get the definition identifier from the passed in layer ...
just one time       

        MgResourceIdentifier toResId = new
MgResourceIdentifier(fromLayer.GetLayerDefinition().ToString());

        // Go get the layer definition

        string LibLayDef =
resourceService.GetResourceContent(toResId).ToString();

        XmlDocument doc = new XmlDocument();

        doc.PreserveWhitespace = true;

        doc.LoadXml(LibLayDef);

        XPathNavigator nav = doc.CreateNavigator();

        

        // for each floor name create a layer and set the filter for
each

        for (int _f = 0; _f < Floors.Length; _f++)

        {

            string LayerNameForSession = Floors[_f];

            nav.MoveToRoot();

            XPathNodeIterator nodeIter =
nav.Select("//VectorLayerDefinition/Filter");

            // There should be only one ....

            while (nodeIter.MoveNext())

            {

                nodeIter.Current.InnerXml = "(" + keys + ") AND (Floor
='" + Floors[_f] + "')";

            }

            // Setup to load the definition into the active map object

            MemoryStream xmlStream = new MemoryStream();

            doc.Save(xmlStream);

            byte[] layerDefinition = xmlStream.ToArray();

            //Encoding utf8 = Encoding.UTF8;

            String layerDefStr = new
String(Encoding.UTF8.GetChars(layerDefinition));

            layerDefinition = new byte[layerDefStr.Length - 1];

            int byteCount = Encoding.UTF8.GetBytes(layerDefStr, 1,
layerDefStr.Length - 1, layerDefinition, 0);

 

            MgByteSource byteSource = new MgByteSource(layerDefinition,
layerDefinition.Length);

            byteSource.SetMimeType(MgMimeType.Xml);

            MgByteReader mgByteReaderOut = byteSource.GetReader();

            MgResourceIdentifier mgResIdAcvLaySess = new
MgResourceIdentifier(

 
"Session:" +

 
map.SessionId +

                                                                "//" +

 
LayerNameForSession +

                                                                "." +

 
MgResourceType.LayerDefinition);

 

            // Set the map with the new resource

            resourceService.SetResource(mgResIdAcvLaySess,
mgByteReaderOut, null);

            // make sure that we do not duplicate 

            MgLayer layer_check = null;

            try

            {

                layer_check =
(MgLayer)map.GetLayers().GetItem(LayerNameForSession) as MgLayer;

                layer_check.ForceRefresh();

            }

            catch (Exception) { };

            if (layer_check == null)

            {

                layer = new MgLayer(mgResIdAcvLaySess, resourceService);

 

                layer.SetGroup(mglg_root);

                layer.SetName(LayerNameForSession);

                layer.SetLegendLabel(LayerNameForSession);

                layer.SetDisplayInLegend(true);

                layer.SetSelectable(true);

                layer.ForceRefresh();

                // Add it to the collection

                MgLayerCollection layers = map.GetLayers();

                layers.Insert(0, layer);

            }

        }

        map.Save(resourceService);

    }

 

 

-----Original Message-----
From: mapguide-users-bounces at lists.osgeo.org
[mailto:mapguide-users-bounces at lists.osgeo.org] On Behalf Of Kenneth,
GEOGRAF A/S
Sent: Thursday, November 15, 2007 8:28 AM
To: MapGuide Users Mail List
Subject: Re: [mapguide-users] Changing existing dynamic layer's Filter
onthe fly

 

When the MapDefinition is turned into a runtime Map, it copies 

properties from the layerdefinition.

This means that you will see no changes, even if you choose to modify 

the LayerDefinition.

 

You must modify the layer copy in the runtime map.

Fortunately, that is actually easier than what you are doing now:

 

MgMap map = new MgMap();

map.Open("map", srv);

 

map.Layers("layername").Filter = "Column = 5";

map.Save();

 

Regards, Kenneth, GEOGRAF A/S

 

 

 

Maksim Sestic skrev:

> I think I'm having problems with changing existing dynamic layer's
Filter

> property (the one that filters data from FeatureSource) using .NET.
Here's

> the approach that doesn't report any error, but when I refresh the map
there

> are no changes to the layer - new filter doesn't get applied.

>

> Dim layer As MgLayer = ...getting a MgLayer object...

> Dim document As New XmlDocument

> document.PreserveWhitespace = True

> Dim byteReader As MgByteReader =

> resources.Service.GetResourceContent(layer.LayerDefinition)

> document.LoadXml(byteReader.ToString)

>

> Allright, it's all in XmlDocument now and then I do some parsing to
change

> the Filter element. When I save the definition to XML file (just for

> testing) everything's OK, structure and data is preserved and Filter
element

> is set to some new value.

>

> ' Saving XmlDocument to memory stream

> Dim stream As MemoryStream = New System.IO.MemoryStream()

> document.Save(stream)

>

> ' Converting stream to byte array 

> Dim byteArray() As Byte = stream.ToArray

>

> ' Converting byte array to String (BOM included, otherwise SetResource

> raises an error while parsing XML)

> Dim outerXml As String =
System.Text.Encoding.UTF8.GetString(byteArray, 0,

> byteArray.Length - 1)

>

> ' Converting String to byte array with UTF-8 encoding 

> byteArray = System.Text.Encoding.UTF8.GetBytes(outerXml)

>

> ' Creating MgByteSource out of byte array, setting appropriate
MimeType

> Dim byteSource As MgByteSource = New MgByteSource(byteArray,

> byteArray.Length)

> byteSource.SetMimeType(MgMimeType.Xml)

>

> ' Getting MgResourceIdentifier corresponding to current SessionId and

> existing Layer name

> Dim resourceId As New

> MgResourceIdentifier(String.Format("Session:{0}//{1}.LayerDefinition",

> sessionId, layerName))

>

> ' Setting a resource (without Header) using MgResourceIdentifier and
byte

> source

> resources.Service.SetResource(resourceId, byteSource.GetReader,
Nothing)

>

> ' I don't know if this is necessary, but still...

> layer.ForceRefresh()

>

>

> Now, when I call parent.parent.Refresh() on the client side nothing
happens.

> What am I doing wrong here?

>

> Regards,

> Maksim Sestic

>

>

>

>

>  

>   

_______________________________________________

mapguide-users mailing list

mapguide-users at lists.osgeo.org

http://lists.osgeo.org/mailman/listinfo/mapguide-users

 

 

E-mails are automatically scanned for viruses using McAfee.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/mapguide-users/attachments/20071115/e379970f/attachment.html


More information about the mapguide-users mailing list