ThinkGeo.com    |     Documentation    |     Premium Support

FeatureSource Projection Questions

I have a number of questions related to how projections are managed...


It appears that when we apply a projection, it is applied to each feature's shape.  When the DrawCore is executed on a PointStyle, the shape associated with the feature contains the projected coordinates.  Then, after the rendering has completed, the shape reference changes (I think back to the original shape.)


Question 1)


How can I query a feature for the projected shape coordinates after the rendering has occurred?




Question 2)


We have a label that updates with mouse's Lat/Lon coordinates.  We have been using the ExtentHelper.ToWorldCoordinate to get the current Lat/Lon location of the mouse.  When we apply a projection to our FeatureSources, the values returned from ExtentHelper.ToWorldCoordinate don't line up with the projected values.  Do you have an example for how to make this lineup?  Should ExtentHelper take a Projection as an argument?


Thanks,


Greg



Greg,


See following screenshot with Question1 and Question2 marked, also I attached the sample code for it.



Any more questions just feel free to let me know.

 

Thanks.

 

Yale



Post7877.zip (107 KB)

Hi Yale,


I think we are talking about different kinds of projections.  I'm using the RotationProjection.  


So...


for question 1 from above)


The ThinkGeo API appears to only apply the RotationProjection to a Feature's shape at rendering.  After rendering, it resets the Feature's shape to a different shape instance.  How do I get the shape that you use during rendering, after the rendering has occurred?  Another way to look at this is, I want to know the XY values, post rendering, that the RotationProjection has applied to my shape, and I cannot get it because the ThinkGeo code has reset the reference.


for question 2 from above)


The use of ExtentHelper.ToWorldCoordinate doesn't work when you have a RotationProjection applied to the layers.


Thanks,


Greg



Greg, 


Yes, I think there are quite some differences between RotationProjection and some other projections.
 
I am sorry to say that I still could not fully understand what you are trying to achieve up to now, the rotation projection is just like an action instead of a coordinate system, and as you know all of queries are dependent on the boundingBox of the features and boudningBox of the extent of the Map Control. So we cannot use a “rotated” RetangleShape to do the queries.
 
It would be nice if we can create a sample to show what we are trying to achieve, that would be much easier to understand and helpful to fix the problem.
 
Thanks.
 
Yale

Yale,  


I think you glossed over the issue that is the easiest to describe,  the easiest for you to reproduce without a sample, and also the most important to us right now.


If you have a map where a RotationProjection has been applied, and you use ExtentHelper.ToWorldCoordinate to display the maps's mouse coordinates in a label, then ExtentHelper.ToWorldCoordinate returns the non-rotated values.  In other words, ExtentHelper.ToWorldCoordinate doesn't take the rotation into account.  Do you understand?


All you have to do is have a map with at least one point feature and rotate the layer.  Then put your mouse over the feature to display the values returned by dumping the mouse coordinates into ExtentHelper.ToWorldCoordinate in a label.  The values returned by ExtentHelper.ToWorldCoordinate don't match the coordinates of the feature because ExtentHelper.ToWorldCoordinate has no knowledge that a RotationProjection has been applied to the map.


-Greg



Yale, I've been working with Greg on this. I have an example that demonstrates question #2 above. To view the issue, run this sample app then hover your mouse over a feature and note its Lat/Long coordinates reported by the label at the top right that updates with mouse move. Then change the rotation angle in the text box at the top left, press the apply button. After the map redraws at the new rotation, hover your mouse over the same point. The Lat/Lon value of that features location on the earth should not change simply because the map view has been rotated. You will note a different Lat/Lon is being reported. Thus, my initial question directed towards answering Gregs question #2 is how to use the rotationProjection to report the correct coordinates of the mouse position? My attempt that is commented out below is not correct. The line that is not commented out reports the wrong position.    

pointShape mouseLoc = (point != null) ? ExtentHelper.ToWorldCoordinate(wpfMap1.CurrentExtent, new ScreenPointF((float)point.X, (float)point.Y), (float)wpfMap1.ActualWidth, (float)wpfMap1.ActualHeight) : null;

//PointShape mouseLoc = (point != null) ? ExtentHelper.ToWorldCoordinate(rotateProjection.GetUpdatedExtent(wpfMap1.CurrentExtent), new ScreenPointF((float)point.X, (float)point.Y), (float)wpfMap1.ActualWidth, (float)wpfMap1.ActualHeight) : null; 


Attached: MapRotationSample.zip

Question 3:


