Big Shapefiles with RadMap

4 posts, 0 answers
  1. Esther
    Esther avatar
    13 posts
    Member since:
    Jun 2010

    Posted 01 Dec 2010 Link to this post

    Hello everybody,
    Is there any limit of records in the shapefile to load?
    I´ve try the demo with my own shapefiles and it works ok if the file has few records.
    Using a file with thousand of polygons it takes so long and most of times it crashes.
    Is there any way of doing this?
    Thank you ,
    Esther
  2. Andrey
    Admin
    Andrey avatar
    1681 posts

    Posted 03 Dec 2010 Link to this post

    Hi Esther,

    First of all, you wrote that application crashed. Could you, please, provide us with detailed information about the crash: exception type, message, callstack. The shape file which cause the crash when loading would be appretiated.

    The productivity of the information layer actually depends on the productivity of your PC. We use regular WPF shapes to render map shapes.  In any case, thousands of the map shapes sounds not good for the information layer. We usually recommends using of the Dynamic Layer when it is necessary to show thousands of objects over the map. In your case it would require preloading of the shape file whith following using of the resulting collection with Dynamic Layer.

    Kind regards,
    Andrey Murzov
    the Telerik team
    Browse the videos here>> to help you get started with RadControls for WPF
  3. UI for WPF is Visual Studio 2017 Ready
  4. Esther
    Esther avatar
    13 posts
    Member since:
    Jun 2010

    Posted 09 Dec 2010 Link to this post

    Hello Andrey,
    I don´t get an error, the application remains waiting and the shapefile never loads, or it does very slowly. I don´t really know.
    I´m sorry I can not send you the file because it is confidential information.
    Could you show me an example on how to load a shapefile with dynamic layer? I haven´t found anyone on the demos.

    I´ve also tried to make tiles with my shapefile and develope my own provider. It works but it is also slow. It takes about 5 seconds to load images when zoom is changed. I don´t know if it is normal or if I´ve done something wrong.

    Thank you very much for your answer,

    ESther
  5. Andrey
    Admin
    Andrey avatar
    1681 posts

    Posted 14 Dec 2010 Link to this post

    Hi Esther,

    Here it is which you can use to show map shapes loaded from the ESRI shape file in the Dynamic Layer:

    <Window x:Class="UseMapShapesInDynamicLayer.MainWindow"
            Title="MainWindow" Height="500" Width="600">
        <Grid>
            <telerik:RadMap Name="radMap"
                            Center="0,0"
                            ZoomLevel="3">
                <telerik:RadMap.Provider>
                    <telerik:OpenStreetMapProvider />
                </telerik:RadMap.Provider>
                <telerik:DynamicLayer x:Name="dynamicLayer">
                    <telerik:DynamicLayer.ZoomGridList>
                        <telerik:ZoomGrid LatitudesCount="4"
                                          LongitudesCount="4"
                                          MinZoom="3" />
                        <telerik:ZoomGrid LatitudesCount="16"
                                          LongitudesCount="16"
                                          MinZoom="9" />
                    </telerik:DynamicLayer.ZoomGridList>
                </telerik:DynamicLayer>
            </telerik:RadMap>
      
        </Grid>
    </Window>

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
      
            this.ReadShapes();
        }
      
        internal List<FrameworkElement> Shapes
        {
            get;
            set;
        }
      
        /// <summary>
        /// Preload shapes
        /// </summary>
        private void ReadShapes()
        {
            var reader = new MapShapeReader();
      
            reader.PreviewReadCompleted += new PreviewReadShapesCompletedEventHandler(PreviewReadCompleted);
            reader.Read(
                new Uri("/UseMapShapesInDynamicLayer;component/world.shp", UriKind.RelativeOrAbsolute),
                new Uri("/UseMapShapesInDynamicLayer;component/world.dbf", UriKind.RelativeOrAbsolute));
        }
      
        private void PreviewReadCompleted(object sender, PreviewReadShapesCompletedEventArgs eventArgs)
        {
            if (eventArgs.Error == null)
            {
                // Shape file has been read without errors.
                // Cache items.
                this.Shapes = eventArgs.Items;
      
                // Now we can assign dynamic source 
                // to the dynamic layer.
                DynamicSource source = new DynamicSource(this);
                this.dynamicLayer.DynamicSource = source;
            }
        }
    }

    internal class DynamicSource : IMapDynamicSource 
    {
        private MainWindow window;
      
        public DynamicSource(MainWindow mainWindow)
        {
            this.window = mainWindow;
        }
      
        public void ItemsRequest(object sender, ItemsRequestEventArgs e)
        {
            var layer = sender as DynamicLayer;
      
            double minZoom = e.MinZoom;
      
            Location upperLeft = e.UpperLeft;
            Location lowerRight = e.LowerRight;
            LocationRect rect = new LocationRect(upperLeft, lowerRight);
      
            List<object> items = new List<object>();
      
            // request areas 
            foreach (FrameworkElement element in this.window.Shapes)
            {
                var shape = element as MapShape;
                if (shape != null)
                {
                    if (this.ShouldBeAdded(rect, shape, layer))
                    {
                        items.Add(shape);
                    }
                }
            }
      
            e.CompleteItemsRequest(items);
        }
      
        private bool ShouldBeAdded(LocationRect rect, MapShape shape, DynamicLayer layer)
        {
            return !layer.Items.Contains(shape)
                && rect.Intersect(shape.GeographicalBounds);
        }
    }


    Currently WPF version loads tiles not fast. We are working on it. We suppose to fix it in the SP1. You can check availability of the fix using our PITS:

    http://www.telerik.com/support/pits.aspx#/public/wpf/4181

    All the best,
    Andrey Murzov
    the Telerik team
    Browse the videos here>> to help you get started with RadControls for WPF
Back to Top