Yüzlerce kez çalışan bir Shapefiles dönüşümünü çalıştırıyorsunuz ve bu sefer TransformationException ile duruyor. Kısmi bir çıktı yok ve soruna hangi kaydın neden olduğunu gösteren net bir belirti yok. Çoğu zaman suçlu, binlerce geçerli özelliğin arasında gömülü tek bir geçersiz koordinattır. Bu makale, Shapefile dönüşümünün bu hatayla neden başarısız olduğunu ve Aspose.GIS for .NET 26.6’da tanıtılan OperationErrorCollector kullanarak C#’ta nasıl düzeltileceğini açıklıyor. Dönüşümün tamamlanmasını, her geçerli özelliğin korunmasını ve dikkat gerektiren kayıtların kesin bir raporunu nasıl alacağınızı öğreneceksiniz.

Yalnızca temel dönüşüm koduna ihtiyacınız varsa, Convert Shapefile to KML in C#. Bu kılavuz, buna dayanarak hataların ele alınmasına odaklanır.

Shapefile Dönüştürmesi Neden TransformationException Hatası Atar

Çoğu hedef format, koordinatları belirli bir koordinat sisteminde bekler. Örneğin KML, her zaman WGS 84 boylam ve enlem kullanır. Dönüştürme sırasında, Aspose.GIS her koordinatı kaynak koordinat sisteminden hedef sisteme dönüştürür. Herhangi bir koordinat dönüştürülemezse, kütüphane bir TransformationException hatası fırlatır ve dönüşüm durur.

En yaygın nedenler şunlardır:

  • “no data” yer tutucu değerleri. Bazı araçlar geometriyi boş bırakmak yerine bir sentinel değer yazar. Bu makaledeki örnek dosya (-1.7976931348623157E+308, -1.7976931348623157E+308) noktasını içerir, bu bir double‘ın minimum değeri olup hiçbir koordinat sistemi bunu dönüştüremez.
  • Aralık dışı koordinatlar. Kaynak koordinat sisteminin geçerli alanının dışına düşen değerler, genellikle veri girişi hataları veya hatalı birim dönüşümlerinden kaynaklanır.
  • Veriyle eşleşmeyen bir .prj dosyası. Metre cinsinden projeksiyon koordinatları derecelerde coğrafi koordinatlar olarak beyan edilirse, birçok değer geçerli aralığın çok dışına çıkar.
  • Bozuk geometri kayıtları. Eski dışa aktarımlar ve hasarlı dosyalar, bireysel kayıtlarda geçersiz sayısal değerler içerebilir.

Her durumda, sorun genellikle sadece birkaç kayıta sınırlıdır, ancak varsayılan davranış tüm dönüşümü atar.

Bu Özelliğin Neden Önemli Olduğu

İlk hatada durmak güvenlidir, ancak gerçek boru hatlarında maliyetlidir. Tek bir hatalı kayıt, herhangi bir veri dönüştürülmeden önce dosyayı elle temizlemenizi zorunlu kılar ve istisna yalnızca kaç diğer kaydın etkilendiğini söylemez. Hata toplama etkinleştirildiğinde şunları yapabilirsiniz:

  • Tüm geçerli özellikleri, bütün dosyanın tek bir hatalı kayıt nedeniyle kaybolması yerine dönüştür.
  • Kaynak verinin onarılabilmesi için atlanan her özelliğin indeksini ve koordinatlarını kaydedin.
  • Kirli girişlerde çökmeden, gözetimsiz toplu dönüşümler ve ETL işleri çalıştırın.
  • Web hizmetlerinde kullanıcı tarafından yüklenen Shapefile’ları kabul edin ve veri sorunlarını kullanıcıya bildirin.

C# ile Aspose.GIS kullanarak Shapefile Dönüştürme Hatalarını Nasıl Düzeltirsiniz

Aspose.GIS for .NET bir yönetilen kütüphanedir ve Shapefile, KML, GeoJSON, GML ve File Geodatabase gibi coğrafi veri formatlarını başka bir GIS yazılımı kurmadan okuma, yazma ve dönüştürme imkanı sağlar. Hata toplama için 26.6 veya daha yeni bir sürüm gerekir. Paketi NuGet’ten yükleyin:

dotnet add package Aspose.GIS

Veya Paket Yöneticisi Konsolunu kullanın:

Install-Package Aspose.GIS

Bu öğreticide kullanılan tipler şunlardır:

  • VectorLayer (Aspose.Gis): vektör katmanlarını açar, oluşturur ve dönüştürür. VectorLayer.Convert dönüşümü gerçekleştirir.
  • ConversionOptions (Aspose.Gis): DestinationDriverOptions ve DestinationSpatialReferenceSystem dahil olmak üzere dönüşüm ayarlarını tutar.
  • KmlOptions (Aspose.Gis.Formats.Kml): KML sürücü seçenekleri. DriverOptions sınıfından ErrorCollector özelliğini devralır.
  • OperationErrorCollector (Aspose.Gis.Operations): kurtarılabilir hataları depolar. Errors, Count, HasErrors, Add ve Clear öğelerini sunar.
  • OperationError ve TransformationError (Aspose.Gis.Operations): her hata bir Message ve bir Exception içerir. TransformationError FeatureIndex, X, Y ve Z ekler.
  • TransformationException (Aspose.Gis.SpatialReferencing): bir koordinat dönüştürülemediğinde ve bir toplayıcı ekli olmadığında fırlatılır.

Shapefile Dönüştürme Sırasında TransformationException Nasıl Düzeltilir

Düzeltme iki bölümden oluşur. İlk olarak, dönüşümün başarısız olmak yerine geçersiz özellikleri atlamasını sağlamak için bir OperationErrorCollector ekleyin. İkinci olarak, toplanan raporu kullanarak bu kayıtları kaynağında onarın veya kaldırın. Aşağıdaki adımlar, bir Shapefile’dan KML’ye dönüşüm örneği olarak kullanılmaktadır.

1. Ortamı Hazırlayın

  1. .NET console projesi oluşturun ve Aspose.GIS 26.6+ NuGet paketini ekleyin.
  2. Shapefile ve ona eşlik eden dosyaları (.shp, .shx, .dbf ve .prj) tek bir klasöre kopyalayın. Bu örnek data/light-traffics.shp dosyasını kullanır.
  3. Gerekli ad alanlarını ekleyin:
using System;
using System.IO;
using Aspose.Gis;
using Aspose.Gis.Formats.Kml;
using Aspose.Gis.Operations;
using Aspose.Gis.SpatialReferencing;

2. Bir OperationErrorCollector Oluşturun

Toplayıcı, dönüşüm sırasında ortaya çıkan her kurtarılabilir hatayı kaydeder. Farklı dosyalardan gelen hataların karışmaması için her dönüşümde yeni bir örnek oluşturun.

// Records recoverable errors instead of throwing them.
var errors = new OperationErrorCollector();

Collector’ı ConversionOptions aracılığıyla ekleyin

Toplayıcıyı KmlOptions.ErrorCollector‘a atayın, ardından KML seçeneklerini DestinationDriverOptions olarak geçirin. DestinationSpatialReferenceSystem‘i WGS 84 olarak ayarlamak KML için isteğe bağlıdır, ancak hedef koordinat sistemini kodunuzda açıkça belirtir.

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. Dönüşümü Çalıştır

Kaynak yolu, Shapefile sürücüsü, hedef yolu, KML sürücüsü ve az önce yapılandırdığınız seçeneklerle VectorLayer.Convert yöntemini çağırın.

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

Bir özellik dönüştürülemediğinde, KML sürücüsü hatayı toplayıcıya ekler, o özelliği atlar ve bir sonrakiyle devam eder. TransformationException istisnası atılmaz.

5. Atlanan Özellikleri Raporla ve Çıktıyı Doğrula

Normal olarak dönen bir dönüşüm, yine de atlanmış özellikler içerebilir, bu yüzden her zaman ardından toplayıcıyı kontrol edin. Her hatayı TransformationError tipine dönüştürerek özellik indeksini ve başarısız olan koordinatı alın, ardından kaç özellik yazıldığını doğrulamak için çıktı dosyasını açın.

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}");
}

Örnek dosya için, toplayıcı yer tutucu nokta için bir hata kaydeder ve kalan özellikler (en az 444) KML dosyasına yazılır.

Bu rapordaki özellik indeksi ve koordinatlar düzeltmeyi tamamlar. Veri temizleme iş akışınızda kaynak Shapefile’ı açın, rapor edilen kayıtları bulun ve düzeltin veya kaldırın. Birçok kayıt makul görünümlü değerlerle başarısız olursa, önce .prj dosyasını kontrol edin; çünkü uyumsuz bir koordinat sistemi muhtemel nedendir.

6. Tam Örnek Kod

Aşağıdaki tam konsol uygulaması dönüşümü iki kez çalıştırır. İlk çalıştırma varsayılan ayarları kullanır ve TransformationException hatasını yeniden üretir. İkinci çalıştırma bir OperationErrorCollector ekler, geçersiz özelliği atlar ve bir rapor yazdırır.

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. Yaygın Tuzaklar ve Nasıl Kaçınılır

SorunSebepÇözüm
ErrorCollector veya OperationErrorCollector derlenmiyorHer ikisi de Aspose.GIS for .NET 26.6’da eklendi.NuGet paketini 26.6 veya daha yeni bir sürüme yükseltin.
Dönüştürme hâlâ TransformationException hatası atıyorHedef sürücü seçeneklerine bir collector eklenmemiş.ConversionOptions.DestinationDriverOptions‘a atanan sürücü seçenekleri nesnesine ErrorCollector ayarlayın.
“Başarılı” bir dönüşümde özellikler eksikCollector istisnayı bastırıyor, bu yüzden Convert normal şekilde döner.Her çağrıdan sonra errors.HasErrors kontrol edin ve sonuçları kaydedin.
Atlanan özellikleri düzeltilmiş olarak kabul etmekCollector geçersiz kayıtları atlar; bunları onarmaz.Kaynak verideki kayıtları düzeltmek veya kaldırmak için bildirilen özellik indeksini ve koordinatları kullanın.
Yüzlerce özellik aynı anda başarısız oluyor.prj dosyası muhtemelen gerçek koordinatlarla eşleşmiyor.Tek tek kayıtları incelemeden önce kaynak koordinat sistemini doğrulayın.
Birden fazla dosyadan gelen hatalar tek bir raporda görünüyorAynı collector örneği dönüşümler arasında yeniden kullanılmış.Dosya başına yeni bir OperationErrorCollector oluşturun veya çalıştırmalar arasında Clear() çağırın.
Tekrarlanan çalıştırmalarda dosya kilidi hatalarıVectorLayer.Open ile açılan bir katman serbest bırakılmamış.VectorLayer.Open‘ı bir using bloğu içinde sarın.

Ücretsiz Lisans Al

Aspose.GIS için geçici ücretsiz bir lisansı Aspose geçici‑lisans sayfasından alabilirsiniz: https://purchase.aspose.com/temporary-license/

Ücretsiz Ek Kaynaklar

Sonuç

A TransformationException sırasında Shapefile dönüşümü genellikle az sayıda kaydın dönüştürülemeyen koordinatlar içerdiği anlamına gelir; örneğin yer tutucu değerler, aralık dışı sayılar veya .prj dosyasıyla eşleşmeyen veriler. Bunu C#‘de düzeltmek iki adım gerektirir: OperationErrorCollector‘ı ekleyerek Aspose.GIS for .NET’in geçersiz özellikleri atlamasını ve dönüşümü tamamlamasını sağlamak, ardından toplanan özellik indekslerini ve koordinatları kullanarak kaynak veriyi onarmak. Sonuç, geçerli çıktıyı sağlamaya devam eden ve zor hataları eyleme geçirilebilir veri‑kalitesi raporlarına dönüştüren bir işlem hattıdır.

SSS

  1. Shapefile dönüştürülürken TransformationException neden oluşur? Bir koordinat, kaynak koordinat sisteminden hedef sisteme dönüştürülemediğinde ortaya çıkar. Yaygın nedenler arasında yer tutucu “no data” değerleri, koordinat sisteminin geçerli aralığının dışındaki koordinatlar, gerçek verilerle eşleşmeyen bir .prj dosyası ve bozuk geometri kayıtları bulunur.

  2. Bir koordinat dönüştürülemediğinde varsayılan olarak ne olur? VectorLayer.Convert bir TransformationException fırlatır ve dönüşüm durur. 26.6 sürümünden itibaren, istisna ayrıca başarısız olan koordinatın X, Y ve Z değerlerini de gösterir.

  3. Aspose.GIS for .NET’in hangi sürümü OperationErrorCollector’ı destekliyor? OperationErrorCollector ve DriverOptions.ErrorCollector özelliği Aspose.GIS for .NET 26.6’da tanıtıldı. Daha eski sürümler bunları içermez.

  4. OperationErrorCollector geçersiz koordinatları onarır mı? Hayır. Dönüşümde başarısız olan özellikleri atlar ve kaydeder, böylece çıktı yalnızca geçerli özellikleri içerir. Raporlanan özellik indeksini ve koordinatları kullanarak kaynak verideki hatalı kayıtları düzeltin veya kaldırın.

  5. OperationErrorCollector’ı KML dışındaki çıktı formatlarıyla kullanabilir miyim? ErrorCollector temel DriverOptions sınıfında tanımlıdır, bu yüzden her sürücü seçenekleri sınıfı onu ortaya çıkarır. Belgelenmiş örnekler KML ve MapInfo TAB hedeflerini kapsar; üretimde kullanmadan önce davranışı kendi hedef sürücünüzle test edin.

  6. Her toplanan hata hangi detayları içerir? Her OperationError bir Message ve temel Exception sağlar. Dönüşüm hataları TransformationError nesneleri olarak raporlanır; bu nesneler başarısız koordinatın FeatureIndex ve X, Y ve Z değerlerini ekler.

  7. Bir dönüşümün hatasız tamamlandığını nasıl anlarım? VectorLayer.Convert döndükten sonra kolektörün HasErrors veya Count özelliğini kontrol edin. Hata atılmadan tamamlanan bir dönüşüm yine de bazı özellikleri atlamış olabilir.

Daha Fazla Oku