With the help of this library you can use SharpMap with your business objects.
To achieve this you have to
- Prepare your business objects by decorating fields and properties with some attributes (BusinessObjectIdentifierAttribute,BusinessObjectGeometryAttribute,BusinessObjectAttributeAttribute)
- Create a IBusinessObjectSource<T>. There is an implementations for business objects you have in-memory (InMemoryBusinessObjectSource<T>) and example implementations for use with either MongoDB or Entity Framework 6. In the test project an example for using NHibernate is given, too.
- Set up a BusinessObjectProvider<T>based on the the business object source you created above.
- You can use that with
- the standard VectorLayerandLabelLayeror
- define a special BusinessObjectLayer<T>that allows for a specialIBusinessObjectRenderer<T>.
 
- the standard 
For your business objects you need to assign the following attributes:
- BusinessObjectIdentifierAttribute
 Assign this attribute to the property or field that is the unique identifier for the business object. It must be of- System.UInt32type and must not be assigned more than once.
- BusinessObjectGeometryAttribute
 Assign this attribute to the property or field that contains the spatial component of your business object. The type of the field must be- GeoAPI.Geometries.IGeometry. It must not be assigned more than once.
- BusinessObjectAttributeAttribute
 Assign this attribute to all other properties or fields relevant for query by- SharpMap.Layers.ICanQueryLayer.ExecuteIntersectionQuery
As an example have a look at this simple point of interest class:
/// <summary>
/// A simple point of interest class
/// </summary>
public class PointOfInterest
{
    /// <summary>
    /// Gets or sets a value indicating the unique identifier
    /// </summary>
    [BusinessObjectIdentifier()]
    public uint ID { get; set; }
    /// <summary>
    /// Gets or sets a value indicating the geometry
    /// </summary>
    [BusinessObjectGeometry()]
    public IGeometry Geometry { get; set; }
    /// <summary>
    /// Gets or sets a value indicating the kind of PoI
    /// </summary>
    [BusinessObjectAttribute()]
    public string Kind { get; set; }
    /// <summary>
    /// Gets or sets a value indicating the address of the PoI
    /// </summary>
    [BusinessObjectAttribute()]
    public string Address { get; set; }
    /// <summary>
    /// Gets or sets a value indicating some comments associated with the PoI
    /// </summary>
    [BusinessObjectAttribute(AllowNull = true)]
    public List<string> Comments { get; set; }
}Continuing the previous example, we simply create an in in memory object source and build a provider for it.
IEnumerable<PointOfInterest> pois = ...;
// Create source and insert items
var poiSource = new InMemoryBusinessObjectSource<PointOfInterest>();
poiSource.Insert(pois);
// Create provider
var poiProvider = new BusinessObjectProvider<PointOfInterest>(poiSource);You can simply use your provider along with a standard Vector- and/or LabelLayer.
var vl = new VectorLayer(poiProvider.ConnectionID, poiProvider);Doing so, you have all styling and theming options you would have using those layers along with the standard data sources.
Using a BusinessObjectLayer<T> you can provide a custom IBusinessObjectRenderer<T> that has special knowledge on how to render the business objects.
An example for such a renderer is shown in the LinkWithLoad example.
Not providing a renderer has the same effect as using the VectorLayer.