[mapguide-users] Nothing is working or what I'm doing wrong?

Kenneth Skovhede, GEOGRAF A/S ks at geograf.dk
Tue Oct 21 08:09:07 EDT 2008


The code you sent in this thread does not have a variable named 
repositoryName.

I think you are mixing some terms.

A typical application is made up of:
One or more FeatureSource's (data connections, raw geometry, no colors etc).
One or more LayerDefinition's that each connect to a single 
featuresource (sets up colors, etc).
One MapDefinition which is basically a collection of layers.
One WebLayout or Fusion Application that includes the map and some buttons.

All of these elements are actually Xml documents, and all are stored in 
a repository.
There are two types of repositories, a Library repo, which is permanent, 
and a Session repo, which is created and deleted for each user 
automatically.
The Library repo adresses all features by a "Library://" prefix, the 
Session repo adresses all features by a "Session:<sessionid>//" prefix.

Since Xml is verbose text data, it is highly inefficient to read, store 
and parse such documents all the time.
To remedy this, MapGuide relies on a Runtime Map, which is a binary 
representation of a MapDefinition and some data from its LayerDefinitions.
What makes it tricky to understand, is that this distinction is not 
really clear in the Developer Guide (my own opinion).

When you start the MapGuide viewer, it creates a session (and thus a 
Session repo), then converts the MapDefinition to a Runtime Map, and
saves it in the Session repo. The runtime map is then manipulated by the 
viewer, to turn layers on/off etc.

You can get the Runtime Map, by using the MgMap.Open(...). To get the 
Runtime map name, you must read the WebLayout (or Fusion Application),
then extract the resource Id for the MapDefinition. Since the 
MapDefinition is Xml, and the Runtime Map is binary, they can't share 
the same resource Id.

The viewer takes the MapDefinition resourceId and converts it into a 
shorter string, eg:
Library://Folder/mymap.MapDefinition
becomes
Folder/mymap

Everytime you do something where a "mapname" is expected, you must use 
the short form. Internally this is then expanded to:
Session:<sessionid>//Folder/mymap.Map

So the runtime map is strictly in the session repository.
When you want something done, you must consider if it should be done 
before the runtime map is created, or after. If you choose before, you 
must battle with the xml, if you choose after, you must use the MgMap 
object. When you manipulate either the MgMap or the Xml, nothing happens 
before you call MgMap.Save(...) or MgResourceService.SetResource().

If you are manipulating the Runtime Map, you perform an action on the 
server. The client is an AJAX viewer and runs on the client machine. To 
inform the client that something has happened, you must call 
"GetMapFrame().Refresh()" on the client. If this call fails, you can 
usually see the effects of the change when you pan or zoom, as that 
triggers the Refresh as well.

I think there are some problems with the Legend, specifically that 
legend labels are stripped from the Runtime Map, if the "show in legend" 
is not checked in the MapDefinition. I also seem to remember that 
modifing the label does not work correctly either.

To make things even more confusing, the Runtime Map references the 
LayerDefinition, and only copies a few attributes from the layer, but 
still needs the LayerDefinition for style information.

I hope that clears out some of the confusion for you.

So, as you might be able to see now, if you want to change the style of 
a feature, you must make a copy of the LayerDefinition (xml) save it in 
the Session repo, and then update the Runtime map to use the new Session 
repo based LayerDefinition, otherwise all users will get their layers 
updated. The same goes for the FeatureSource.

What can confuse more, is that IF you want a layer visible BEFORE the 
runtime map is generated, you must save a copy of the MapDefinition, and 
WebLayout in the Session repo, and then start the viewer with that, and 
it will create the Runtime map as usual, but now based on a modified 
MapDefinition.

Regards, Kenneth Skovhede, GEOGRAF A/S


