MapPiloteGeopackageHelper 1.2.2

dotnet add package MapPiloteGeopackageHelper --version 1.2.2
                    
NuGet\Install-Package MapPiloteGeopackageHelper -Version 1.2.2
                    
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.2.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MapPiloteGeopackageHelper" Version="1.2.2" />
                    
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.2.2
                    
#r "nuget: MapPiloteGeopackageHelper, 1.2.2"
                    
#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.2.2
                    
#: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.2.2
                    
Install as a Cake Addin
#tool nuget:?package=MapPiloteGeopackageHelper&version=1.2.2
                    
Install as a Cake Tool

MapPiloteGeopackageHelper

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

Latest Release: v1.2.2 - Fixed ORDER BY clause in ReadFeaturesAsync (ASC/DESC sorting now works correctly)

Note that in version 1.2.1 I have split the repository on github into two, hope it simplifies understanding:

Quick Start - Modern Fluent API

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

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

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

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

// Query with async streaming and ORDER BY support
await foreach (var city in layer.ReadFeaturesAsync(
    new ReadOptions(
        WhereClause: "population > 100000", 
        OrderBy: "population DESC",  // ? Fixed in v1.2.2
        Limit: 10)))
{
    Console.WriteLine($"City: {city.Attributes["name"]} - {city.Attributes["population"]} people");
}

// Count and delete operations
var count = await layer.CountAsync("population < 50000");
var deleted = await layer.DeleteAsync("population < 10000");

WAL Mode Support (New!)

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 with default SRID (3006)
CMPGeopackageCreateHelper.CreateGeoPackage("data.gpkg", walMode: true);

// Backward compatible - existing code continues to work
CMPGeopackageCreateHelper.CreateGeoPackage("data.gpkg", 3006);

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

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)

API Comparison

// One-liner with progress and options
using var gp = await GeoPackage.OpenAsync("data.gpkg");
var layer = await gp.EnsureLayerAsync("places", schema);
await layer.BulkInsertAsync(features, options, progress);

Traditional API (Still Supported)

// Multi-step process with optional WAL mode
CMPGeopackageCreateHelper.CreateGeoPackage(path, srid, walMode: true);
GeopackageLayerCreateHelper.CreateGeopackageLayer(path, name, schema);
CGeopackageAddDataHelper.BulkInsertFeatures(path, name, features);

Available CreateGeoPackage Overloads

// Basic creation
CMPGeopackageCreateHelper.CreateGeoPackage("path.gpkg");

// With custom SRID
CMPGeopackageCreateHelper.CreateGeoPackage("path.gpkg", srid: 4326);

// With status callback
CMPGeopackageCreateHelper.CreateGeoPackage("path.gpkg", onStatus: Console.WriteLine);

// With SRID and callback
CMPGeopackageCreateHelper.CreateGeoPackage("path.gpkg", 4326, Console.WriteLine);

// With WAL mode (default SRID)
CMPGeopackageCreateHelper.CreateGeoPackage("path.gpkg", walMode: true);

// Full control: SRID + WAL + callback
CMPGeopackageCreateHelper.CreateGeoPackage("path.gpkg", 4326, true, Console.WriteLine);

Version History

v1.2.2 (Latest)

  • 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)

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

Getting Started

  1. Install: dotnet add package MapPiloteGeopackageHelper
  2. Explore: Check out FluentApiExample project
  3. Inspect: Use MapPiloteGeopackageHelperSchemaBrowser for unknown files
  4. Learn: Traditional patterns in MapPiloteGeopackageHelperHelloWorld

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

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 was computed.  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.2.2 167 10/15/2025
1.2.1 168 10/1/2025
1.2.0 173 9/11/2025
1.1.1 185 9/4/2025
1.1.0 181 9/4/2025
1.0.0 169 9/2/2025

Fixed ORDER BY clause in ReadFeaturesAsync - now properly supports ASC/DESC sorting