NetTopologySuite.IO.Esri.Shapefile
1.2.0
Prefix Reserved
dotnet add package NetTopologySuite.IO.Esri.Shapefile --version 1.2.0
NuGet\Install-Package NetTopologySuite.IO.Esri.Shapefile -Version 1.2.0
<PackageReference Include="NetTopologySuite.IO.Esri.Shapefile" Version="1.2.0" />
paket add NetTopologySuite.IO.Esri.Shapefile --version 1.2.0
#r "nuget: NetTopologySuite.IO.Esri.Shapefile, 1.2.0"
// Install NetTopologySuite.IO.Esri.Shapefile as a Cake Addin #addin nuget:?package=NetTopologySuite.IO.Esri.Shapefile&version=1.2.0 // Install NetTopologySuite.IO.Esri.Shapefile as a Cake Tool #tool nuget:?package=NetTopologySuite.IO.Esri.Shapefile&version=1.2.0
NetTopologySuite.IO.Esri
This library provides forward-only readers and writers for Esri shapefiles.
DBF
Shapefile feature attributes are held in a dBASE format file (.dbf extension). Each attribute record
has a one-to-one relationship with the associated shape record. Classes whose name starts
with Dbf
(eg. DbfReader
) provide direct access to dBASE files.
using var dbf = new DbfReader(dbfPath);
foreach (var record in dbf)
{
foreach (var fieldName in record.GetNames())
{
Console.WriteLine($"{fieldName,10} {record[fieldName]}");
}
Console.WriteLine();
}
SHP
The main file (.shp extension) is a variable-record-length file in which each record describes
a shape with a list of its vertices. Classes whose name starts with Shp
(eg. ShpPointReader
)
provide direct access to main file.
foreach (var geometry in Shapefile.ReadAllGeometries(shpPath))
{
Console.WriteLine(geometry);
}
SHX
The index file (.shx extension) stores the offset and content length for each record in SHP file.
As there is no additional value, this file is ignored during reading shapefiles.
Writing SHX data is handled directly by ShpWriter
classes.
Shapefile
All three files described above form a shapefile. Unified access to shapefile triplet
is provided through classes whose name starts with Shapefile
(eg. ShapefilePointReader
).
Under the hood they are decorators wrapping Dbf
and Shp
classes.
Reading shapefiles using c# code
foreach (var feature in Shapefile.ReadAllFeatures(shpPath))
{
foreach (var attrName in feature.Attributes.GetNames())
{
Console.WriteLine($"{attrName,10}: {feature.Attributes[attrName]}");
}
Console.WriteLine($" SHAPE: {feature.Geometry}");
Console.WriteLine();
}
Writing shapefiles using c# code
The most common variant of writing shapefiles is to use Shapefile.WriteAllFeatures
method.
var features = new List<Feature>();
for (int i = 1; i < 5; i++)
{
var lineCoords = new List<CoordinateZ>
{
new CoordinateZ(i, i + 1, i),
new CoordinateZ(i, i, i),
new CoordinateZ(i + 1, i, i)
};
var line = new LineString(lineCoords.ToArray());
var mline = new MultiLineString(new LineString[] { line });
var attributes = new AttributesTable
{
{ "date", new DateTime(2000, 1, i + 1) },
{ "float", i * 0.1 },
{ "int", i },
{ "logical", i % 2 == 0 },
{ "text", i.ToString("0.00") }
};
var feature = new Feature(mline, attributes);
features.Add(feature);
}
Shapefile.WriteAllFeatures(features, shpPath);
The most efficient way to write large shapefiles is to use ShapefileWriter
class.
This variant should also be used when you need to write a shapefile with a attributes containing null
values.
var fields = new List<DbfField>();
var dateField = fields.AddDateField("date");
var floatField = fields.AddFloatField("float");
var intField = fields.AddNumericInt32Field("int");
var logicalField = fields.AddLogicalField("logical");
var textField = fields.AddCharacterField("text");
var options = new ShapefileWriterOptions(ShapeType.PolyLine, fields.ToArray());
using (var shpWriter = Shapefile.OpenWrite(shpPath, options))
{
for (var i = 1; i < 5; i++)
{
var lineCoords = new List<Coordinate>
{
new(i, i + 1),
new(i, i),
new(i + 1, i)
};
var line = new LineString(lineCoords.ToArray());
var mline = new MultiLineString(new LineString[] { line });
int? nullIntValue = null;
shpWriter.Geometry = mline;
dateField.DateValue = DateTime.Now;
floatField.NumericValue = i * 0.1;
intField.NumericValue = nullIntValue;
logicalField.LogicalValue = i % 2 == 0;
textField.StringValue = i.ToString("0.00");
shpWriter.Write();
}
}
Encoding
The .NET Framework supports a large number of character encodings and code pages. On the other hand, .NET Core only supports limited list of encodings. To retrieve an encoding that is present in the .NET Framework on the Windows desktop but not in .NET Core, you need to do the following:
- Add to your project reference to to the System.Text.Encoding.CodePages.dll.
- Put the following line somewhere in your code:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Install using NuGet package manager
Stable releases are hosted on the default NuGet feed. You can install them using the following command on the package manager command line
PM> NuGet\Install-Package NetTopologySuite.IO.Esri.Shapefile
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- NetTopologySuite (>= 2.0.0)
- NetTopologySuite.Features (>= 2.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.