ThinkGeo.com    |     Documentation    |     Premium Support

Create vs Edit Shape

I wanted to know if there is a way to make the difference between newly created shapes and shapes already created that are edited.Another question related is : If i have many shapes on my  editoverlay, how can I know which one has been modify.


The only way to have information about creation and edtiing shape is OnTrackShapeFinished. But there is no information in EventArgs or EditOverlay.


It's quite a simple feature but i search over the forum and the samples and didn't manage information about that.


Thanks you in advance


 



Alexandre,



Currently, web edition doesn't support different color for different shapes in edit overlay. All the shapes drawn on the edit overlay has the same appearance. Sorry for the inconvenience. But this is a good feature although. 



On the other hand, uses may don't like post back whenever a shape is tracked or edited completely. So we have some client API to implement some extra requirement. This is also a workaround solution for you. This solution is based on our installed sample “Samples/MapShapes/DrawEditShapes.aspx”.

1.    Add a client event to map on the server side. Here is the code:
Map1.OnClientDrawEnd = "Map1ClientDrawEnd";
Map1.OnClientEditEnd = "Map1ClientEditEnd";

2.    Implement these two event on client side:

var index = 0;
var editedFeatureIds = new Array();
var Map1ClientEditEnd = function(feature){
            editedFeatureIds.push(feature.fid);
}
    
var Map1ClientDrawEnd = function(feature){
            feature.fid = 'Shape' + (index++).toString();
}

3.    Draw some shapes on the map.

4.    Submit to save these shapes in an InMemoryFeatureLayer.

5.    Click edit button to switch into edit mode.

6.    Set a break point in the Map1ClientEditEnd method to debug the feature id.

7.    Edit one shape, and click outside the shape after editing; the code stops at the break point which you'll see the feature information you modified.



I think you know how to do the rest of the work. It seems complicate but actually it's easy and don't have too much code to write.



Please have a try and let me know how it works.



Thanks,

Howard

 



Thank for your answer ! 



Where can I find the complete client API ? I ask that question because I found that link gis.thinkgeo.com/Support/Dis...fault.aspx() on the forum and the two events you talk about are not in the list. 



I didn't try your solution yet because I managed to do a personnal system but I have a problem. I create some shapes, giving them informations in their ColumnValue. When I want to edit one of these shape later, the columnvalues are gone (in my OnTrackShapeFinished event handler).All those actions are done on server side (no client side there). 

 



Alexandre,



Actually, these two events are declared on the server side which you can find the first paragraph of code. Then implement the handler on the client which you can modify to any name you want. The client function listed in the address you mentioned is all the public functions we have which we wrapped some of OpenLayers API for easily using and raise events. So we didn't list the OpenLayers API and there samples. Since we have code community, we can add more examples to show how to use JavaScript API.



The problem in your application is that when you add shapes into the edit overlay, you also need to add the same feature columns on the edit overlay. For example the feature has two feature columns “Id”, “Name”, the edit overlay must have these two columns; otherwise the column values will be gone.



Here is the code how to add feature columns on the edit overlay. Please have a try.

Map1.EditOverlay.Columns.Add(new FeatureSourceColumn("Id"));
Map1.EditOverlay.Columns.Add(new FeatureSourceColumn("Name"));



Any questions please let me know.



Thanks,

Howard

 



Howard, could you please explain then how to add these featureSourceColumns we added to the EditOverlay to a feature we just drawned on the editOverlay ? I thought it would have those columns by defaults but it does not ? 
 Thanks for your help.

Hi Gautier,


You can use the following code to add column values to the feature you just drawn on the editOverlay.


var Map1ClientDrawEnd = function (feature) {
    var i = feature;
    feature.fieldValues = [{Key: 'Id', Value: 'MyId' }, {Key:'Name',Value:'MyName'}];
}



Please let me know if you have further questions.


Regards,


Ivan



Thank you Ivan, in fact on server side I used the following code to copy the editoverlay columns into the feature, it seems to work but I don't know if this is really "clean" ? 



 protected void Map1_TrackShapeFinished(object sender, EventArgs e)

{

      Feature F = new Feature();

      Map1.EditOverlay.FeatureSource.Open();

      if (Map1.EditOverlay.FeatureSource.InternalFeatures.Count > 0)

      {

            F = Map1.EditOverlay.FeatureSource.InternalFeatures[Map1.EditOverlay.FeatureSource.InternalFeatures.Count - 1];

            foreach (FeatureSourceColumn FSC in Map1.EditOverlay.Columns)

            {

                  if (!F.ColumnValues.ContainsKey(FSC.ColumnName))

                  {

                        F.ColumnValues.Add(FSC.ColumnName, "");

                  }

            }

      }

      Map1.EditOverlay.FeatureSource.Close();







Thank you again for your great assistance.



Hi Gautier, 
  
 You’re welcome. It’s up to you to add column values on client or server side. In addition, you can use Map1.EditOverlay.Features instead of Map1.EditOverlay.FeatureSource.InternalFeatures so you don’t need to open the FeatureSource. 
  
 Regards, 
  
 Ivan

OK thank you for this tip to improve my code, so my new code is: 
  
 
// Copy the colums of the editoverlay on features drawn on it
protected void Map1_TrackShapeFinished(object sender, EventArgs e)
{
            Feature F = new Feature();
            if (Map1.EditOverlay.TrackMode != TrackMode.Edit)
            {
                if (Map1.EditOverlay.Features.Count > 0)
                {
                    F = Map1.EditOverlay.Features[Map1.EditOverlay.Features.Count - 1];

                    foreach (FeatureSourceColumn FSC in Map1.EditOverlay.Columns)
                    {
                        if (!F.ColumnValues.ContainsKey(FSC.ColumnName))
                        {
                            F.ColumnValues.Add(FSC.ColumnName, "");
                        }
                    }
                }
            }
}


Gautier, 
  
 You’re welcome. Have a good day. 
  
 Regards, 
  
 Ivan

In fact it looks like for my loop: 
  
 foreach (FeatureSourceColumn FSC in Map1.EditOverlay.Columns) 
  
 the featuresource needs to be opened ?

Gautier, 
  
 Yes, we need to open the FeatureSource before we use Map1.EditOverlay.Columns, but you can customize your application to avoid opening FeatureSource frequently (for example, store the column keys). 
  
 Regards, 
  
 Ivan

 OK thanks now I think I got it:


protected void Map1_TrackShapeFinished(object sender, EventArgs e)
{
Dictionary<string, string> DefaultAttributes = (Dictionary<string, string>)Session["DefaultAttributes"];
foreach (KeyValuePair<string, string> KVP in DefaultAttributes)
{
if (!F.ColumnValues.ContainsKey(KVP.Key))
{
F.ColumnValues.Add(KVP.Key, KVP.Value);
}
}
}



Gautier, 
  
 Thank you for your sharing. Any questions please let us know. 
  
 Regards, 
  
 Ivan