Dynamic Layer exception when loading too many objects

4 posts, 1 answers
  1. Pedro
    Pedro avatar
    25 posts
    Member since:
    Aug 2010

    Posted 15 Oct 2010 Link to this post

    Hi,

    I am using Map control with dynamic layer and its working with fee objects, but when I try to load for instance 186 objects it throws ArgumentException with the error: "Value does not fall within the expected range.".
    I dont know what it means.
    My itemsRequest method is like this:

    public void ItemsRequest(double minZoom, double maxZoom, Location upperLeft, Location lowerRight, Action<System.Collections.ICollection> callback)
            {
                LocationRect locationRect = new LocationRect(upperLeft, lowerRight);
                List<object> objects = new List<object>();  
                if (minZoom <= 3)
                {
                    page.listTrackLayer.ForEach((trackLayer) =>
                        {
                            LocationRect rect = trackLayer.MapPolyline.GeographicalBounds;
                            if (rect.Intersect(locationRect))
                            {
                                objects.Add(trackLayer.MapPolyline);
                                trackLayer.PinPoints.ForEach((point) =>
                                {
                                     
                                    objects.Add(point);
     
                                });
                            }
                        });
     
                }
                if (minZoom >= 9)
                {
                    page.listTrackLayer.ForEach((trackLayer) =>
                    {
                        LocationRect rect = trackLayer.MapPolyline.GeographicalBounds;
                        if (rect.Intersect(locationRect))
                        {
                            objects.Add(trackLayer.MapPolyline);
                            trackLayer.PinPoints.ForEach((point) =>
                                {
                                    objects.Add(point);
     
                                });
                        }
                    });
                }
                 
                callback(objects);
            }

    It throws this exception when I call the callback(objects).

    Best regards,
    Gonçalo
  2. Andrey
    Admin
    Andrey avatar
    1681 posts

    Posted 20 Oct 2010 Link to this post

    Hello Gonçalo,

    The exception could be thrown when you add some polyline to the dynamic layer twice, because a polyline can intersect more than one requested area. So, you should check that the polyline is not added to the dynamic layer earlier.

    The sample code is below.
    public void ItemsRequest(double minZoom, double maxZoom, Location upperLeft, Location lowerRight, Action<System.Collections.ICollection> callback)
    {
        LocationRect locationRect = new LocationRect(upperLeft, lowerRight);
        List<object> objects = new List<object>();
        if (minZoom <= 3)
        {
            page.listTrackLayer.ForEach((trackLayer) =>
            {
                if (!page.dynamicLayer.Items.Contains(trackLayer.MapPolyline))
                {
                    LocationRect rect = trackLayer.MapPolyline.GeographicalBounds;
                    if (rect.Intersect(locationRect))
                    {
                        objects.Add(trackLayer.MapPolyline);
                        trackLayer.PinPoints.ForEach((point) =>
                        {
                            objects.Add(point);
                        });
                    }
                }
            });
        }
        if (minZoom >= 9)
        {
            page.listTrackLayer.ForEach((trackLayer) =>
            {
                if (!page.dynamicLayer.Items.Contains(trackLayer.MapPolyline))
                {
                    LocationRect rect = trackLayer.MapPolyline.GeographicalBounds;
                    if (rect.Intersect(locationRect))
                    {
                        objects.Add(trackLayer.MapPolyline);
                        trackLayer.PinPoints.ForEach((point) =>
                        {
                            objects.Add(point);
                        });
                    }
                }
            });
        }
        callback(objects);
    }

    Regards,
    Andrey Murzov
    the Telerik team
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  3. DevCraft banner
  4. Pedro
    Pedro avatar
    25 posts
    Member since:
    Aug 2010

    Posted 20 Oct 2010 Link to this post

    Thanks for the answer. The problem is that actually I am doing that.

    public void ItemsRequest(double minZoom, double maxZoom, Location upperLeft, Location lowerRight, Action<System.Collections.ICollection> callback)
            {
                OldLocation = new Location();
                Location TextOldLocation = new Location();            
                lock (page.listTrackLayer)
                {
                    LocationRect locationRect = new LocationRect(upperLeft, lowerRight);
                    List<object> objects = new List<object>();
                      
                        page.listTrackLayer.ForEach((trackLayer) =>
                            {
                                LocationRect rect = trackLayer.MapPolyline.GeographicalBounds;
                                if (rect.Intersect(locationRect))
                                {
                                    if (!page.DynamicLayer.Items.Contains(trackLayer.MapPolyline))
                                        objects.Add(trackLayer.MapPolyline);                                
                                      
                                    trackLayer.PinPoints.ForEach((point) =>
                                    {
                                        Location location = MapLayer.GetLocation(point);
                                        if (locationRect.Contains(location))
                                        {                                   
                                            if (CheckMinimumDistance(location, OldLocation, 15))
                                            {
                                                if (!page.DynamicLayer.Items.Contains(point))
                                                    objects.Add(point);
      
                                                OldLocation = location;
                                            }                                        
      
                                            if (CheckMinimumDistance(location, TextOldLocation, 75))
                                            {
                                                point.Text = trackLayer.PinPointSubtitle[point];
                                                TextOldLocation = location;
                                            }
                                            else
                                                point.Text = string.Empty;
                                        }
                                    });                                
                                }
                            });
      
                    callback(objects);
                }
            }

    But it is working good till I delete the track line, and try to add it again. the second time it throws the exception. When I debug into the code I saw that the DynamicLayer doesn't have items (count = 0) and than it throws the exception in callback function.

    I made a simple aplication that can simulate the problem.
    for that you do the next steps:
    Click buttons:
    1 - create
    2- Refresh
    3-Delete
    4-Create
    5-Refresh

    Throws exception.
    Maybe the problem is because I create a new MapPolyline Object and when it looks into the DynamicLayer dont find the current object there, but there exists one with the same polyline. But its strange when the DynamicLayer.Items.Count = 0.

    You can download the solution here:
    http://www.megaupload.com/?d=RB47FCBM

    Kind regards,
    Gonçalo





  5. Answer
    Andrey
    Admin
    Andrey avatar
    1681 posts

    Posted 22 Oct 2010 Link to this post

    Hello Gonçalo,

    Thank you for the sample solution. It was very helpful for reproducing and analyze.

    A cause of the ArgumentException with the "Value does not fall within the expected range" error is in using the Name property of MapShape objects (MapPolyline, MapPolygon etc).
    When you use the Name property then it is still registered in visual tree although it has been removed from the layer. And when you add the map polyline second time then the exception is thrown.

    We have created the PITS issue to fix this problem in future releases.
    You can track it using the following link:
    http://www.telerik.com/support/pits.aspx#/public/silverlight/3789

    As workaround use the map polylines without using the Name property or use the Tag property instead.


    Kind regards,
    Andrey Murzov
    the Telerik team
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
Back to Top