ThinkGeo.com    |     Documentation    |     Premium Support

Repositioning with CenterAt under rotation

Hello,


I searched the forums for something like this and didn't find anything.


Here's my scenario:


1. When my application starts, it's positioned in the middle of the county.


2. I click a button and center the map on the building our office is located in


3. Once the map is centered on our building I apply 15 degrees of map rotation, then use CenterAt to recenter the map on a shopping mall a few miles away. The map is positioned at the wrong location.


4. I click a button to return to our office building and the location IS CORRECT. 


If I switch the order and apply the rotation after centering on the shopping mall and CenterAt to our office building, the map goes to the wrong location, but if I then click on the button to go BACK to the shopping mall, the map positions correctly.


It appears that internally when the rotation is set the map's center is captured.  Does this mean that each time I do a CenterAt to move to a new location I have to set RotationProjection.Angle to reestablish the map rotation point?


Thanks,


Allen Huber



Allen,


Thanks for your post and questions.
 
Please take a look at the following topics; I think they are exactly talking about the same issue with yours:
gis.thinkgeo.com/Support/Dis...fault.aspx
gis.thinkgeo.com/Support/Dis...fault.aspx
 
Please feel free to let me know if you still have problems, it would be nice if we can concrete this problem into a sample, which definitely would be helpful and convenient to identify the issue quickly.
 
Thanks.
 
Yale

Hi Yale, 
  
 Actually, I’ve seen those two posts and I don’t think they’re really directly related.  They both talk about a map that is constantly being rotated, and thus the code must constantly set the rotation angle.  I am not doing that.  I am going to a position on the map, setting the rotation ONCE, and then simply using CenterAt to move back and forth between points on the map without further rotation changes.   
  
 I’m getting ready for lunch, but when I come back I think this can be demonstrated with a simple example.  I’ll work on that when I get back. 
  
 Thanks, 
 Allen

Hi Yale, 
  
 I’ve just finished a real simple example of this.  It’s a 4 MB file (with the data shapefile) which I am going to send to the support e-mail account with directions to forward it on to you.  I also included a Word document which shows, with pictures, step-by-step as to what I’m talking about. 
  
 Thanks… 
 Allen

Allen, 
  
 Thanks for your sample code and guides to recreate this problem, I will look into it and get you updated as soon as possible. 
  
 Thanks. 
  
 Yale 


 Allen,


Please take a try to use the following code snippet in sample, hope it works. Any feedbacks would be appreciated.


 



        private void button1_Click(object sender, EventArgs e)
        {
            Feature libertyFeature = new Feature(-8495264, 4846003);
            rotationProjection.Open();
            Feature rotatedLiberityFeature = rotationProjection.ConvertToExternalProjection(libertyFeature);
 
            winformsMap1.CenterAt(rotatedLiberityFeature);
            winformsMap1.Refresh();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            Feature libertyFeature = new Feature(-8498033, 4848226);
            rotationProjection.Open();
            Feature rotatedPackCityFeature = rotationProjection.ConvertToExternalProjection(libertyFeature);
 
            winformsMap1.CenterAt(rotatedPackCityFeature);
            winformsMap1.Refresh();
        }

Any more questions or concerns please do not hesitate to let me know.


Thanks.


Yale



Thanks Yale… 
  
 I had a feeling that this might have something to do with it, but the exact purposes of ConvertToExternalProjection and ConvertToInternalProjection, and maybe more useful, when their use is needed, doesn’t appear to be well documented.  I may not get to this today but I should be able to first thing tomorrow and will report back. 
  
 Allen

Allen, 
  
 Please take a try at your convenient time and any feedbacks would be appreciated. 
  
 Any more questions or concerns please do not hesitate to let me know. 
  
 Thanks. 
  
 Yale 


Allen,


 Also, I want to let you know that we have a Code Community sample that shows how to have the map rotated and centered based on the direction and location of a moving vehicle. I suggest you take a look at that also. The sample is Centering and Rotating and it is a Desktop application.wiki.thinkgeo.com/wiki/Map_Suite_De...ng_Samples



 


 



