[mapguide-users] RE: [Mapguide_users] FW: Remove layers at runtime
Buscher, Shane
Shane.Buscher at nngco.com
Mon Jan 15 14:41:46 EST 2007
Trevor,
I am not using tile layers, so we can rule that out.
I did some tracing with Fiddler, but don't see any GETDYNAMICMAPOVERLAY
requests generated when adding or removing layers. I do see a
GETMAPUPDATE request though, as indicated below. Hopefully I'm using
this tool correctly...
= BODY ====
OPERATION=GETMAPUPDATE
VERSION=1.0
SESSION=a00f84fc-ffff-ffff-8000-00c09f545772_en
MAPNAME=ValveTracker
SEQNO=4
DWFVERSION=6.01
EMAPVERSION=1.0
SETVIEWCENTERX=
SETVIEWCENTERY=
SETVIEWSCALE=
SETDATAEXTENT=
SETDISPLAYDPI=
SHOWLAYERS=
HIDELAYERS=
SHOWGROUPS=
HIDEGROUPS=
REFRESHLAYERS=
So here's the deal that I'm seeing. Since layers only get truly removed
when I'm outside their map extent, I'm forced to pan/zoom to check if
they get removed. I noticed that in addition to the GETMAPUPDATE
request, a SETDATAEXTENT request occurs when panning/zooming:
= BODY ====
OPERATION=GETMAPUPDATE
VERSION=1.0
SESSION=566b7e04-0000-1000-8002-00c09f545772_en
MAPNAME=ValveTracker
SEQNO=8
DWFVERSION=6.01
EMAPVERSION=1.0
SETVIEWCENTERX=-0.36343368150266142
SETVIEWCENTERY=10.30699821218915
SETVIEWSCALE=273.01327740352997
SETDATAEXTENT=-27.812650640092706,-5.6930033069966921,27.085783224455135
,26.306998693000587
SETDISPLAYDPI=
SHOWLAYERS=
HIDELAYERS=
SHOWGROUPS=
HIDEGROUPS=
REFRESHLAYERS=
I think the SETDATAEXTENT is doing something to make this work. Note
that I'm also noticing when I'm removing layers within my map extent,
then perform pan/zoom operations the layers I'm trying to remove
sometimes leave artifacts (layers are partially removed).
Let me know if I can help out any more. I'd really like to get this
working.
Regards,
Shane
________________________________
From: Trevor Wekel [mailto:trevor.wekel at autodesk.com]
Sent: Monday, January 15, 2007 12:12 PM
To: Buscher, Shane; Mapguide_users at lists.osgeo.org
Subject: RE: [Mapguide_users] FW: Remove layers at runtime
Hi Shane,
Hmm... I wonder if the viewer is not bothering to request the map
overlay image again? That would explain the behaviour you are seeing.
Are you using a Windows box as a client? Are you familiar with Fiddler?
Fiddler is an HTTP proxy that captures HTTP requests and responses. If
you install and use it, you should be able to see all the traffic
between the client and Web Extensions / MapAgent. There should be a
GETDYNAMICMAPOVERLAY request generated by the client. This request
should refresh the map and show the added/removed layers.
Also, are you using Base Map layers (ie. tiled images)? Base Map layers
should not be changed on the fly. They should be considered static.
This is probably not an issue since you are adding dynamic layers but I
just figured I would check.
Thanks,
Trevor
________________________________
From: Buscher, Shane [mailto:Shane.Buscher at nngco.com]
Sent: Monday, January 15, 2007 11:04 AM
To: Trevor Wekel; Mapguide_users at lists.osgeo.org
Subject: RE: [Mapguide_users] FW: Remove layers at runtime
Trevor,
I think I found a big hint after testing what you suggested. When the
layers I'm trying to remove are within the map view extent, they do not
'disappear' upon removing them. However, If the layers are completely
outside the map view extent they indeed get removed with the same code.
It doesn't matter if it's one layer or multiples. Hopefully this gives
you something to work with.
Regards,
Shane
________________________________
From: Trevor Wekel [mailto:trevor.wekel at autodesk.com]
Sent: Monday, January 15, 2007 11:18 AM
To: Buscher, Shane; Mapguide_users at lists.osgeo.org
Subject: RE: [Mapguide_users] FW: Remove layers at runtime
Hi Shane,
My bad. I've been working with the Mapguide 1.1.x and trunk branches.
You are working on the released 1.0.x branch. Sorry for the confusion.
1.0.x does not have the boolean return.
Is there any difference if you try to remove only one layer so there are
still layers on the map?
Thanks,
Trevor
________________________________
From: Buscher, Shane [mailto:Shane.Buscher at nngco.com]
Sent: Saturday, January 13, 2007 1:31 PM
To: Trevor Wekel; Mapguide_users at lists.osgeo.org
Subject: RE: [Mapguide_users] FW: Remove layers at runtime
Trevor,
MgLayerCollection.Remove doesn't return a boolean according to the api
documentation, and also doesn't indicate it in the intellisense.
Regards,
Shane
________________________________
From: Trevor Wekel [mailto:trevor.wekel at autodesk.com]
Sent: Fri 1/12/2007 5:18 PM
To: Buscher, Shane; Mapguide_users at lists.osgeo.org
Subject: RE: [Mapguide_users] FW: Remove layers at runtime
Hi Shane,
Remove() should returns a boolean true or false. false indicates that
the layer was not removed. Can you see if the remove was successful?
(just trying to debug a bit)
Thanks,
Trevor
________________________________
From: Buscher, Shane [mailto:Shane.Buscher at nngco.com]
Sent: Friday, January 12, 2007 4:13 PM
To: Trevor Wekel; Mapguide_users at lists.osgeo.org
Subject: RE: [Mapguide_users] FW: Remove layers at runtime
Trevor,
Thanks for the response. I think I'm doing everything you suggested
correctly, but have provided the snippets below. When the page loads
the ConnectToMapGuide() method gets called, which opens up the MgMap and
sets it to a module level variable (map). Then, Button1 is clicked
which successfully adds two layers to the map. When Button2 gets
invoked, I try to remove the layers but the layers still persist in the
map.
I'm not sure where to go from here. Do you need to copy the layers in
session, then add them from there in order to have the ability to remove
them? Just reaching...
Regards,
Shane
'class vars
Private resourceService As MgResourceService
Private map As MgMap
Private Sub ConnectToMapGuide()
'Connect to MapGuide site
Dim userInfo As New
MgUserInformation(Session.Item("mgSessionId"))
Dim siteConn As New MgSiteConnection
siteConn.Open(userInfo)
'set resource service
resourceService =
siteConn.CreateService(MgServiceType.ResourceService)
'Open map
map = New MgMap
map.Open(resourceService, Session.Item("mgMapName"))
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Button1.Click
'add dwf layer
Dim schematicId As NewMgResourceIdentifier _
("Library://VST/Layers/SouthOmahaTeamSchematic.LayerDefinition")
Dim schematic As MgLayer = CreateLayer(schematicId, False)
map.GetLayers.Insert(index, schematic)
'add sdf layer
Dim valveId As New MgResourceIdentifier _
("Library://VST/Layers/SouthOmahaValves.LayerDefinition")
Dim valves As MgLayer = CreateLayer(valveId, True)
map.GetLayers.Insert(index, valves)
map.Save(resourceService)
'emit javascript to refresh map
End Sub
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Button2.Click
Dim lyr0 As MgLayer = map.GetLayers.GetItem(0)
Dim lyr1 As MgLayer = map.GetLayers.GetItem(1)
map.GetLayers.Remove(lyr0)
map.GetLayers.Remove(lyr1)
map.Save(resourceService)
'emit javascript to refresh map
End Sub
________________________________
From: Trevor Wekel [mailto:trevor.wekel at autodesk.com]
Sent: Friday, January 12, 2007 3:37 PM
To: Buscher, Shane; Mapguide_users at lists.osgeo.org
Subject: RE: [Mapguide_users] FW: Remove layers at runtime
Hi Shane,
This should work. During your setup, are you calling MgMap.Open() or
MgMap.Create()? The MgMap.Open() should set up the resource identifier
correctly so that Save() will have the map to the correct session
repository.
Is the session id being propagated correctly? If you can do the
following and the layer appears in the viewer then the session should be
ok.
MgMap.Open()
MgMap.GetLayers().Insert(layer)
MgMap.Save()
If the Insert() works and Remove() doesn't
MgMap.Open()
MgMap.GetLayers().Remove(layer)
MgMap.Save()
Then this is probably a bug. Also, does the behaviour depend on the
number remaining layers?
Thanks,
Trevor
________________________________
From: Buscher, Shane [mailto:Shane.Buscher at nngco.com]
Sent: Friday, January 12, 2007 7:16 AM
To: Buscher, Shane; Mapguide_users at lists.osgeo.org
Subject: RE: [Mapguide_users] FW: Remove layers at runtime
I haven't got any feedback yet, but I have been trying desperately to
make this work. To recap, I'm finding that adding a layer to a map at
runtime with MgLayerCollection.Add works fine. However, when I try to
remove layer(s) with MgLayerCollection.Clear, MgLayerCollection.Remove,
or MgLayerCollection.RemoveAt the layer(s) are indeed removed from the
collection- but not the map. I am saving the map and refreshing the map
after removal.
So why does inserting a layer into the MgMapCollection work, but
removing not? Looking at the developers guide on page 56 there is a
note for getting a layer collection from the map (MgMap.GetLayers):
In the MapGuide API, getting a collection returns a reference to the
collection. So adding the layer to the layer collection immediately
updates the map.
I am get the impression that adding a layer to the collection
automatically updates the map, this doesn't apply for removing a layer.
I can't figure out what I need to do to mimic what the api does for you
when inserting a layer when trying to remove a layer. Or is this a bug?
Thanks for any help in advance.
Regards,
Shane
________________________________
From: mapguide_users-bounces at lists.osgeo.org
[mailto:mapguide_users-bounces at lists.osgeo.org] On Behalf Of Buscher,
Shane
Sent: Tuesday, January 09, 2007 4:49 PM
To: Mapguide_users at lists.osgeo.org
Subject: [Mapguide_users] FW: Remove layers at runtime
I've run into issues with removing all layers from the map at runtime.
See the code snippet below. All the layers get removed from the
layerCollection, but the layers still display. I've successfully used
the same code to insert layers, except I execute the
layerCollection.Insert(index, layer) method. I don't know why the same
code wouldn't work for clearing layers.
I have multiple layers stored in a library repository that users need to
add and remove at runtime. Do I need to copy each layer in indvidual
session repositories to add and reomove them? If I don't, will one user
adding/removing layers affect other user sessions? I know this is the
case when you edit data, but these layers are view only.
'Connect to site server, set resource service, and open map
ConnectToMapGuide()
'Clear all layers in the map
Dim layerCollection As MgLayerCollection = map.GetLayers()
If layerCollection.GetCount > 0 Then
layerCollection.Clear()
End If
map.Save(resourceService)
'emit javascript to refresh map
Dim scriptKey As String = "ForceRefresh"
If Not Page.ClientScript.IsStartupScriptRegistered(Me.GetType,
scriptKey) Then
Dim javaScript As String = "refreshMap(" & MapAction.RefreshMap & ");"
Page.ClientScript.RegisterStartupScript(Me.GetType, scriptKey,
javaScript, True)
End If
Regards,
Shane
Operations IT
Northern Natural Gas
402.398.7841
We think in generalities, but live in detail.
-Alred North Whitehead
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/mapguide-users/attachments/20070115/e15de1ad/attachment-0001.html
More information about the mapguide-users
mailing list