[GIS] How to show only some labels sharpmap

labelingsharpmap

I am new to Sharpmap and GIS. Going through the sample code and building simple programs for better understanding. I have a water bodies layer. I want to display only a particular river. I used CustomTheme. How to show label for only this river.

To display a river (named Ganga), I have written following code.

SharpMap.Data.Providers.ShapeFile shapeFileProvider = new SharpMap.Data.Providers.ShapeFile(@"C:\water.shp", false);
SharpMap.Layers.VectorLayer waterLayer = new SharpMap.Layers.VectorLayer("Water", shapeFileProvider);

SharpMap.Rendering.Thematics.CustomTheme waterTheme = new  SharpMap.Rendering.Thematics.CustomTheme(GetWaterStyle);
waterLayer.Theme = waterTheme;
mapBox1.Map.Layers.Add(waterLayer);

The GetWaterStyle method:

private SharpMap.Styles.VectorStyle GetWaterStyle(SharpMap.Data.FeatureDataRow row)
{
    SharpMap.Styles.VectorStyle style = new SharpMap.Styles.VectorStyle();
    if (row["NAME"].ToString().Equals("Ganga"))
    {
        style.Fill = Brushes.Aqua;
        return style;
    }
    else
        return null;
}

Now I want to show a label "Ganga" (the river name) as well. How to approach?

Please help.

Thanks and regards,
Abhi

Best Answer

You can do something like this:

    //Proivder for labels only fetching one river
    SharpMap.Data.Providers.ShapeFile shapeFileProviderLabels = new SharpMap.Data.Providers.ShapeFile(@"rivers.shp", false);
    shapeFileProviderLabels.FilterDelegate += new SharpMap.Data.Providers.FilterProvider.FilterMethod(delegate(FeatureDataRow row) { return row["NAME"] as string == "Ganga"; });
    int cnt = shapeFileProviderLabels.GetFeatureCount();

    SharpMap.Layers.VectorLayer waterLayer = new SharpMap.Layers.VectorLayer("Water", shapeFileProvider);

    //Layer for labels
    SharpMap.Layers.LabelLayer waterLabels = new SharpMap.Layers.LabelLayer("Water_Labels");
    waterLabels.LabelColumn = "NAME";
    waterLabels.DataSource = shapeFileProviderLabels;

    mapBox1.Map.Layers.Add(waterLayer);
    mapBox1.Map.Layers.Add(waterLabels);

There has been an bug/issue with the FilterDelegate of ShapeFile provider in SharpMap, this is fixed and included in SharpMap 1.0 RC1 that is newly released

Related Question