ThinkGeo.com    |     Documentation    |     Premium Support

Zoom To Feature

 Hi,



I implemented zoom to feature based on “Zoom In To Feature” example I found in the wiki and unfortunately it does not work if feature crosses 180.

Please see attached sample code.


On  the same note,  GetFeaturesInsideBoundingBox function also does not work across 180. And maybe there are more functions that do not work. 


 


Thank you in advance,

Inna


 



ZoomToFeature.zip (17.6 KB)

Inna, 
  
 I think the result is right, the buttons click will change the current extent which contains all features in specific overlay, after the second button click, the map extent contains all points in "overlay" just like the first button that contains all points in "overlay1", otherwise what result is you expect. Could you provide more information or screen-shot to demonstrate your requirement? 
  
 Thanks, 
 James

 Hi James,


For example, I have one overlay with features across 180° (150°, 160°, 170°, 180°, -170°, -160°, -150°)


Please note, 180 feature does not appear on the map (bug???)



When I want to zoom to the overlay  (click on button 'zoom (bug)'), I would like to see entire overlay, as shown in the picture below:



But instead, map is centered to 0 degree:



 



Hope it is more clear now.


Thanks,

Inna




Inna,


Thanks for your more information, but I am still not very clear. So if I change the vertexes as below, what result you expect when I click the second button? I attached the two screen-shots please choose one.



 private IEnumerable<PointShape> GetTestPoints180()


        {


            yield return new PointShape(90, 20);


            yield return new PointShape(100, 20);


            yield return new PointShape(110, 20);


            yield return new PointShape(80, 20);


            yield return new PointShape(-90, 20);


            yield return new PointShape(-100, 20);


            yield return new PointShape(-110, 20);


        }


 


        private IEnumerable<PointShape> GetTestPoints()


        {


            yield return new PointShape(100, 40);


            yield return new PointShape(105, 40);


            yield return new PointShape(110, 40);


            yield return new PointShape(-15, 40);


            yield return new PointShape(-20, 40);


            yield return new PointShape(-25, 40);


            yield return new PointShape(-30, 40);


            yield return new PointShape(-35, 40);


            yield return new PointShape(-40, 40);


        }



This one?



Or this one?



Thanks,


James



Hi James, 
  
 It’s neither. 
  
 Let me explain: 
 I have 2 overlays: one is a “circles” and one is a “squares”. 
 In my initial example “circles” has features around 180 and populated by GetTestPoints180() and “squares” has features far from 180 and populated by GetTestPoints().  
 When you click on a button “zoom (works)” it zooms to squares and it is working as expected, but if you are clicking on “zoom (bug)”, it should zoom to circles (you should see part of the “real world” and part of the “virtual world”), but it does not. 
  
 Inna

Inna, 
  
 So neither of them is your expect, could you make a diagram to show your expect in the case I mentioned?  
  
 And thanks for your description, I already understand your first case, however when I try to solve your problem, the solution should work for all cases, right? 
  
 Thanks, 
 James 


Hi James,
 
When you click on zoom (works) I am expecting:

 
When you click on zoom (bug) I am expecting:

 
But now, when I am thinking about it, your first picture will be more suitable, because it does not leave white spaces around overlay. But I don’t know how to implement this…
 
Inna

Inna, 
  
 How do you judge which one is the expected result, do you have any rule that could help us implement as .net code? 
  
 Thanks, 
 James

Yes. I need to zoom to  a right zoom level that can accommodate my overlay, without leaving too much “white space”. 
 I am able to achieve this by using wpfMap1.CurrentExtent = overlay.GetBoundingBox(), but it does not work if overlay crosses 180 meridian.

Inna, 
  
 I think you can implement the own code of overlay.GetBoundingBox by yourself, you don’t need to call the API because the logic is simple, just loop all points in overlay, and find the min x, max y, max x and min x, and then combine four double values to a rectangle shape. You can get three boundingboxes, left cross 180 meridian, normal, right cross 180 meridian, and compare which one’s “white space” is the least and return that one. 
  
 Thanks, 
 James