ThinkGeo.com    |     Documentation    |     Premium Support

Zoom To Extent not working

Hi, when I add a shapefilelayer, I also want to zoom to the extent of the layer. This code below works everywhere else apart from the dateline where it just zooms out to the wold map. Looks like it is not zooming correctly to the extent when the shapefile crosses over the dateline. My code is given below and specific lines that are used to zoom are highlighed in yellow. Please help.


 public void AddCustomFeatureLayer(WpfMap wpfMap1, string location,string LayerName)

        {

            

            ShapeFileFeatureLayer customLayer = new ShapeFileFeatureLayer(@location);

            customLayer.RequireIndex = false;

            customLayer.Open();

            ThinkGeo.MapSuite.Core.RectangleShape rect = customLayer.GetBoundingBox(); //get the extent of the current layer

            if (customLayer.UsingSpatialIndex == false)

            {

                customLayer.Close();

                ShapeFileFeatureSource.BuildIndexFile(@location, BuildIndexMode.Rebuild);

            }


            customLayer.RequireIndex = true;

            Proj4Projection proj4 = new Proj4Projection();


     string prjFileText = System.IO.File.ReadAllText(@location.Replace("shp", "prj")); //get the text of the .prj file.

            proj4.InternalProjectionParametersString = Proj4Projection.ConvertPrjToProj4(prjFileText); //set 

            proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString(); /

            customLayer.FeatureSource.Projection = proj4; // proj_EEZs;

            customLayer.WrappingMode = WrappingMode.WrapDateline;

            customLayer.WrappingExtent = new RectangleShape(WrapExtentMinX, WrapExtentMaxY, WrapExtentMaxX, WrapExtentMinY); //new RectangleShape(17897271, -1367305, 19514067, -2411741);

          




            customLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));

            customLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


            LayerOverlay staticOverlay = new LayerOverlay();


            staticOverlay.Name = LayerName;

            staticOverlay.Layers.Add(LayerName, customLayer);

            staticOverlay.Layers.MoveToTop(LayerName);


            wpfMap1.Overlays.Add(staticOverlay);

            wpfMap1.CurrentExtent = rect;


            wpfMap1.Refresh();

        }



Hi,


I will appreciate if you can respond to my question.



Bimal,


  In order to have your map zooming in to area crossing the date line (180 degree meridien), you need to understand that when you go pass the 180 degree meridien to the east (let's assume your map is in decimal degree. The same principle apply for map in meters) , the actual coordinate of the map keeps increasing beyond 180 (190, 200 etc), it does not go back to -180 (-170, -160 etc). You need to take that into account otherwise it is going to cause you map to get the extent of the entire world. So for example, if you want to zoom in an area across the 180 degree meridien east, you can set the extent of your map to Upper Left: 160; 20 Lower Right 200; -20  (new RectangleShape(160,20,200,-20))

 I hope that makes sense and that you understand the concept now.



Val, 



Is this functionality which could be added to the current extent call when using wrap dateline? I think mapsuite should know that the layer is wrapped around the dateline and change the way it calculates the extent rectangle etc. 



thanks 



Phil



Phil,


  Although the map can be displayed with the world wrapping to the west and to the east when using that WrapDateLine mode, the real coordinate system of the map control follows a linear increase or decrease in x values as I explained ealier. It is still the responsability of the developer to be aware of that and implement the code accordingly. Map Suite map control cannot guess if you mean to set the extent on the Pacific straddling the left or the right virtual map. Thank you.



Hi All,


I managed to fix the problem this way:


The upper left X for some reason gets x axis in the wrong quadrant when the shape file crosses the dateline i.e the upper left x shows values as negative when it should be positive.


Hope this helps someone.


Here is the code..


public void ZoomToLayer(object sender, RoutedEventArgs e)

        {

           

            TreeViewItem myItem = (TreeViewItem)treeView1.SelectedItem;


            string layerName = @myItem.Header.ToString();


            ThinkGeo.MapSuite.Core.RectangleShape rect = new RectangleShape();




              foreach (Overlay o in wpfMap1.Overlays)

                {

                    if (o.Name.ToString() == layerName)

                    {

                        rect = o.GetBoundingBox();

                        if (rect.UpperLeftPoint.X < 0)

                        {

                            rect.UpperLeftPoint.X = -rect.UpperLeftPoint.X;

                        }



                    }

                   

                }


           wpfMap1.CurrentExtent = rect;

           wpfMap1.Refresh();

        }



Bimal,


 I am glad you managed to find a solution to your problem. I hope that the clues I gave you on the workings of the WrapDateline mode helped you. I want to also thank you for sharing your solution in this forum. I am sure this is going to come handy for other developers running into situations similar to yours.