OsmSharp enables you to work directly with OpenStreetMap (OSM) data in .NET. Most important features are:
- Read/Write OSM-XML.
- Read/Write OSM-PBF.
- Streamed architecture, minimal memory footprint.
- Convert a stream of native OSM objects to 'complete' OSM objects: Ways with all their actual nodes, Relations with all members instantiated.
- Convert OSM objects to geometries.
Check the documentation website for documentation and sample code. Don't hesitate to ask questions using an issue or request more documentation on any topic you need.
There are 5 sample projects in the samples
folder:
- Sample.CompleteStream: Convert Ways and Relation into objects with nodes and members instantiated.
- Sample.Filter: Filter data from an OSM file using LINQ.
- Sample.GeoFilter: Filter data using a bounding box or polygon.
- Sample.GeometryStream: Extract all power lines from an OSM file, convert them to linestring features and write to GeoJSON.
- Sample.GeometryStream.Shape: Extract all power lines from an OSM file, convert them to linestring features and write to a shapefile.
PM> Install-Package OsmSharp
There's also a package to use NTS together with OsmSharp to convert OSM-data to features/geometries.
PM> Install-Package OsmSharp.Geo
A really good way to get started is to have a look at the samples but we collected a few code-snippets for you here anyway:
A common usecase is to stream and filter OSM data. To read from an OSM file and enumerate all objects just open the file as a stream source and use foreach.
Read data from an OSM-PBF file:
using(var fileStream = new FileInfo(@"/path/to/some/osmfile.osm.pbf").OpenRead())
{
var source = new PBFOsmStreamSource(fileStream);
foreach (var element in source)
{
Console.WriteLine(element.ToString());
}
}
Write data to an OSM-PBF file:
using(var fileStream = new FileInfo(@"/path/to/my/osmfile.osm.pbf").OpenRead())
{
var target = new PBFOsmStreamTarget(fileStream);
target.Initialize();
target.AddNode(new Node()
{
Id = 1,
ChangeSetId = 1,
Latitude = 0,
Longitude = 0,
Tags = new TagsCollection(
Tag.Create("key", "value")),
TimeStamp = DateTime.Now,
UserId = 1424,
UserName = "you",
Version = 1,
Visible = true
});
target.Flush();
target.Close();
}
Filter an area and extract a smaller region:
var source = new PBFOsmStreamSource(
new FileInfo(@"/path/to/file.osm.pbf").OpenRead());
var filtered = source.FilterBox(6.238002777099609f, 49.72076145492323f,
6.272850036621093f, 49.69928180928878f); // left, top, right, bottom
using (var stream = new FileInfo(@"/path/to/filterede.osm.pbf").Open(FileMode.Create, FileAccess.ReadWrite))
{
var target = new PBFOsmStreamTarget(stream);
target.RegisterSource(filtered);
target.Pull();
}
The OsmSharp project is licensed under the MIT license.
This project includes some code from SharpZipLib, also MIT licensed.