Создание новых слоев в SHARPMAP - PullRequest
3 голосов
/ 07 марта 2012

Я работаю над точными картами. Скажите, у меня есть карта США, как добавить новые слои поверх карт?

Поскольку мне нужно написать название штата поверх основного слоя и закрасить каждое состояние разными цветами. Можно ли достичь этой цели в Sharpmaps ...?

Ответы [ 2 ]

5 голосов
/ 29 ноября 2012

Вы должны использовать «custom them» для цвета каждого состояния и «layer label» для имени состояния.

Сначала необходимо определить один метод делегата define. Делегат принимает FeatureDataRow в качестве параметра, и вы можете обрабатыватьпользовательский стиль

, например

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;
        default:
            break;
    }
    //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;
}

, а затем установите для этого свойства свойства Theme вашего слоя

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

, а для метки Layer вы должны создать новый слой как LabelLayerНапример, определите

//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
myMap.Layers.Add(layRoads);
//Add label layer to map
myMap.Layers.Add(layRoadLabel); 

, сообщает все здесь

0 голосов
/ 17 апреля 2012

Я не думаю, что это возможно в точечных картах.

Однако в c # это может быть достигнуто путем сопоставления координат государственных границ.

...