MapPiloteGeopackageHelper 1.4.1

dotnet add package MapPiloteGeopackageHelper --version 1.4.1
                    
NuGet\Install-Package MapPiloteGeopackageHelper -Version 1.4.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MapPiloteGeopackageHelper" Version="1.4.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MapPiloteGeopackageHelper" Version="1.4.1" />
                    
Directory.Packages.props
<PackageReference Include="MapPiloteGeopackageHelper" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add MapPiloteGeopackageHelper --version 1.4.1
                    
#r "nuget: MapPiloteGeopackageHelper, 1.4.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package MapPiloteGeopackageHelper@1.4.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=MapPiloteGeopackageHelper&version=1.4.1
                    
Install as a Cake Addin
#tool nuget:?package=MapPiloteGeopackageHelper&version=1.4.1
                    
Install as a Cake Tool

MapPiloteGeopackageHelper

Modern .NET library for creating, reading, and bulk-loading GeoPackage (GPKG) data using SQLite and NetTopologySuite.

What This Library Does

  • Creates GeoPackages with required core tables
  • Creates layers (tables) with geometry + custom attribute columns
  • Bulk writes features with validation and progress tracking
  • Streams features back with filtering, sorting, and paging
  • Modern async patterns with cancellation support
  • Schema inspection and validation
  • Optional WAL mode for improved concurrency and performance

Quick Start - Modern Fluent API

// Create/open GeoPackage with fluent API
using var geoPackage = await GeoPackage.OpenAsync("data.gpkg", defaultSrid: 3006);

// Create layer with schema
var layer = await geoPackage.EnsureLayerAsync("cities", new Dictionary<string, string>
{
    ["name"] = "TEXT",
    ["population"] = "INTEGER"
});

// Create features with geometry
var features = new[]
{
    new FeatureRecord(
        new Point(674188, 6580251),  // Stockholm (SWEREF99 TM)
        new Dictionary<string, string?> { ["name"] = "Stockholm", ["population"] = "975000" }),
    new FeatureRecord(
        new Point(319178, 6399617),  // Gothenburg
        new Dictionary<string, string?> { ["name"] = "Gothenburg", ["population"] = "583000" })
};

// Bulk insert with validation and progress
var progress = new Progress<BulkProgress>(p => 
    Console.WriteLine($"Progress: {p.PercentComplete:F1}%"));

await layer.BulkInsertAsync(features, 
    new BulkInsertOptions(BatchSize: 1000, ValidateGeometryType: true),
    progress);

// Query and access both geometry and attributes
await foreach (var city in layer.ReadFeaturesAsync(
    new ReadOptions(WhereClause: "population > 100000", OrderBy: "population DESC")))
{
    var point = (Point)city.Geometry!;
    Console.WriteLine($"{city.Attributes["name"]}: {city.Attributes["population"]} people at ({point.X}, {point.Y})");
}

Modern Features

Feature Description Example
Async/Await Proper async support with CancellationToken await layer.BulkInsertAsync(...)
Fluent API Chain operations naturally GeoPackage.OpenAsync().EnsureLayerAsync()
Progress Reporting Track long-running operations IProgress<BulkProgress>
Options Objects Clean configuration, no parameter soup BulkInsertOptions(BatchSize: 1000)
Streaming IAsyncEnumerable for large datasets await foreach (var item in ...)
Rich Queries WHERE, LIMIT, ORDER BY support ReadOptions(OrderBy: "score DESC")
Conflict Handling Insert policies (Abort/Ignore/Replace) ConflictPolicy.Ignore
CRUD Operations Count, Delete with conditions await layer.DeleteAsync("status = 'old'")
WAL Mode Write-Ahead Logging for concurrency CreateGeoPackage(path, walMode: true)
Input Validation SQL injection protection and parameter validation Automatic identifier sanitization
Geometry Validation Optional strict geometry type checking new BulkInsertOptions(ValidateGeometryType: true)
QGIS Compatibility Auto-update gpkg_contents extents with buffer Automatic after inserts

