Creating new layers in SHARPMAP

I am working on sharpmaps. Let's say I have a US map, how do I add new layers above the maps?

How do I need to write the name of the state above the main layer and paint each state with different colors. Is it possible to achieve this goal in Sharpmaps ...?


source to share

2 answers

You must use "custom them" for the color of each state and "label layer" for the name of the state

First you need to define one delegate method. The delegate takes a FeatureDataRow parameter as a parameter and you can handle custom styling


private SharpMap.Styles.VectorStyle GetCountryStyle(SharpMap.Data.FeatureDataRow row)
    SharpMap.Styles.VectorStyle style = new SharpMap.Styles.VectorStyle();
    switch (row["NAME"].ToString().ToLower())
        case "denmark": //If country name is Danmark, fill it with green
            style.Fill = Brushes.Green;
            return style;
        case "united states": //If country name is USA, fill it with Blue and add a red outline
            style.Fill = Brushes.Blue;
            style.Outline = Pens.Red;
            return style;
        case "china": //If country name is China, fill it with red
            style.Fill = Brushes.Red;
            return style;
    //If country name starts with S make it yellow
    if (row["NAME"].ToString().StartsWith("S"))
        style.Fill = Brushes.Yellow;
        return style;
    // If geometry is a (multi)polygon and the area of the polygon is less than 30, make it cyan
    else if (row.Geometry is GeoAPI.Geometries.IPolygonal && row.Geometry.Area < 30)
        style.Fill = Brushes.Cyan;
        return style;
    else //None of the above -> Use the default style
        return null;


and then set the Theme property of your layer to this method

SharpMap.Rendering.Thematics.CustomTheme myTheme = new SharpMap.Rendering.Thematics.CustomTheme(GetCountryStyle);
myVectorLayer.Theme = myTheme ;


and for the label layer you should have a new layer defined by LabelLayer for example

//Name of table in database
string tablename = "Roads"; 
//Name of object ID column - MUST be integer!
string idColumn = "gid";

//Create layer
SharpMap.Layers.VectorLayer layRoads= new SharpMap.Layers.VectorLayer("Roads");
layRoads.DataSource = datasource;
//Set up a road label layer
SharpMap.Layers.LabelLayer layRoadLabel = new SharpMap.Layers.LabelLayer("Road labels");
//Set the datasource to that of layRoads.
layRoadLabel.DataSource = layRoads.DataSource;
layRoadLabel.Enabled = true;
//Specifiy field that contains the label string.
layRoadLabel.LabelColumn = "RoadOfName";

//Add layer to map
//Add label layer to map


reports everything here



I don't think this is possible in sharpmaps.

However, in C #, this can be achieved by mapping the coordinates of the state boundaries.



All Articles