Val, 
  
 Yes, I’m familiar with that example.  It’s something like what we’re doing in our software, but not quite.  Our software typically runs on low-end hardware (perhaps somewhat equal to a typical netbook; maybe less) so redrawing the map each time a new GPS position comes in is not possible because the hardware can’t keep up.  I’ve come to a stop in a parking lot and watched the map redraw for ten or fifteen seconds before it caught up. which of course is unacceptable.  (Plus, our data source is SQL Server, which is not as speedy as shapefiles.)  As with the Community example, we have modes in our application that keeps the direction of travel pointing toward the top of the map.  However, to reduce the number of redraws we accumulate the vehicle bearing changes until it reaches a certain level (it’s something like +/-30 degrees) and then force a redraw and recenter.  We also have a mode where the vehicle moves but when it gets near the edge of the visible map it’s recentered, IN COMBINATION WITH the accumulated rotation.  Without rotation, or if the rotation is applied every time the position is changed (like the example) appears to be simple to code, but with MapSuite (and other mapping products we’ve used in the past) if you don’t redraw the map each time it gets tough to code, I guess because of the way map rotation is implemented.  We’ve used other products where the code must explicitly set the map’s rotation point.  MapSuite doesn’t have this function, and it seems to me (I’m just about to try this) that whenever the rotation is set the current map location is taken to be the new map rotation point, which means if I recenter the map I must apply the rotation angle even if the angle hasn’t changed.  This is vital to us because, as I just noted, we do not rotate nor recenter the map each time we get a new GPS position.  I just haven’t been able to get anyone to confirm that this is actually what happens, nor have I been able to get anyone to explain to me what “ConvertToExternalProjecton” and “ConvertToInternalProjection” do…I’m told to use them in this example, but I would like to know WHY so that when I encounter this kind of thing again I’ll know which method to use, if any. 
  
 Anyway, I’m off to try Yale’s solution and continue to experiment to figure out how to do what we need to do with the rotation. 
  
 Thanks, 
 Allen

Hello Val and Yale… 
  
 First, if I went on too long last time, I apologize.  Because I tend to dabble with things like this on my own time, I like to know why I have to do things instead of just what to do, but sometimes it’s just easiest to do it and don’t ask questions! 
  
 Yale, I tried your suggestion and it seems to work just fine.  When I center on Park City with a rotated map, it goes right where it was supposed to.  My big concern was that once I was at Park City and decided to rotate the map more, the rotation point wasn’t where I thought it would be.  But I increase the rotation and the map rotated right in the middle of Park City where I hoped it would be.  I’m still curious about what updates the map’s rotation point (in opposition to other products, as I noted above, where it’s explicitly coded…with that product the map would center on Park City but continue to rotate around the Liberty Place point until I wrote code to update the rotation point) but as long as it works, I won’t press the issue. 
  
 Thanks and enjoy whatever holiday time off you have… 
 Allen

Allen,


Thanks for your feedbacks and Happy New Year 2011!
 
I am sorry for not trying to explain clearly about the Projection, now, I will take a try, hope it helps.
 
Every projection no matter what kinds of projection it is , it has two kinds or data: original data and projected data. For the proj4 projection, the original data means the data is in the original srid projection system, and the  projected data means the data is in the target srid projection system. Similar, in the rotation projection system, the original data means the data before rotated, and the projected data means the data after rotation.
 
In the example provided,  we set the rotation projection to the target layer, so when we use the Center API, we should passed in a rotated point instead of original point, so we use the API ConvertToExtentalProjection to project data from original data to projected data(vice versa). That is why we use the API to project before calling the CenterAt API.


layer.FeatureSource.Projection = rotationProjection;

 
Any more questions or concerns please do not hesitate to let me know.
 
Thanks.
 
Yale

Thanks for the info Yale…maybe having it documented here will help someone else in the future.  I have been working on some rotation code and have been able to make MapSuite do what I need.   
  
 In case I don’t have any more questions this week (and I hope things are quiet here the rest of the week and I won’t) you have a great New Year as well. 
  
 Thanks, 
 Allen

Allen,


Thanks for your posts. I agree that some classes’ documentations need to be enhanced and improved, that is the target we are always trying to achieve, sorry if causing you the inconvenience.
 
Any more questions or concerns please do not hesitate to let me know.
 
Thanks.
 
Yale