Du kör en Shapefiles konvertering som har fungerat hundra gånger, och den här gången stoppas den med ett TransformationException. Det finns ingen partiell output och ingen tydlig indikation på vilken post som orsakade problemet. Ofta är boven en enda ogiltig koordinat som är begravd bland tusentals giltiga funktioner. Den här artikeln förklarar varför Shapefile‑konvertering misslyckas med detta fel och hur du åtgärdar det i C# med hjälp av OperationErrorCollector, som introducerades i Aspose.GIS for .NET 26.6. Du kommer att lära dig hur du låter konverteringen slutföras, behåller varje giltig funktion och får en exakt rapport över de poster som behöver uppmärksamhet.

Om du bara behöver den grundläggande konverteringskoden, se Konvertera Shapefile till KML i C#. Denna guide bygger vidare på den och fokuserar på att hantera felen.

Varför Shapefile‑konvertering kastar TransformationException

De flesta målformat förväntar sig koordinater i ett specifikt koordinatsystem. KML använder till exempel alltid WGS 84 longitud och latitud. Under konverteringen omvandlar Aspose.GIS varje koordinat från källkoordinatsystemet till målkoordinatsystemet. Om någon koordinat inte kan omvandlas kastar biblioteket ett TransformationException och konverteringen stoppas.

De vanligaste orsakerna är:

  • Platshållarvärden “no data”. Vissa verktyg skriver ett sentinelvärde istället för att lämna en geometri tom. Exempel-filen i den här artikeln innehåller en punkt på (-1.7976931348623157E+308, -1.7976931348623157E+308), det minsta värdet för en double, som inget koordinatsystem kan transformera.
  • Koordinater utanför intervallet. Värden som hamnar utanför det giltiga området för källkoordinatsystemet, ofta orsakat av inmatningsfel eller felaktiga enhetskonverteringar.
  • En .prj-fil som inte matchar data. Om projicerade koordinater i meter deklareras som geografiska koordinater i grader, hamnar många värden långt utanför det giltiga intervallet.
  • Korrupta geometrirekord. Äldre exporteringar och skadade filer kan innehålla ogiltiga numeriska värden i enskilda poster.

I varje fall är problemet vanligtvis begränsat till ett fåtal poster, men standardbeteendet kastar bort hela konverteringen.

Varför den här funktionen är viktig

Att stoppa vid det första felet är säkert, men det är kostsamt i verkliga pipelines. En dålig post tvingar dig att manuellt rensa filen innan någon data kan konverteras, och själva undantaget säger inte hur många andra poster som påverkas. Med felinsamling aktiverad kan du:

  • Konvertera alla giltiga funktioner istället för att förlora hela filen till en enda felaktig post.
  • Logga indexet och koordinaterna för varje överhoppad funktion så att källdata kan repareras.
  • Kör oövervakade batchkonverteringar och ETL‑jobb utan att krascha på smutsig indata.
  • Acceptera användaruppladdade Shapefiles i webbtjänster och rapportera dataproblem tillbaka till användaren.

Så åtgärdar du fel vid konvertering av Shapefile i C# med Aspose.GIS

Aspose.GIS for .NET är ett hanterat bibliotek för att läsa, skriva och konvertera geospatiala format såsom Shapefile, KML, GeoJSON, GML och File Geodatabase utan att någon annan GIS‑programvara är installerad. Felinsamling kräver version 26.6 eller senare. Installera paketet från NuGet:

dotnet add package Aspose.GIS

Eller använd Package Manager Console:

Install-Package Aspose.GIS

Följande typer används i den här handledningen:

  • VectorLayer (Aspose.Gis): öppnar, skapar och konverterar vektorlager. VectorLayer.Convert utför konverteringen.
  • ConversionOptions (Aspose.Gis): innehåller konverteringsinställningar, inklusive DestinationDriverOptions och DestinationSpatialReferenceSystem.
  • KmlOptions (Aspose.Gis.Formats.Kml): KML‑drivrutinens alternativ. Den ärver ErrorCollector‑egenskapen från DriverOptions.
  • OperationErrorCollector (Aspose.Gis.Operations): lagrar återhämtningsbara fel. Den exponerar Errors, Count, HasErrors, Add och Clear.
  • OperationError och TransformationError (Aspose.Gis.Operations): varje fel har ett Message och ett Exception. TransformationError lägger till FeatureIndex, X, Y och Z.
  • TransformationException (Aspose.Gis.SpatialReferencing): kastas när en koordinat inte kan transformeras och ingen samlare är bifogad.

