ThinkGeo.com    |     Documentation    |     Premium Support

Setting initial map extent based on a layer

Hi,


I was trying to find a sample code for setting up initial extent in MVC. I went to the wiki page for MVC, but the sample describing zoom to full extent actually belongs to web edition. Can you please let me know how can I set up MVC so that intial map extent corresponds to the extent of a given layer ?


Thanks,


Nand



Hi Maya,


You should be able to use something like:




ShapeFileFeatureLayer testLayer = new ShapeFileFeatureLayer("YourPath");
                testLayer.Open();
                Map1.CurrentExtent = testLayer.GetBoundingBox();
                testLayer.Close();
 
 



Hi Ryan, 



Thanks for your reply. This is the code I was using in web edition. I wanted to know how to properly do it in MVC when page loads. When page loads the map should be zoomed to the extent of the layer only. Is there any way to do it when we initialize the map in view? 



   @{Html.ThinkGeo().Map("Map1", new System.Web.UI.WebControls.Unit(100, System.Web.UI.WebControls.UnitType.Percentage), 510)             .MapBackground(new BackgroundLayer(new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)))             .MapUnit(GeographyUnit.DecimalDegree)             .CurrentExtent (.....)   



Thanks, 

Maya



Hi Maya,


Here is a sample code for you



@{
            ShapeFileFeatureLayer worldLayer1 = new ShapeFileFeatureLayer(Server.MapPath("~/App_Data/cntry02.shp"));
            RectangleShape rect = worldLayer1.GetBoundingBox();
            Html.ThinkGeo().Map("Map1", new System.Web.UI.WebControls.Unit(100, System.Web.UI.WebControls.UnitType.Percentage), 510)
                .MapBackground(new BackgroundLayer(new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"))))
                .CurrentExtent(rect.UpperLeftPoint.X, rect.UpperLeftPoint.Y, rect.LowerRightPoint.X, rect.LowerRightPoint.Y)....
}

Hope it helps,


Edgar



Thanks a lot Edgar. I appreciate the fast response. Now, I can get the bounding box of the layer. However, I wanted to apply a query to the layer based on the user workorderid. I apply whereclause to the layer and then I get the bounding box of the layer, but it seems that instead of getting bounding box of queried features, it is giving me bounding box of the whole layer. Can you please suggest what would be the best approach to get bounding box of just queried features? 
  
  MsSql2008FeatureLayer sqlFieldBdryLayer = new MsSql2008FeatureLayer(spatialConnectionString, “*********”, “farm_name”);
           string whereClause = “where WO_ID=” +***+ “and legal_desc=’*******’”;
           sqlFieldBdryLayer.WhereClause = whereClause;           
           sqlFieldBdryLayer.Open();
           RectangleShape rectBoundingBox=null;
           if(sqlFieldBdryLayer.HasBoundingBox)
           {
                rectBoundingBox = sqlFieldBdryLayer.GetBoundingBox();
           }
           else
           {
               
           } 


You're welcome Maya, but sorry to tell you the where clause will not take effect if the ExecutingSqlStatementType is GetSpatialDataType, GetColumns, BuildIndex, GetBoundingBox. I think you can change your code to, 



           MsSql2008FeatureLayer sqlFieldBdryLayer = new MsSql2008FeatureLayer(spatialConnectionString, "*********", "farm_name");
           string whereClause = "where WO_ID=" +***+ "and legal_desc='*******'";
           sqlFieldBdryLayer.WhereClause = whereClause;           
           sqlFieldBdryLayer.Open();
           RectangleShape rectBoundingBox=null;
           if(sqlFieldBdryLayer.HasBoundingBox)
           {
                Collection<Feature> features = sqlFieldBdryLayer.GetAllFeatures(..);
                rectBoundingBox = features[0].GetBoudingBox();
                for(int i = 1; i < features.Count; i++)
                {
                    rectBoundingBox.ExpandToInclude(features[i].GetBoudingBox()); 
                }
           }

Hope it helps,


Edgar