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 ofSystem.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 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>publicclassPointOfInterest{/// <summary>/// Gets or sets a value indicating the unique identifier/// </summary>[BusinessObjectIdentifier()]publicuintID{get;set;}/// <summary>/// Gets or sets a value indicating the geometry/// </summary>[BusinessObjectGeometry()]publicIGeometryGeometry{get;set;}/// <summary>/// Gets or sets a value indicating the kind of PoI/// </summary>[BusinessObjectAttribute()]publicstringKind{get;set;}/// <summary>/// Gets or sets a value indicating the address of the PoI/// </summary>[BusinessObjectAttribute()]publicstringAddress{get;set;}/// <summary>/// Gets or sets a value indicating some comments associated with the PoI/// </summary>[BusinessObjectAttribute(AllowNull=true)]publicList<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 itemsvarpoiSource=newInMemoryBusinessObjectSource<PointOfInterest>();poiSource.Insert(pois);// Create providervarpoiProvider=newBusinessObjectProvider<PointOfInterest>(poiSource);You can simply use your provider along with a standard Vector- and/or LabelLayer.
varvl=newVectorLayer(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.