Så åtgärdar du TransformationException under Shapefile‑konvertering

Fixen har två delar. Först, bifoga en OperationErrorCollector så att konverteringen hoppar över ogiltiga funktioner istället för att misslyckas. För det andra, använd den insamlade rapporten för att reparera eller ta bort dessa poster i källan. Stegen nedan använder en Shapefile‑till‑KML‑konvertering som exempel.

1. Förbered miljön

  1. Skapa ett .NET‑konsolprojekt och lägg till NuGet‑paketet Aspose.GIS 26.6+.
  2. Kopiera Shapefilen och dess medföljande filer (.shp, .shx, .dbf och .prj) till en mapp. Detta exempel använder data/light-traffics.shp.
  3. Lägg till de nödvändiga namnrymderna:
using System;
using System.IO;
using Aspose.Gis;
using Aspose.Gis.Formats.Kml;
using Aspose.Gis.Operations;
using Aspose.Gis.SpatialReferencing;

2. Skapa en OperationErrorCollector

Samlaren registrerar varje återhämtningsbart fel som uppstår under konverteringen. Skapa en ny instans för varje konvertering så att fel från olika filer inte blandas ihop.

// Registrerar återhämtningsbara fel istället för att kasta dem.
var errors = new OperationErrorCollector();

3. Bifoga samlaren via ConversionOptions

Tilldela samlaren till KmlOptions.ErrorCollector, och skicka sedan KML‑alternativen som DestinationDriverOptions. Att sätta DestinationSpatialReferenceSystem till WGS 84 är valfritt för KML, men det gör målkoordinatsystemet explicit i din kod.

var options = new ConversionOptions
{
    // KML always uses WGS 84; stating it makes the reprojection explicit.
    DestinationSpatialReferenceSystem = SpatialReferenceSystem.Wgs84,
    DestinationDriverOptions = new KmlOptions
    {
        ErrorCollector = errors // Skip and record features that fail transformation.
    }
};

4. Kör konverteringen

Anropa VectorLayer.Convert med källsökvägen, Shapefile‑drivrutinen, destinationsökvägen, KML‑drivrutinen och de alternativ du just konfigurerade.

string sourcePath = Path.Combine("data", "light-traffics.shp");
string destinationPath = Path.Combine("output", "light-traffics.kml");
Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));

VectorLayer.Convert(sourcePath, Drivers.Shapefile, destinationPath, Drivers.Kml, options);

Om en funktion inte kan transformeras lägger KML‑drivrutinen till ett fel i samlaren, hoppar över den funktionen och fortsätter med nästa. Inget TransformationException kastas.

5. Rapportera överhoppade funktioner och verifiera utdata

En konvertering som returnerar normalt kan fortfarande ha hoppat över funktioner, så kontrollera alltid samlaren efteråt. Kasta varje fel till TransformationError för att få funktionsindexet och den koordinat som misslyckades, öppna sedan utdatafilen för att bekräfta hur många funktioner som skrevs.

if (errors.HasErrors)
{
    Console.WriteLine($"Skipped {errors.Count} feature(s):");

foreach (var error in errors.Errors)
    {
        if (error is TransformationError transformationError)
        {
            Console.WriteLine(
                $"  Feature #{transformationError.FeatureIndex} at " +
                $"({transformationError.X}, {transformationError.Y}, {transformationError.Z}): {error.Message}");
        }
        else
        {
            Console.WriteLine($"  {error.Message}");
        }
    }
}

using (var layer = VectorLayer.Open(destinationPath, Drivers.Kml))
{
    Console.WriteLine($"Features written to KML: {layer.Count}");
}

För exempelfilen registrerar samlaren ett fel för platshållarpunkten, och de återstående funktionerna (minst 444) skrivs till KML-filen.

Funktionsindexet och koordinaterna i den här rapporten slutför korrigeringen. Öppna käll‑Shapefile‑filen i ditt datarengöringsflöde, lokalisera de rapporterade posterna och korrigera eller ta bort dem. Om många poster misslyckas med rimligt utseende värden, kontrollera .prj‑filen först, eftersom ett felaktigt koordinatsystem sannolikt är orsaken.

6. Full Sample Code

Det kompletta konsolprogrammet nedan kör konverteringen två gånger. Den första körningen använder standardinställningarna och reproducerar TransformationException. Den andra körningen bifogar en OperationErrorCollector, hoppar över den ogiltiga funktionen och skriver ut en rapport.

using System;
using System.IO;
using Aspose.Gis;
using Aspose.Gis.Formats.Kml;
using Aspose.Gis.Operations;
using Aspose.Gis.SpatialReferencing;

namespace ShapefileTransformationErrors
{
    internal class Program
    {
        private static void Main()
        {
            string sourcePath = Path.Combine("data", "light-traffics.shp");
            string outputFolder = "output";
            Directory.CreateDirectory(outputFolder);

// -----------------------------------------------------------------
            // Run 1: default behavior. The first failed transformation aborts
            // the whole conversion with a TransformationException.
            // -----------------------------------------------------------------
            string failFastPath = Path.Combine(outputFolder, "fail-fast.kml");
            try
            {
                VectorLayer.Convert(sourcePath, Drivers.Shapefile, failFastPath, Drivers.Kml);
                Console.WriteLine("Default conversion finished without transformation errors.");
            }
            catch (TransformationException ex)
            {
                Console.WriteLine($"Default conversion aborted: {ex.Message}");
                Console.WriteLine($"Failing coordinate: ({ex.X}, {ex.Y}, {ex.Z})");
            }

// -----------------------------------------------------------------
            // Run 2: error-tolerant conversion. Invalid features are skipped
            // and recorded in the collector; valid features are written.
            // -----------------------------------------------------------------
            string destinationPath = Path.Combine(outputFolder, "light-traffics.kml");

var errors = new OperationErrorCollector();
            var options = new ConversionOptions
            {
                DestinationSpatialReferenceSystem = SpatialReferenceSystem.Wgs84,
                DestinationDriverOptions = new KmlOptions
                {
                    ErrorCollector = errors
                }
            };

VectorLayer.Convert(sourcePath, Drivers.Shapefile, destinationPath, Drivers.Kml, options);

// Report every skipped feature so the source data can be repaired.
            if (errors.HasErrors)
            {
                Console.WriteLine($"Conversion completed with {errors.Count} skipped feature(s):");

foreach (var error in errors.Errors)
                {
                    if (error is TransformationError transformationError)
                    {
                        Console.WriteLine(
                            $"  Feature #{transformationError.FeatureIndex} at " +
                            $"({transformationError.X}, {transformationError.Y}, {transformationError.Z}): {error.Message}");
                    }
                    else
                    {
                        Console.WriteLine($"  {error.Message}");
                    }
                }
            }
            else
            {
                Console.WriteLine("Conversion completed with no errors.");
            }

// Verify the output file.
            using (var layer = VectorLayer.Open(destinationPath, Drivers.Kml))
            {
                Console.WriteLine($"Features written to KML: {layer.Count}");
            }
        }
    }
}

7. Vanliga fallgropar och hur man undviker dem

FallgroparOrsakLösning
ErrorCollector eller OperationErrorCollector kompilerar inteBåda lades till i Aspose.GIS for .NET 26.6.Uppgradera NuGet-paketet till 26.6 eller senare.
Konverteringen kastar fortfarande TransformationExceptionIngen samlare är kopplad till destinationens drivrutinalternativ.Ställ in ErrorCollector på drivrutinalternativobjektet som tilldelats ConversionOptions.DestinationDriverOptions.
En “framgångsrik” konvertering saknar funktionerSamlaren undertrycker undantaget, så Convert returnerar normalt.Kontrollera errors.HasErrors efter varje anrop och logga resultaten.
Behandla överhoppade funktioner som fixadeSamlaren hoppar över ogiltiga poster; den reparerar dem inte.Använd det rapporterade funktionsindexet och koordinaterna för att korrigera eller ta bort poster i källdata.
Hundratals funktioner misslyckas på en gång.prj-filen matchar sannolikt inte de faktiska koordinaterna.Verifiera källkoordinatsystemet innan du undersöker enskilda poster.
Fel från flera filer visas i en rapportSamma samlarinstans återanvändes över konverteringar.Skapa en ny OperationErrorCollector per fil, eller anropa Clear() mellan körningar.
Fil‑lås fel vid upprepade körningarEtt lager öppnat med VectorLayer.Open disposerades inte.Omslut VectorLayer.Open i ett using‑block.

Få en gratis licens

Du kan hämta en tillfällig gratis licens för Aspose.GIS från Aspose temporära licenssida: https://purchase.aspose.com/temporary-license/

Gratis ytterligare resurser

Slutsats

En TransformationException under Shapefile‑konvertering betyder vanligtvis att ett litet antal poster innehåller koordinater som inte kan transformeras, till exempel platshållarvärden, tal utanför intervallet eller data som inte matchar dess .prj‑fil. Att åtgärda det i C# kräver två steg: fäst en OperationErrorCollector så att Aspose.GIS for .NET hoppar över ogiltiga funktioner och slutför konverteringen, och använd sedan de insamlade funktionsindexen och koordinaterna för att reparera källdata. Resultatet blir en pipeline som fortsätter leverera giltig output samtidigt som hårda fel omvandlas till handlingsbara rapporter om datakvalitet.

FAQs

  1. Varför uppstår TransformationException när en Shapefile konverteras? Det uppstår när en koordinat inte kan transformeras från källkoordinatsystemet till målsystemet. Vanliga orsaker är platshållarvärden “no data”, koordinater som ligger utanför det giltiga intervallet för deras koordinatsystem, en .prj-fil som inte matchar de faktiska data, och korrupta geometriposter.

  2. Vad händer som standard när en koordinat inte kan transformeras?
    VectorLayer.Convert kastar ett TransformationException och konverteringen stoppas. Från version 26.6 exponerar undantaget även X, Y och Z‑värdena för den koordinat som misslyckades.

  3. Vilken version av Aspose.GIS for .NET stöder OperationErrorCollector?
    OperationErrorCollector och egenskapen DriverOptions.ErrorCollector introducerades i Aspose.GIS for .NET 26.6. Tidigare versioner innehåller dem inte.

  4. Reparerar OperationErrorCollector ogiltiga koordinater? Nej. Den hoppar över de funktioner som misslyckas med transformationen och registrerar dem, så utdata innehåller endast giltiga funktioner. Använd det rapporterade funktionsindexet och koordinaterna för att åtgärda eller ta bort de felaktiga posterna i källdata.

  5. Kan jag använda OperationErrorCollector med andra utdataformat än KML? ErrorCollector är definierad i den grundläggande DriverOptions‑klassen, så varje drivrutinalternativklass exponerar den. Dokumenterade exempel täcker KML‑ och MapInfo TAB‑destinationer; testa beteendet med din egen mål‑drivrutin innan du förlitar dig på den i produktion.

  6. Vilka detaljer innehåller varje insamlat fel? Varje OperationError tillhandahåller ett Message och den underliggande Exception. Transformationsfel rapporteras som TransformationError-objekt, som lägger till FeatureIndex samt X-, Y- och Z-värdena för den felande koordinaten.

  7. Hur vet jag om en konvertering slutfördes utan några fel? Kontrollera samlarens HasErrors- eller Count-egenskap efter att VectorLayer.Convert har returnerat. En konvertering som avslutas utan att kasta ett undantag kan fortfarande ha hoppat över funktioner.

Läs mer