WAL Mode Support

Enable WAL (Write-Ahead Logging) mode for better concurrency and performance:

// Create GeoPackage with WAL mode enabled
CMPGeopackageCreateHelper.CreateGeoPackage(
    "data.gpkg", 
    srid: 3006,
    walMode: true,
    onStatus: Console.WriteLine);

WAL Mode Benefits

  • Better Concurrency: Multiple readers can access the database while a writer is active
  • Improved Performance: Better performance for write-heavy workloads
  • Atomic Commits: Better crash recovery and data integrity
  • No Manual PRAGMA: No need to manually execute PRAGMA journal_mode = WAL

Getting Started

  1. Install: dotnet add package MapPiloteGeopackageHelper
  2. Explore: Check out the MapPiloteGeopackageHelperExamples repository for example projects
  3. Inspect: Use CMPGeopackageReadDataHelper.GetGeopackageInfo() to inspect unknown GeoPackage files
  4. Learn: Traditional API patterns are also available in the examples repository

Open the generated .gpkg files in QGIS, ArcGIS, or any GIS software!

Version History

v1.4.1

  • Improve geometry type validation and test output handling
  • Add geometry type validation to bulk inserts and fluent API (optional strict mode)
  • Auto-update layer extents in gpkg_contents for QGIS compatibility
  • Add comprehensive geometry type tests (all OGC types, validation, QGIS behavior)

v1.4.0

  • Security: Added SQL injection protection via identifier validation for table and column names
  • Robustness: Transaction rollback on failure in bulk insert operations
  • Robustness: Input validation for BatchSize, SRID, Limit, and Offset parameters
  • Fixed: SetupSpatialReferenceSystem now properly uses the srid parameter instead of always inserting default SRIDs
  • Fixed: CreateSpatialIndex option in BulkInsertOptions is now implemented
  • Improved: Centralized CreateGpkgBlob utility (removed duplicate implementations)
  • Improved: Streaming support in BulkInsertAsync - only materializes features when progress reporting is requested
  • Improved: Better exception handling with specific exception types instead of generic catch blocks
  • Documentation: Added comprehensive XML documentation to all public types and members
  • Documentation: XML documentation file now included in NuGet package

v1.3.1

  • Updated: Targeting .NET 10

v1.2.2

  • Fixed: ORDER BY clause in ReadFeaturesAsync now works correctly with both ASC and DESC
  • Test Coverage: Added comprehensive ORDER BY tests

v1.2.1

  • Added: WAL mode support for better concurrency
  • Split: Repository separated from examples for clarity

v1.2.0

  • Added: Modern Fluent API with async/await support
  • Added: Progress reporting for bulk operations
  • Added: Rich query options (WHERE, LIMIT, OFFSET, ORDER BY)

Support & Sustainability

MapPiloteGeopackageHelper is an open-source .NET library for working with GeoPackage data, maintained by a single developer in spare time.

If you use this library in professional, commercial, or public-sector projects, please consider supporting its continued maintenance and development.

Ways to support

  • ⭐ Star the repository to increase visibility
  • 💬 Report issues and suggest improvements
  • ❤️ Sponsor ongoing maintenance via GitHub Sponsors

Commercial support, consulting, and custom development are available for organizations using MapPiloteGeopackageHelper in production environments.

Sustainable open source enables better tools for everyone.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  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.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.4.1 251 12/19/2025
1.4.0 278 12/18/2025
1.3.1 437 12/9/2025
1.3.0 437 12/9/2025
1.2.2 207 10/15/2025
1.2.1 184 10/1/2025
1.2.0 189 9/11/2025
1.1.1 204 9/4/2025
1.1.0 201 9/4/2025
1.0.0 189 9/2/2025

v1.4.1: Bug fix - Layer extent now calculated from actual geometry data so QGIS "Zoom to Layer" works correctly. Added buffer around extent for better visualization.