ThinkGeo.com    |     Documentation    |     Premium Support

OpenStreetMap

Hi,


I'm new with all GIS, and I'm evaluating the WMS with OSM. I already download the shp for OSM and modify the GetMapConfiguratrionCore() to the following



string worldLayerFilePath = Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName + Path.DirectorySeparatorChar + "SampleData" + Path.DirectorySeparatorChar + "adminareas_lvl06.shp";


// Create the world layer from a shapefile and add a style to it

ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(worldLayerFilePath);

worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;

worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


// Create a MapConfiguration and add the layer to it

MapConfiguration mapConfiguration = new MapConfiguration();

mapConfiguration.Layers.Add("boundary", worldLayer);


return mapConfiguration;


and my Page_Load()



Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));

Map1.CurrentExtent = new RectangleShape(-131.22, 55.05, -54.03, 16.91);

Map1.MapUnit = GeographyUnit.DecimalDegree;

 


PointShape pointInEquator = new PointShape(double.Parse("0", CultureInfo.InvariantCulture), double.Parse("0", CultureInfo.InvariantCulture));

EllipseShape cir = new EllipseShape(pointInEquator, 100, 100, Map1.MapUnit, DistanceUnit.Mile);

cir.TranslateByOffset(double.Parse("-95.28109"), double.Parse("38.95363"));


Map1.EditOverlay.Features.Add(new Feature(cir));


WmsOverlay wmsOverlay = new WmsOverlay("WMS Overlay");

wmsOverlay.Parameters.Add("LAYERS", "Display A Simple Map");

wmsOverlay.Parameters.Add("STYLES", "DEFAULT");


wmsOverlay.ServerUris.Add(new Uri("localhost:62626/WmsHandler.axd"));

Map1.CustomOverlays.Add(wmsOverlay);


When I run the projects, I got pink tiles.  Not sure what is the problem or something that I missed.



Thanks



VQV




Hi Vinh,  
  
 You are on the right track but there might some information missing from your Plugin code. 
  
 In our QuickStart Sample we set the name of the 'WMS Layer" to “Display A Simple Map” in the GetNameCore() code.  
  
 If you are calling: 
  
 wmsOverlay.Parameters.Add(“LAYERS”, “Display A Simple Map”); 
  
 be sure you have this name associated with name of the Layer in the Plugin. 
 I do not see where you are setting this in your PlugIn code. 
  
 Also are you able to see the WMS Server Admin page?

Hi,


So I modify the GetMapConfigurationCore as below and I still get the pink tite, and yes, I do see the admin page.


protected override MapConfiguration GetMapConfigurationCore(string style, string crs)

        {

            // Get the directory to the sample data

            string worldLayerFilePath = Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName + Path.DirectorySeparatorChar + "SampleData" + Path.DirectorySeparatorChar + "adminareas_lvl06.shp";


            // Create the world layer from a shapefile and add a style to it

            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(worldLayerFilePath);

            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;

            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


            // Create a MapConfiguration and add the layer to it

            MapConfiguration mapConfiguration = new MapConfiguration();

            mapConfiguration.Layers.Add("LAYERS", worldLayer);


            return mapConfiguration;

        }



Thanks for this code, but the GetMapConfigurationCore is not where the change needs to be made.


The following code is from the DisplayASimplyMapWmsLayerPlugin. You can see that we have a GetNameCore() method that sets that name of the Layer that the WMS server will expose to the client:



protected override MapConfiguration GetMapConfigurationCore(string style, string crs)
        {
            // Get the directory to the sample data
            string worldLayerFilePath = Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName + Path.DirectorySeparatorChar + "SampleData" + Path.DirectorySeparatorChar + "Countries02.shp";

            // Create the world layer from a shapefile and add a style to it
            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(worldLayerFilePath);
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            // Create a MapConfiguration and add the layer to it
            MapConfiguration mapConfiguration = new MapConfiguration();           
            mapConfiguration.Layers.Add("WorldLayer", worldLayer);

            return mapConfiguration;
        }

        // In this method you need to return the name of the Layer that WMS will expose.
        // You will use this name on the client to specify the layer you want to consume
        protected override string GetNameCore()
        {
            return "Display A Simple Map";
        }


 


If you are inheriting from the WmsLayerPlugin there are required methods that must be set and this includes the GetNameCore() method.


I would highly recommend reviewing the DisplayASimpleMapWmsLayerPlugin included in the Sample Applications to see if you have all the required elements for a WMSPlugin.