Galois skrev:
> When I say empty I mean that when I am in debug mode, I see that
> repositoryName = ""
>
> I have read MapGuide Developers Guide, but I cannot say that everything is
> clear to me.
> For example, I don't know if I have to use featureSource in order to change
> something in the runTimeMap.
>
> Ok, if I don't have to "touch" the mapDefinition, then I'll have to store
> everything in a session repository. Is that wright?
>
> Do I have to make anything with the webLayout?
>
> Do you see any mistake in my code?
>
>
>
>
> Kenneth Skovhede, GEOGRAF A/S wrote:
>   
>> You are correct about the new MgMap(...) call. My mistake.
>> So it becomes:
>> MgMap map = new MgMap(siteConnection);
>> map.Open(mapname);
>> map.GetLayers().GetItem(0).SetLegend("Changed");
>> map.Save(resourceSrvc, mapname);
>>
>> Yes, I meant the Refresh() call.
>>
>> If nothing happens, either you are not calling the correct frame, or the 
>> map has not been saved.
>> Try to use FireFox and the FireBug plugin to see where the calls go.
>>
>> Regard, Kenneth Skovhede, GEOGRAF A/S
>>
>>
>>
>> Antonis Mihalas skrev:
>>     
>>> As far as I know, this is not possible, because
>>> MgMap map = new MgMap(resourceSrvc); it takes as argument a
>>> siteConnection...
>>>
>>>
>>> When you say refresh the client you mean just to write one line *.js?
>>> without importing anything?
>>>
>>> I'm asking, cause parent.parent.Refresh();
>>>               or
>>> parent.mapFrame.Refresh();
>>>
>>> doesn't do anything...
>>>         
>>>
>>> --- Στις *Δευτ., 20/10/08, ο/η Kenneth Skovhede, GEOGRAF A/S 
>>> /<ks at geograf.dk>/* έγραψε:
>>>
>>>     Από: Kenneth Skovhede, GEOGRAF A/S <ks at geograf.dk>
>>>     Θέμα: Re: [mapguide-users] Nothing is working or what I'm doing
>>> wrong?
>>>     Προς: "MapGuide Users Mail List" <mapguide-users at lists.osgeo.org>
>>>     Ημερομηνία: Δευτέρα, 20 Οκτώβριος 2008, 16:53
>>>
>>>     The viewer overwrites the runtime map on startup, so if you run this 
>>>     before starting the viewer, your changes will be lost.
>>>     You should not create a new runtime map, but open the one the viewer 
>>>     creates for you, modify it, save it, and refresh the client.
>>>     I belive the correct sequence would be:
>>>     MgMap map = new MgMap(resourceSrvc);
>>>     map.Open(mapName):
>>>
>>>     The viewer takes a string like:
>>>     "Library://Folder/MapName.MapDefinition"
>>>     and uses the map name:
>>>     "Folder/MapName"
>>>
>>>     You must use the same name in your code, or you won't get to the
>>> runtime 
>>>     map.
>>>
>>>     If you want the layer to show when the map loads, have a look at
>>> this:
>>>    
>>> http://trac.osgeo.org/mapguide/wiki/maestro/MaestroAPI/samples/AddInitialLayer
>>>
>>>     You can perform the same actions without the MaestroAPI if you like,
>>> but 
>>>     you have to deal with the xml in raw form.
>>>
>>>     Regards, Kenneth Skovhede, GEOGRAF
>>>      A/S
>>>
>>>
>>>
>>>     Galois skrev:
>>>     > Whatever I try to do it's just not working.
>>>     >
>>>     > Add a new layer?
>>>     > The layer is added but never shown
>>>     >
>>>     > Add a point? Nothing
>>>     >
>>>     > Add a new group?
>>>     > The Group is added but never shown
>>>     >
>>>     > So, I simple tried to change the LegendLabel of an existing layer.
>>>     > Nothing happened again...
>>>     >
>>>     > If anyone can tell me what I am doing wrong I would appreciate it.
>>>     >
>>>     > Code follows:
>>>     >
>>>     >
>>>     > using System;
>>>     > using System.Data;
>>>     > using System.Configuration;
>>>     > using System.Web;
>>>     > using System.Web.Security;
>>>     > using System.Web.UI;
>>>     > using System.Web.UI.WebControls;
>>>     > using System.Web.UI.WebControls.WebParts;
>>>     > using System.Web.UI.HtmlControls;
>>>     > using OSGeo.MapGuide;
>>>     > using System.Xml;
>>>     > using System.IO;
>>>     > using System.Text;
>>>     >
>>>     > public partial
>>>      class _Default : System.Web.UI.Page
>>>     > {
>>>     >     public string sessionId;
>>>     >     public string webLayout;
>>>     >     public MgLayer tmpLayer;
>>>     >     protected System.Web.UI.HtmlControls.HtmlGenericControl Frame1;
>>>     >
>>>     >     protected void Page_Load(object sender, EventArgs e)
>>>     >     {
>>>     >         string physicalPath = @"C:\Program
>>>     >
>>>     Files\MapGuideOpenSource\WebServerExtensions\www\webconfig.ini";
>>>     >
>>>     >         try
>>>     >         {
>>>     >             MapGuideApi.MgInitializeWebTier(physicalPath);
>>>     >
>>>     >
>>>     >             passAndSession();
>>>     >
>>>     >
>>>     >             //Associate a session ID with the MgSiteConnection
>>> Object
>>>     >             MgUserInformation userInfo_new = new
>>>     > MgUserInformation(sessionId);
>>>     >
>>>     >             MgSiteConnection siteConnection = new
>>> MgSiteConnection();
>>>     >
>>>     >            
>>>      siteConnection.Open(userInfo_new);
>>>     >
>>>     >
>>>     >
>>>     >             // Get an instance of the required service(s)
>>>     >             MgResourceService resourceSrvc =
>>>     >
>>>    
>>> (MgResourceService)siteConnection.CreateService(MgServiceType.ResourceService);
>>>     >             MgFeatureService featureSrvc =
>>>     >
>>>    
>>> (MgFeatureService)siteConnection.CreateService(MgServiceType.FeatureService);
>>>     >
>>>     >
>>>     >
>>>     >             MgMap map = new MgMap(siteConnection);
>>>     >
>>>     >
>>>     >             webLayout =
>>>     >
>>>    
>>> "Library://GoSpatial/Web+Layouts/Autostrada+Brescia+Padova+Map.WebLayout";
>>>     >
>>>     >             MgResourceIdentifier resId = new
>>>     > MgResourceIdentifier("Library://GoSpatial/Maps/Italy
>>>     Map.MapDefinition");
>>>     >
>>>     >             String mapName = resId.GetName();
>>>     >
>>>     >             MgResourceIdentifier mapStateId = new
>>>     > MgResourceIdentifier("Session:" + sessionId + "//"
>>>      +
>>>     mapName + "." +
>>>     > MgResourceType.Map);
>>>     >
>>>     >
>>>     >
>>>     >             createSaveOpen(map, resourceSrvc, resId, mapName,
>>> mapStateId);
>>>     >
>>>     >
>>>     >             MgLayerBase firstLayer = map.GetLayers().GetItem(0);
>>>     >             firstLayer.SetLegendLabel("CHANGE");
>>>     >             
>>>     >
>>>     >             map.Save(resourceSrvc, mapStateId);
>>>     >         }
>>>     >         catch (Exception ex)
>>>     >         {
>>>     >             throw (ex);
>>>     >         }
>>>     >     }
>>>     >
>>>     >
>>>     > Thx in advanced!
>>>     >
>>>     > PS I have never but never in my life try to do something and in 2
>>> weeks
>>>     not
>>>     > shown even a small improvement...
>>>     >   
>>>     _______________________________________________
>>>     mapguide-users mailing
>>>      list
>>>     mapguide-users at lists.osgeo.org
>>>     http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>>               
>>>
>>>
>>> __________________________________________________
>>> Χρησιμοποιείτε Yahoo!;
>>> Βαρεθήκατε τα ενοχλητικά μηνύματα (spam); Το Yahoo! Mail διαθέτει την 
>>> καλύτερη δυνατή προστασία κατά των ενοχλητικών μηνυμάτων
>>> http://mail.yahoo.gr
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> 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
>>
>>
>>     
>
>   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/mapguide-users/attachments/20081021/d5677846/attachment.html


More information about the mapguide-users mailing list