ThinkGeo.com    |     Documentation    |     Premium Support

ShapeFile projection when switching MapUnit

I have some shape files that display in my map when I have my MapUnit == GeographicUnit.DecimalDegree.


When I switch my MapUnit to either GeographicUnit.Meter or GeographicUnit.Feet, the shape files no long render in the map.


I'm guessing I need to apply a projection to the shape file data.  Is there a way to do this using your APIs?


Thanks,


Greg



Hello Greg, 
  
 Thanks for your post, yes you need set the projection to the shapefilefeaturelayer, you can see the sample in HowDoISamples—>Projection—>UseADifferentProjectionForAFeatureLayer. 
  
 Please feel free to let us know your problems. 
  
 Regards, 
  
 Gary

Hi Gary,


Would you mind posting the URL to the sample referenced?  I see the Save To Projection sample but I'm not finding the Project On the Fly sample in the Wpf Desktop Edition samples.  Thanks!


Rod



Hello Rod,


You can find the HowDoISamples after you install full or evaluation wpf edition in the install folder, and after run it, you can find the sample you need here:



Regards,


Gary



Thank you Gary,



Your sample app is very helpful!  I've modified the sample a little bit to match some unique requirements we have, which I'm having trouble getting working (attached).  In our WPF Desktop application we have a requirement to switch the map from Lat/Lon coordinates to Cartesian X/Y coordinates.  We have this implemented and working in our application, however we have a function to allow users to add shapefile data to the map which is not working.  Scenario is as follows:



1) User loads the oklahoma_highways shapefile to map



2) User decides to switch to X/Y coordinates and uses a combobox to toggle to X/Y coordinates  (we have the target projection info)



3) We clear our application data (InMemoryFeatureLayer)  from map and re-load using X/Y coordinates.  We need to do the same with the shapefile previously loaded too, so we clear the ShapeFileFeatureLayer and re-load it using an appropriate Proj4Projection.InternalProjectionParametersString and Proj4Projection.ExternalProjectionParametersString



In the sample app, this process is replicated by selecting either X/Y or Lat/Lon from the combo box.    For the sample, I created a single Feature using Lat/Lon and add the point to the map for the Lat/Lon option.  When X/Y is selected, the layer is cleared and a new feature is created using an equivalent X/Y coordinate, and loaded.



I would like to do this same thing with a Shapefile layer.  The sample loads the Shapefile layer into Lat/Lon fine, but I can't get it to load the Shapefile and re-project it to the X/Y coordinate system so that it will line up with the InMemoryFeatureLayer Point Feature.



How do I load the ShapeFile (oklahoma_highways) such that it will display correctly in the map that is set to MapUnits of Feet (the X/Y) selection on the ComboBox?  I've tried several different combinations of InternalProjectionParameterStrings and ExternalProjectionParameter strings and cannot seem to get the shapefile to load in correct position relative to the point.



Thank you for your assistance with this!



Rod



LatLonToXYSample.zip (62.1 KB)

Update:   Here are a new set of coordinates for this problem that I've verified to be equivalent from WGS84 to NAD27 Oklahoma North, ft (EPSG 3501)



            double latitude = 35.5953650;
            double longitude = -99.6787521;
            double x = 1501009.66;
            double y = 221013.88;

