ThinkGeo.com    |     Documentation    |     Premium Support

Boundingbox problem

Hi,


I have a problem with setting my current extent using the bounding box.  I have a page that displays the map, with a list of layers that is at the moment checkboxes and hyperlinks.  The user can click on a hyperlink  that takes him to a different page where he can set the properties of the selected layer.  The second page receives a session variable from the first page to set the active layer.  The page contains a map with only the active layer and a set of dropdownlists - one contains all layers (defaults to active layer), another one the fill color and another one the line color. 


As soon as the user come in from the first page my extent is not calculated on the specific layer.  This is an example:


I have a list of checkboxes that is layers in my first page: Countries, Province, Cities ....  These layers is displayed in the map with the ability to switch layers on and off.  The user click on Province and LayerProperties page opens that contains a map that displays only the Province layer and a dropdownlist that contains Countries, Province and Cities with the Province layer selected.  The extent is not calculated correctly.  I change the layer to Cities and the Cities layer is created with the correct extent.  I change back to Province and now the extent is calculated.  


This  applies to all the layers, seems that the onload of the page is not setting the current extent correctly and I am not sure why.


This is my code:


ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer(MapPath("~/" + strServerLocation.ToString()));Map1.StaticOverlay.Layers.Add("Province", layer);


 



layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel =


layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = lineColor;

 



layer.Open();


Map1.CurrentExtent = layer.GetBoundingBox();


layer.Close();


Map1.StaticOverlay.Redraw();



ApplyUntilZoomLevel.Level20; layer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.Country1(ddlDefaultLabel.SelectedValue.ToString()); 


 


I tried it with FeatureSource but still the same problem.  I also tried to first set the style before adding the layer but still same problem.  Can someone please help me?


Thanks,


Sonja 


 


 


 



Sonja,


We couldn’t recreate your problem. Here attached is the test sample we are using which works fine, can you have a look what the difference is between yours?


Seems you have some difficulties posting codes on the forum. Here is a link for you showing how to post nice code, please have a look if you are interested.


gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/4941/afv/topic/Default.aspx


We reassembled your code and here is what we get, let me know if it’s not what you wanted to post.



                Map1.StaticOverlay.Layers.Clear();
                ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer(MapPath("~/" + strServerLocation.ToString()));
                Map1.StaticOverlay.Layers.Add("Province", layer);
                layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = lineColor;
                layer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.Country1(ddlDefaultLabel.SelectedValue.ToString());
                layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
                Map1.CurrentExtent = Map1.StaticOverlay.GetBoundingBox();
                Map1.StaticOverlay.Redraw();

Thanks,


Ben



343-Post5200.zip (8.82 KB)

Hi to all, 
 I have a problem with bounding box to set the visible area on a Google map. I’m creating an InMemoryFeatureLayer populated with PointStyle of PointSymbolType.Circle. When I add only 2 or 3 points, the method GetBoundingBox of the InMemoryFeatureLayer returns the RectangleShape of one of these points, and the Google map zooms in too much. With a grater number of points, the bounding box is correct. 
  
 Do you have any suggestion? 
  
 Thanks in advance. 
  
 Fabio

Fabio, 
  
 I think your InMemoryFeatureLayer is under Decimal Degree, you need to convert its BoundingBox to the GoogleMap’s projection.  
  
     proj4 = new Proj4Projection(); 
             // Decimal Degree is with the Srid 4326. 
             proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326); 
             proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString(); 
  
 proj4.Open() 
 RectangleShape ExtentUnderGoogleProjection = (RectangleShape) proj4.Convert.ToExternalProjection(ExtentUnderDecimalDegree); 
  
 Let me know if you have more issues. 
  
 Thanks, 
  
 Ben

Hi Ben, 
 the proj4projection is with the srid 4326. 
  
 After opening the proj4projection, I tried the following (MapUnit of the map is GeographyUnit.Meter): 
  
 map.CurrentExtent = ((InMemoryFeatureLayer)layer).FeatureSource.Projection.ConvertToExternalProjection(layer.GetBoundingBox()); 
  
 The result is incorrect (am I missing something?), now I have the same zoom as before but the position on the map is wrong, the zoom is at the center of the map. 
 With the instruction map.CurrentExtent = layer.GetBoundingBox(), the position on the map is "correct", but the RectangleShape is too little (width and height properties are 1.5xxx). 
  
 Thanks, 
 Fabio 
  


Fabio, 
  
 For the following code, it makes sense the width of layer’s bounding box is 1.5xx before the conversion, but the width after conversion should be a much larger one like 2000 or even more. Can you show me how you create your proj4projection object, maybe something is wrong there.  
 
map.CurrentExtent = ((InMemoryFeatureLayer)layer).FeatureSource.Projection.ConvertToExternalProjection(layer.GetBoundingBox()); 
 
 A proj4Projection object only makes sense when having 2 different projections, one for internal and the other for external. Like what I showed in the above thread, you need to set the internal one to 4326 (DecimalDegree) and set the external one to GoogleMap’s Projection.  
  
 Hope that helps, 
  
 Thanks, 
  
 Ben

Hi Ben,


this is the code for creating proj4projection:


 Proj4Projection proj4 = new Proj4Projection();
proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326); 
proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();  


 And this is the code for setting the proj4projection to an InMemoryFeatureLayer:


 InMemoryFeatureLayer featureLayer= new InMemoryFeatureLayer();
....
featureLayer.FeatureSource.Projection = proj4;  


Thanks,


Fabio



Fabio, 
  
 If you set the proj4 for the inMemoryFeatureLayer, when you call  
 featureLayer.FeatureSource.GetBoundingBox() you should have get the rectangle in Google’s projection already, do not need to do the explicit conversion again. Can you show me a concrete example that what are the coordinates of the points in the inMemoryFeatureLayer? What’s the width of the layer.GetBoundingBox()?  Also if you still have this problem can you send it to us so we can have a look here? You can also send to support@thinkgeo.com and ask to forward to Ben if you want.   
  
 Thanks, 
  
 Ben

Ben, 
 I solved my problem, the GetBoundingBox method works correctly, I missed to call the RectangleShape.Union method to calculate the total area of my data (I used more overlay to achieve the filtering functionality in my application). 
  
 Thanks, 
 Fabio 
  


That’s great Fabio.