Yes, I understand it, but if you pay close attention, you will see in my code that I'm trying to read data from the file adminareas_lvl06.shp.  So I replace the "Contries02.shp" with "adminareas_lvl06.shp".  And when the page load, I got pink title, so I thought I have the replace the "WorldLayers" with "boundary" in order for the WMS to pick up the layer name "boundary" from the adminareas_lvl06.shp file.


So, basically, I'm stuck and not sure what I need to do to display the map from adminareas_lvl06.shp.


Thanks


 



Can you attach your plugin code to this thread? 
  
 We need to verify that you have the GetNameCore() specified. 
 Also can you supply a screenshot showing the Admin Page?

using System;

using System.Collections.ObjectModel;

using System.IO;

using ThinkGeo.MapSuite.Core;

using ThinkGeo.MapSuite.WmsServerEdition;


namespace WmsPlugins

{

    public class DisplayASimpleMapWmsLayerPlugin : WmsLayerPlugin

    {

        public DisplayASimpleMapWmsLayerPlugin()

        {

            this.WmsQueryMode = ThinkGeo.MapSuite.WmsServerEdition.WmsQueryMode.Queryable;

        }


        // This method is only called once per style and crs.  In it you should create your

        // layers and add them to the MapConfiguration.  If you want to use tile caching you

        // can also specif that in the MapConfiguration under the TileCache property.

        // If you have setup multiple styles or projections this method will get called for

        // each unique combination

       protected override MapConfiguration GetMapConfigurationCore(string style, string crs) 

       { 

           // Get the directory to the sample data 

           string worldLayerFilePath = Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName + Path.DirectorySeparatorChar + "SampleData" + Path.DirectorySeparatorChar + "adminareas_lvl06.shp"; 

           // Create the world layer from a shapefile and add a style to it 

           ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(worldLayerFilePath); 

           worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1; 

           worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 

           // Create a MapConfiguration and add the layer to it 

           MapConfiguration mapConfiguration = new MapConfiguration(); 

           mapConfiguration.Layers.Add("WorldLayer", worldLayer); 

           return mapConfiguration; } 

        

        // In this method you need to return the name of the Layer that WMS will expose.

        // You will use this name on the client to specify the layer you want to consume

        protected override string GetNameCore()

        {

            return "Display A Simple Map";

        }


        // In this method you need to return the projections that are supported by your data.

        // It is your responsability to project the data in the MapConfiguration for each projection

        // type you specify here.

        protected override Collection<string></string> GetProjectionsCore()

        {

            return new Collection<string></string> { "EPSG:4326" };

        }


        // In this method you need to return the bounding box of the layer.

        protected override RectangleShape GetBoundingBoxCore(string crs)

        {

            return new RectangleShape(-126.826171875, 57.104766845702, -70.83984375, 18.960235595702);

        }

    }

}

 



The issue is with the shapefile as it does not have the required spatial indexes.


If you check the files that you downloaded you will see that you have the following: 

adminareas_lvl06.cpg

adminareas_lvl06.dbf

adminareas_lvl06.prj

adminareas_lvl06.shp

adminareas_lvl06.shx



The WMS server requires the ThinkGeo Spatial Index files also be present.

adminareas_lvl06.ids

adminareas_lvl06.idx



These can be created by running the following code: 



ShapeFileFeatureSource.BuildIndexFile(worldLayerFilePath);


Note this line only needs to be run one time as the files only need to be created once. You would only need to run this again if you changed the contents of the shapefile.



Wow, wonderful, I was able to see the map but doesn't matter what is the zoom level, I can't see the name such as county name if I use for the file tl_2009_us_county.shp


Thanks


VV



Hi Vinh,


The reason you can see the map at all ZoomLevels is that the default code is setup to show that shapefile from ZoomLevel01 all the way to ZoomLevel20. You will need to modify this code to fit your applications needs.


For an example of setting up different Layers to display at different ZoomLevels I recommend checking out the Web Edition Sample Applications - Feature Layers Section - Display Layers at Different Scales sample.


If you need to setup labels for a Layer you will need to setup a TextStyle. For examples of this please see Web Edition Sample Applications - Labeling Section.



You can access the Web Edition samples here: websamples.thinkgeo.com/



(edited)


Hi again,


So I try to modify my worldLayer to add textstyles.county1 but it's required a column name, where do I go and find that?


Thanks


I got it


 


worldLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle =TextStyles.County1("Name");



Hello Vinh, 
  
 That column name is what you want to show as label, you can open the adminareas_lvl06.dbf with some tools(like excel) to check the columns in it and choose one you want. 
  
 Regards, 
  
 Gary