Result is still the same (shapefile data not displayed at location of lat/lon point, using these updated/verified coordinates.

 



Rod,


 Thank you for your explanation and the sample. Your case is pretty straightforward and I think that you are getting mixed up with the projection parameters. I am working on modifying your sample to have it working as you described. You will have it ready tomorrow, and with the new code and comments I think it will all make more sense to you. Thank you.



I've tried a different approach (updated sample attached).  In this sample app, I used ShapeFileFeatureLayer.SaveToProjection to first save to / create a new shapefile in the X/Y projection.  Then I add that new shapefile to the map.  I still do not get data alignment in the X/Y map (data and shapefile in XY nad27 coordinates) as I do in Lat/Lon map (data and shapefile in wgs84 coordinates).


 



//----------------------------------------------------------------------------------------------
//save (wgs84) shapefile to new shapefile (nad27) then create and return nad27 shapefile layer
//----------------------------------------------------------------------------------------------

// From Projection and To Projection set.
var proj4Projection = new ManagedProj4Projection();
proj4Projection.InternalProjectionParametersString = ManagedProj4Projection.GetWgs84ParametersString();
proj4Projection.ExternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(3501);

string sourceShapeFile = @"..\..\Data\wgs84.shp";
string targetShapeFile = @"..\..\Data\nad27.shp";
ShapeFileFeatureLayer.SaveToProjection(sourceShapeFile, targetShapeFile, proj4Projection, OverwriteMode.Overwrite);

//add new shapefile
var fLayer = new ShapeFileFeatureLayer(@"..\..\Data\nad27.shp");

 


Run the sample app, the point (united states.png) should display in the same location relative to streets for both X/Y and Lat/Lon map modes controled by the combo box.


I appreciate any help you can provide on this.


Thank you,  Rod



001_LatLonToXYSample.zip (70.8 KB)

Thank you for looking at the sample Gary!  I look forward to your code fix and understanding how to do the re-project correctly.


Rod



Rod,


 I took your LatLonToXYSample and I modified and reduced it to the projection issue. Now, you can switch between WGS84 and StatePlane at any extent. It goes all the necessary projection conversions for all the features. It is pretty rough but it addresses the projection issue andI think that from there, you can keep going in your development. Thank you.



LatLonToXYSample_Val.zip (71.7 KB)

Thank you!  Your modifications to the sample  look to be exactly what was needed.

Rod,


 You are welcome. Let us know if you run into some other dificulties.



Val,  I have a question about the mouse coordinates displayed in your solution established by the following:


wpfMap1.MapTools.MouseCoordinate.MouseCoordinateType = MouseCoordinateType.Default;


What units are MouseCoordinateType.Default?   I would like to display the State Plane Feet values and

when using the updated coordinate pointShape.  ie


PointShape pointShape = new PointShape(-99.6787521, 35.5953650);


When hovering the mouse over the point in X/Y mode, I'm expecting a coordinate closer to (x=1,501,009.66 y=221,013.88)

The coordinate displayed for mouse cursor in your solution is (x=1,442,508 y=73,148)

 


 



Rod,


  All what the MouseCoordinateType of MapTools.MouseCoordinate does is to format the world X and Y values at the mouse move and place it in the botton right of the map. It does not do anything else. It does not do any projection etc. So, if your map is in decimal degrees, you can have MouseCoordinateType set to DegreesMinutesSeconds and it is going to format the X and Y nicely for you. If you have it as default, it just displayes as is without formatting which is what to use for maps in meters or feet.


Of course, if you want more control, you can write yourself the logic for that. For example, you can have your map in State Plane (feet or meters) and have the Lat/Long displayed at mouse move in a label if you apply the projection conversion to the X and Y. See the sample World Coordinates for an example on that wiki.thinkgeo.com/wiki/Map_Suite_Wp...oordinates


 Now if you are getting coordinate completely different from what you are expecting at the mouse move, this is a distinct problem and it is related to the projection itself. That would have to be addressed separately.


Thank you.



Thank you Val!  That is helpful information.  I've opened a support ticket for the other issue regarding getting the correct X/Y values from the projection.



Rod,


 You are welcome. Can you tell me what the ticket number is? So that it can be assigned to me since I am already familiar with your case. Thank you.


 



Yes - thank you for taking on the assignment of the ticket… it is Ticket#: 6667.  Attached to that ticket is the sample app you provided here in which I’ve added an additional feature/requirement of map rotation angle.

Rod,


 Ok. It is assigned to me. Thanks.