ThinkGeo.com    |     Documentation    |     Premium Support

Projecting EllipseShape

Hi All,


I am using version 6.0 and i have wgs84 data that i'm projecting to spherical mercator.  The data shows as expected on the map.  The problem i'm having is that i'm trying to draw a range ring, using an inmemory feature layer that i add an ellipse (circle) to.  The circle draws fine, but when i check the radius distance, it is wrong.  How do i get the diameter of the circle to be correct?


 


Thanks.


 


Shaun



Hi Shaun,  
 Thanks for your question! 
  
 We are going to need additional information about the issue to be able to assist.  
 First we need to know what MapUnit your map is using. 
 Second what values are you using to provision your Ellipse? Are you using meters, DecimalDegrees? 
 Third, what mechanism are you using to retrieve the radius of your Ellipse and what are the value do you expect to get and what value are you receiving. 
  
 Do you have any screenshots of the values you are recieving or perhaps a code sample that can show us how you have these elements setup? 
  
  


Thanks for the response Ryan,  here is what i got:


1.  Map Unit is Meters.


2. The data i'm displaying is wgs84 and i project it from Epsg(4326) to Epsg(3785)


3. The ellipseshape is created as EllipseShape(point, Meter, Meter)


4. To measure the diameter of the circle i have a RulerOverlay that is a TrackInteractiveOverlay.  It's projection is:


Internal (3785) External (4326).  I project the WorldCoord X, Y to get the correct wgs84 distance.


This ruler works perfect for the data i display, but when i draw an ellipse and measure it with the same ruler, the diameter is not what is expected.


I think what needs to happen is that i need to draw the ellipse in decimal degrees then project it to (3785), but i don't know how to project it correctly.



Does anyone know how to project an inmemory feature layer from wgs84 to Mercator?



Hi Shaun,


You can can convert all of the features contained in your InMemoryFeatureLayer by using the following:



Proj4Projection proj = new Proj4Projection();
        proj.InternalProjectionParametersString = Proj4Projection.GetDecimalDegreesParametersString();
        proj.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(3785);
        
        InMemoryFeatureLayer inMemoryFeatureLayer = new InMemoryFeatureLayer();
        inMemoryFeatureLayer.FeatureSource.Projection = proj;


Ryan,


When would this be done, after the features are added, or when the inmemoryfeature layer is created?



Well, I think i finally figured it out.  I copied code from one ot the examples that creates an ellipseshape and adds the ellipse to the layer like so:


lyr.open();


lyr.EditTools.BeginTransaction()


EllipseShape rng = new EllipseShape(...);


lyr.EditTools.Add(new Feature(rng));


lyr.EditTools.committransaction();


lyr.close();


The above code doesn't project the ellipse correctly, even after setting the projection like Ryan posted above.


The mistake was not adding the ellipseShape to the layer as an InternalFeature.  Once i did that, the projection works fine.



Hi Shaun, 
  
 Glad to hear that you find a right way to solve the problem, there is something different between, InternalFeatures.Add() and EditTools.Add(), the feature added by method InternalFeatures.Add() must be the non-projected one, and the feature added by method EditTools.Add() must be the projected one, so I think you are adding the non-projected one in your previous code. 
  
 Regards, 
 Edgar