In addition to Gregs questions, I have a 3rd question related to this topic, and that is given a coordinate value, how do I zoom the map in on that location when the map is rotated or using the rotation projection. I've updated the sample and added two text boxes at the top center where I want to type in the Longitude and Latitude and then press the button with the magnifying glass to zoom and center the map on the given coordinate. The following line of code does not work:  
PointShape centerPt = (PointShape)rotateProjection.ConvertToExternalProjection(new PointShape(longitude, latitude)); 
wpfMap1.ZoomIntoCenter(30, centerPt);
PerformRefresh();


Greg & Rod,


Thanks for your post and explanations, the samples are definitely helps me think more clearly about the problem.
 
Hope my following answers make sense.
 
Question 1:
As you already have known, the re-calculations against the features according to angle of the rotation projection were done no matter it is on rendering or querying processes. So, following code snippet query using GetFeatureById will return back a rotated feature if RotationProjection was set to valid value.
Feature roatedFeature = worldLayer.QueryTools.GetFeatureById("135", ReturningColumnsType.NoColumns);
 
If you want to get the original feature before rotating, following conversion is needed. This is exactly the same with using other projections.
rotateProjection.Open();
Feature originaeature = rotateProjection.ConvertToInternalProjection(roatedFeature);
 
Quetion2:
The API ToWorldCoordinate in Map control works fine no matter which coordinate system was using, even in RotationProjection system. I was also messed with this question when answering in previous post, sorry for this.
 
The reason is the RotationProjection is set to the layer instead of the Map control. Let us say one example, the map control contains 2 layers, let us call them Layer1 and Layer2. Both of them contain one point; the difference is that Layer2 was set RoationProjection while Layer1 was not set. So, when we mouse over the point on Layer1, it is always the same, while when we mouse over Laeyr2, it is always different, that is because the point we see on the map control is a rotated point. If you want to get the original point before rotation, just use the way discussed in question1.
 
Question3:
When we want to zoom into and center on some specified point, we do not need to do projection on the point first because the RotationProjection is set on the layer instead of Map control.
PointShape centerPt =new PointShape(longitude, latitude);
wpfMap1.ZoomIntoCenter(30, centerPt);
PerformRefresh();
 
Any more questions just feel free to let me know.
 
Thanks.
 
Yale

Yale,


Regarding your answer to question 2 above, our requirement is that we report the location of the mouse, in LatLon, regardless of if the mouse is over a feature or not.  The example we supplied was used to show that we cannot depend upon ExtentHelper.ToWorldCoordinate to get the mouse location when a RotationProjection has been applied to a layer.  My understand of your response tells me that you require the mouse to be over a point in order to get the location of the mouse, and this isn't exactly what we need.  We need to be able to report the mouse location of "empty space" over a FeatureLayer where a RotationProjection has been applied, and it needs to be correct.


If you will notice, there is no FeatureLayer.ToWorldCoordinate function, and there is no overloaded function in ExtentHelper.ToWorldCoordinate that takes a FeatureLayer or a RotationProjection.


Regarding your answer to question 3 above, our requirement is that we are able to zoom to "empty space" in a Feature Layer where a RotationProjection has been applied.  I'm failing to see how wpfMap1.ZoomIntoCenter will work because there it has no knowledge of the RotationProject.


Perhaps the answer is to use RotationProjection.ConvertToExternalProjection before calling wpfMap1.ZoomIntoCenter?  Is this the opposite of ConvertToInternalProjection?


-Greg



 Greg,


Yes, I think we are close to the final solution:). Both of them need to set the ConvertToInternalProjetion, I am quite sure about the Question 2, while I am still a bit concern about the Questions 3 because I am still a bit confused about its going on.
Question2, try to add the conversion into Internal Projection for the mouse world coordinate.
PointShape mouseLoc = (point != null) ? ExtentHelper.ToWorldCoordinate(wpfMap1.CurrentExtent, new ScreenPointF((float)point.X, (float)point.Y), (float)wpfMap1.ActualWidth, (float)wpfMap1.ActualHeight) : null;
mouseLoc = (PointShape)rotateProjection.ConvertToInternalProjection(mouseLoc);
 
Question3, similar to Question2 , made the conversion before ZoomIntoCenter.
PointShape centerPt =new PointShape(longitude, latitude);
centerPt = (PointShape)rotateProjection.ConvertToInternalProjection(centerPt);
wpfMap1.ZoomIntoCenter(30, centerPt);
PerformRefresh();
 
Any more questions just feel free to let me know.
 
Thanks.
 
Yale