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
VectorLayer
andLabelLayer
or - 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 ofSystem.UInt32
type 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 beGeoAPI.Geometries.IGeometry
. It must not be assigned more than once.BusinessObjectAttributeAttribute
Assign this attribute to all other properties or fields relevant for query bySharpMap.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
.