ThinkGeo.com    |     Documentation    |     Premium Support

Can I add a new layer while the map is rotated?

I'm trying to figure out if this can be done. 


Some background: our application has the ability to change map styles on-the-fly, which includes switching to a style with layers not in the current style.  In this case they are added to the overlay.  This works fine but a customer has just realized if the map is already rotated when a style with new layers is loaded this does not work.  After doing some debugging I have found that layers in the map before the rotation is performed have a private variable, pivotVertex, set to a vertex appropriate for the extent in their RotationProjections.  When I create a new RotationProjection I can supply the angle and the unit, but since this value is private it cannot be accessed.  With pivotVertex stuck at 0,0 the new layers are not visible, presumably because that layer is being rotated around 0,0, which is probably on another continent somewhere.


This application originally used MapSuite 4.5.  Back then we had to supply each layer has its own RotationProjection because of all sorts of errors and the advice to NOT share a single RotationProjection among multiple layers.  I really don't want to venture back into that area.


Is there a way around this? 


Thanks,


Allen



 Hi Allen,


To make sure i understand you clearly, please allow me to show what i have know:


   I guess there are several layers and each layer should have a RotationProjection,  and we can somehow (like a button_click) change all these layers' style with a new style, but it doesn't work if we rotate the map before appying the style.  


I'm not sure whethere I'm correct, I created a demo following the description shown above, but seems that we are unable to recreate the problem, could you check the demo attatched to make sure if there is anything we missed and send it back after doing some changes? Just as you mentioned, we will test it with a public release 4.5 and try to provide a workaround for you if it's an issue.


Thanks,


Johnny



Post_11092Sample.txt (2.29 KB)

Hi Johnny, 



Let me check it tomorrow morning when I'm more awake, but I think your example is too simple...what I think would need to happen is once the map is rotated, click another button to add a new layer to the overlay and have it be integrated with the map when refreshed, perhaps something like this: 



(1) Create a map with a states layer 

(2) Rotate the map to 45 degrees by applying the bearing to the states layer's RotationProjection 

(3) While the map is rotated, add a counties layer, adding a RotationProjection to the layer with bearing of 45 and unit (in our data, meters) 

(4) Rotate the map to 90 degrees but I expect because pivotVertex is not set the counties will not be visible


[Note...step 4 might be optional, just a map refresh might do this as well since pivotVertex in the counties layer does not match that in the states layer.]



Let me see if I can come up with something on this end tomorrow. I think this is a case that can be demonstrated fairly easily. 



Allen



 Hi Allen,


We did some changes to the demo following the description, but seems that we are still unable to get the problem. Could you do some changes to the demo and reproduce the problem and, and then send it to us?


Thanks,


Johnny



Post11092Sample.txt (3.39 KB)

Hi Johnny, 



I looked at your code and see one difference. Based on some nasty experiences using MapSuite 4.5 (and the postings are probably still on the forum) we were battling using a single rotation projection object and sharing it among layers against creating a new rotation projection object for each layer. A lot of people (including us) had problems with opening and closing the rotation projection object (something we needed to do to rotate new features being added to the map, etc.) and more or less random rotation projection objects, particularly if it was shared across layers. If the code would open and close the rotation projection object, then MapSuite would frequently throw errors about something being closed it expected to be open. As a result of that mess when we rotate the map we iterate through all the layers and apply the angle to each of several dozen rotation projections, one per layer. 



From your example I see the use of "rotateProjection" in the _Load routine, so I can only presume it's a class-level variable because it's used again in the _mapClick method but I do not see it actually defined in any of the method code you include. So it appears you are using a single rotation projection object across all the layers whereas we, based on experience (and I believe ThinkGeo's recommendation) with 4.5, create a new one for each layer in the map. 



Allen



Johnny, I may have figured this out. 
  
 I was preparing a simple demo of my own, which did exactly as I described: when I add a second layer to an existing overlay without the map being rotated, the two layers line up, but when the map is rotated the new layer is not visible.  But then I used “rot=GetUpdatedExtent(winformsMap1.CurrentExtent)” on the new RotationProjection object for the new layer, which then worked properly.  When I inspect “pivotVertex” it has what appears to be an approriate vertex, unlike 0,0 when I wasn’t calling GetUpdatedExtent. 
  
 Allen

Thank you very much. Please let me know if it’s avaiable. 


Johnny, as far as I can see, this issue is resolved…  I had used "GetUpdatedExtent" before of course but never dug around the private variables in a "RotationProjection" to realize it had an impact on RotationProjection.pivotVertex, so now everything appears to be working OK.  There was nothing really wrong, it was just me not knowing that I had to call "GetUpdatedExtent" in this case. 
  
 Allen

Hi Allen, 
  
 Glad to hear that your problem’s been solved, if you have any questions please let us know. 
  
 Regards, 
 Edgar