📄 ntsprovider.cs
字号:
// Copyright 2006 - Diego Guidi
//
// This file is part of NtsProvider.
// NtsProvider is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// SharpMap is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
// You should have received a copy of the GNU Lesser General Public License
// along with NtsProvider; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Diagnostics;
using System.Globalization;
using System.Text;
using SharpMap.Converters.NTS;
namespace SharpMap.Data.Providers
{
/// <summary>
/// The NtsProvider enables you to feed any SharpMap datasource through the <a href="http://sourceforge.net/projects/nts">NetTopologySuite</a>
/// geometry using any NTS operation.
/// </summary>
/// <remarks>
/// The following example shows how to apply buffers to a shapefile-based river-dataset:
/// <code lang="C#">
/// public void InitializeMap(SharpMap.Map map)
/// {
/// //Create Shapefile datasource
/// SharpMap.Data.Providers.ShapeFile shp = new SharpMap.Data.Providers.ShapeFile("rivers.shp", true);
/// //Create NTS Datasource that gets its data from 'shp' and calls 'NtsOperation' that defines a geoprocessing method
/// SharpMap.Data.Providers.NtsProvider nts = new SharpMap.Data.Providers.NtsProvider(shp,new SharpMap.Data.Providers.NtsProvider.GeometryOperationDelegate(NtsOperation));
/// //Create the layer for rendering
/// SharpMap.Layers.VectorLayer layRivers = new SharpMap.Layers.VectorLayer("Rivers");
/// layRivers.DataSource = nts;
/// layRivers.Style.Fill = Brushes.Blue;
/// map.Layers.Add(layRivers);
/// }
/// //Define geoprocessing delegate that buffers all geometries with a distance of 0.5 mapunits
/// public static void NtsOperation(List<GisSharpBlog.NetTopologySuite.Features.Feature> geoms)
/// {
/// foreach (GisSharpBlog.NetTopologySuite.Features.Feature f in geoms)
/// f.Geometry = f.Geometry.Buffer(0.5);
/// }
/// </code>
/// </remarks>
public class NtsProvider : IProvider
{
/// <summary>
/// Defines a geometry operation that will be applied to all geometries in <see cref="NtsProvider"/>.
/// </summary>
/// <param name="features"></param>
public delegate void GeometryOperationDelegate(List<GisSharpBlog.NetTopologySuite.Features.Feature> features);
#region Fields
// Factory for NTS features
private GisSharpBlog.NetTopologySuite.Geometries.GeometryFactory geometryFactory = null;
// NTS features
private List<GisSharpBlog.NetTopologySuite.Features.Feature> features = null;
#endregion
#region Constructor
/// <summary>
/// Initializes a new instance of the <see cref="T:NtsProvider"/> class
/// using a default <see cref="GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel"/>
/// with Floating precision.
/// </summary>
protected internal NtsProvider() : this(new GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel()) { }
/// <summary>
/// Initializes a new instance of the <see cref="T:NtsProvider"/> class
/// using the given <paramref name="precisionModel"/>.
/// </summary>
/// <param name="precisionModel">
/// The <see cref="GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel"/>
/// to use for define the precision of the geometry operations.
/// </param>
/// <seealso cref="GisSharpBlog.NetTopologySuite.Geometries.PrecisionModels"/>
/// <seealso cref="GisSharpBlog.NetTopologySuite.Geometries.GeometryFactory"/>
protected internal NtsProvider(GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel precisionModel)
{
geometryFactory = new GisSharpBlog.NetTopologySuite.Geometries.GeometryFactory(precisionModel);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:NtsProvider"/> class
/// from another <see cref="SharpMap.Data.Providers.IProvider" />.
/// </summary>
/// <param name="provider">
/// The base <see cref="SharpMap.Data.Providers.IProvider"/>
/// from witch initialize the <see cref="NtsProvider"/> instance.
/// </param>
public NtsProvider(SharpMap.Data.Providers.IProvider provider) : this()
{
BuildFromProvider(provider);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:NtsProvider"/> class
/// from another <see cref="SharpMap.Data.Providers.IProvider" />.
/// </summary>
/// <param name="provider">
/// The base <see cref="SharpMap.Data.Providers.IProvider"/>
/// from witch initialize the <see cref="NtsProvider"/> instance.
/// </param>
/// <param name="precisionModel">
/// The <see cref="GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel"/>
/// to use for define the precision of the geometry operations.
/// </param>
/// <seealso cref="GisSharpBlog.NetTopologySuite.Geometries.PrecisionModels"/>
/// <seealso cref="GisSharpBlog.NetTopologySuite.Geometries.GeometryFactory"/>
public NtsProvider(SharpMap.Data.Providers.IProvider provider,
GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel precisionModel) : this(precisionModel)
{
BuildFromProvider(provider);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:NtsProvider"/> class
/// from another <see cref="SharpMap.Data.Providers.IProvider" />.
/// </summary>
/// <param name="provider">
/// The base <see cref="SharpMap.Data.Providers.IProvider"/>
/// from witch initialize the <see cref="NtsProvider"/> instance.
/// </param>
/// <param name="operation">
/// The <see cref="GeometryOperationDelegate"/> to apply
/// to all geometry elements in the <paramref name="provider"/>.
/// </param>
public NtsProvider(SharpMap.Data.Providers.IProvider provider, GeometryOperationDelegate operation) : this(provider)
{
operation(features);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:NtsProvider"/> class
/// from another <see cref="SharpMap.Data.Providers.IProvider" />.
/// </summary>
/// <param name="provider">
/// The base <see cref="SharpMap.Data.Providers.IProvider"/>
/// from witch initialize the <see cref="NtsProvider"/> instance.
/// </param>
/// <param name="operation">
/// The <see cref="GeometryOperationDelegate"/> to apply
/// to all geometry elements in the <paramref name="provider"/>.
/// </param>
/// <param name="precisionModel">
/// The <see cref="GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel"/>
/// to use for define the precision of the geometry operations.
/// </param>
/// <seealso cref="GisSharpBlog.NetTopologySuite.Geometries.PrecisionModels"/>
/// <seealso cref="GisSharpBlog.NetTopologySuite.Geometries.GeometryFactory"/>
public NtsProvider(SharpMap.Data.Providers.IProvider provider, GeometryOperationDelegate operation,
GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel precisionModel) : this(provider, precisionModel)
{
operation(features);
}
/// <summary>
/// Builds from the given provider.
/// </summary>
/// <param name="provider">
/// The base <see cref="SharpMap.Data.Providers.IProvider"/>
/// from witch initialize the <see cref="NtsProvider"/> instance.
/// </param>
private void BuildFromProvider(SharpMap.Data.Providers.IProvider provider)
{
// Features list initialization
features = new List<GisSharpBlog.NetTopologySuite.Features.Feature>(provider.GetFeatureCount());
try
{
// Load all features from the given provider
provider.Open();
Collection<uint> ids = provider.GetObjectIDsInView(provider.GetExtents());
foreach (uint id in ids)
{
SharpMap.Data.FeatureDataRow dataRow = provider.GetFeature(id);
GisSharpBlog.NetTopologySuite.Geometries.Geometry geometry = GeometryConverter.ToNTSGeometry(dataRow.Geometry, geometryFactory);
GisSharpBlog.NetTopologySuite.Features.AttributesTable attributes = new GisSharpBlog.NetTopologySuite.Features.AttributesTable();
foreach (DataColumn column in dataRow.Table.Columns)
{
if (dataRow[column] == null || dataRow[column].GetType() == typeof(System.DBNull))
throw new ApplicationException("Null values not supported");
attributes.AddAttribute(column.ColumnName, dataRow[column]);
}
features.Add(new GisSharpBlog.NetTopologySuite.Features.Feature(geometry, attributes));
}
}
finally
{
if (provider.IsOpen)
provider.Close();
}
}
#endregion
#region IProvider Members
/// <summary>
/// Returns the data associated with all the geometries that is within 'distance' of 'geom'
/// </summary>
/// <param name="geom"></param>
/// <param name="distance"></param>
/// <returns></returns>
[Obsolete("Use ExecuteIntersectionQuery instead")]
public SharpMap.Data.FeatureDataTable QueryFeatures(SharpMap.Geometries.Geometry geom, double distance)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -