ThinkGeo.com    |     Documentation    |     Premium Support

ESRI shp is not displayed

Hello,


I've tried to load some of my shp files created with ESRI ArcMap with MapSuiteWPF but nothing is displayed. Here my code:




private void Window_Loaded(object sender, RoutedEventArgs e)

        {

            // Set the Map Unit. The reason for setting it to DecimalDegrees is that is what the shapefile’s unit of measure is inherently in.

            Map1.MapUnit = GeographyUnit.DecimalDegree;


            ShapeFileFeatureSource.BuildIndexFile(@"D:\MapSuiteTest\Karten\FluesseBelgien.shp"); 

            // We create a new Layer and pass the path to a Shapefile into its constructor. 

            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"D:\MapSuiteTest\Karten\FluesseBelgien.shp");
            // Set the worldLayer with a preset Style, as AreaStyles.Country1 has YellowGreen background and black border, our worldLayer will have the same render style.  

            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            // This setting will apply from ZoonLevel01 to ZoomLevel20, that means we can see the world the same style with ZoomLevel01 all the time no matter how far we zoom out/in. 

            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            // Create a new Layer Overlay to hold the layer we just created

            LayerOverlay layerOverlay = new LayerOverlay();
            // Add a background Layer

            layerOverlay.Layers.Add(new BackgroundLayer(new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)));

            // Add the shapefile layer to the layer overlay

            layerOverlay.Layers.Add(worldLayer);
            // We need to add the layerOverlay to map.

            Map1.Overlays.Add(layerOverlay);
            // Set a proper extent for the Map.  

            //Map1.CurrentExtent = new RectangleShape(0, 78, 30, 26);
            // We now need to call the Refresh() method of the Map control so that the Map can redraw based on the data that has been provided.

            Map1.Refresh();

        }



The shp file I want to display is attached.


Any idea what's goining wrong?


 


Thanks in advance.



FluesseBelgien.zip (26.7 KB)

Hi Peter,


Thank you for using our product, in your post, the shape file type is Polyline and you just set the AreaStyle, so it will not show up, please change the code to :



            Map1.MapUnit = GeographyUnit.DecimalDegree;

            ShapeFileFeatureSource.BuildIndexFile(@"FluesseBelgien.shp");
            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"FluesseBelgien.shp");
            worldLayer.Open();
            //type is Polyline.
            ShapeFileType type = worldLayer.GetShapeFileType();
            //set line style.
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.Canal1;
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            LayerOverlay layerOverlay = new LayerOverlay();
            layerOverlay.Layers.Add(new BackgroundLayer(new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)));
            layerOverlay.Layers.Add(worldLayer);
            Map1.Overlays.Add(layerOverlay);
            //set the current extent
            Map1.CurrentExtent = worldLayer.GetBoundingBox();
            Map1.Refresh();

and it will show the lines,



Regards,


Edgar



Frist of all thank you for the fast and very good reply. 
  
 What do i have to change to display a polygon shape apart from the AreaStyle?  
  
 worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1; 
  
 Thanks,  
 Peter

If you want to display a polygon, the DefaultAreaStyle should be set, just like your code above, and if it’s a point, the DefatulPointStyle should be set, or you can use the advanced property “CustomStyles”, it can accept any style.  
  
 Thanks, 
  
 Edgar

I don’t know what’s goining wrong but my polygon shape isn’t displayed.  
 You can find my shape here: zeta-uploader.com/445726994 
  
 And here my code: 
             ShapeFileFeatureSource.BuildIndexFile(@“D:\MapSuiteTest\Karten\NetzeHSP.shp”);
            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@“D:\MapSuiteTest\Karten\NetzeHSP.shp”);
            worldLayer.Open();
            //type is Polyline.
            ShapeFileType type = worldLayer.GetShapeFileType();
            //set line style.
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.Canal1;
            //worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            LayerOverlay layerOverlay = new LayerOverlay();
            layerOverlay.Layers.Add(new BackgroundLayer(new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)));
            layerOverlay.Layers.Add(worldLayer);
            Map1.Overlays.Add(layerOverlay);
            //set the current extent
            Map1.CurrentExtent = worldLayer.GetBoundingBox();
            Map1.Refresh(); 


 There are 2 errors in your code,


1. Don't comment out the line which you set the DefaultAreaStyle, like I said in my last reply.
2. The shape file has a .prj file, that means the shape file is under another projection, so we need to set the projection to display it.
 
Here is the code I modified:

            Map1.MapUnit = GeographyUnit.DecimalDegree;
            ShapeFileFeatureSource.BuildIndexFile(@"NetzeHSP.shp");
            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"NetzeHSP.shp");
            worldLayer.Open();

            ManagedProj4Projection proj = new ManagedProj4Projection();
            //the string is from the .prj file.
            proj.InternalProjectionParametersString = Proj4Projection.ConvertPrjToProj4("PROJCS[\"Germany_Zone_3\",GEOGCS[\"GCS_Deutsches_Hauptdreiecksnetz\",DATUM[\"D_Deutsches_Hauptdreiecksnetz\",SPHEROID[\"Bessel_1841\",6377397.155,299.1528128]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",3500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",9.0],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]");
            proj.ExternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(4326);
            proj.Open();
            worldLayer.FeatureSource.Projection = proj;
           
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            LayerOverlay layerOverlay = new LayerOverlay();
            layerOverlay.Layers.Add(new BackgroundLayer(new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)));
            layerOverlay.Layers.Add(worldLayer);
            Map1.Overlays.Add(layerOverlay);
            //set the current extent
            Map1.CurrentExtent = worldLayer.GetBoundingBox();
            Map1.Refresh();

and the result is:

 
Hope it helps,
 
Edgar

Now it is working. Thanks a lot!

You’re welcome, please let us know if you have any questions. 
  
 Regards. 
 Edgar

Hello Edgar,



you wrote this line of code:



proj.ExternalProjectionParametersString = ManagedProj4Projection.GetEpsgParametersString(4326);



From where did you get the number 4326? Is there a method which gives you this number?



Regards 

Daniel


Hi Daniel,



EPSG code 4326 is a most common coordinate system, be known as decimal degree. So the ManagedProj4Projection.GetEpsgParametersString(4326); can also be replace by 
ManagedProj4Projection.GetDecimalDegreesParametersString(); 



Except 4326, some other famous epsg code like 3857 who’s coordinate system is built on SphericalMercator projection. for more details about the epsg, please refer to epsg.io or spatialreference.org/



As for some map suite projection class like ManagedProj4Projection, they are used to do the projection conversion to make sure all the layer are at the same coordinate system.
If any questions on the projection, please feel free to let us know.



Thanks,
Troy