TopoJSON, coğrafi verilerin kompakt bir kodlamasıdır ve bir TopoJSON dosyasındaki her özelliğin düz bir anahtar‑değer çifti yerine bir öznitelik nesnesi taşıması yaygındır. Bu yapıyı CSV formatına dışa aktarmak genellikle sorunlara yol açar: çoğu araç ya iç içe nesneyi atar ya da tek bir hücreye sıkıştırılmış bir JSON dizesi olarak döker. Bu kılavuz, C# içinde Aspose.GIS kullanarak TopoJSON’u CSV’ye nasıl dönüştüreceğinizi gösterir, her özniteliği kendi sütunu olarak adreslenebilir tutar ve isteğe bağlı olarak geometrisini Well‑Known Text olarak yanına yazar.
Karşılığında, hiyerarşik bir GIS veri kümesi, SQL Server, Power BI, pandas veya basit bir elektronik tablo tarafından doğrudan tüketilebilen düz bir tablo haline gelir; uygulamanızda özel bir JSON ayrıştırma katmanı olmadan.
Neden Aspose.GIS ile TopoJSON’ı CSV’ye Dönüştürmeliyiz
Bir TopoJSON özelliğini düşünün; özellikleri şöyle görünür:
{
"name": "North District",
"prop1": { "this": "that" }
}
Saf bir CSV yazarı üç kötü seçeneğe sahiptir: prop1‘i atmak, onu {"this":"that"} olarak tek bir hücreye serileştirmek veya başarısız olmak. Üçü de sorunu aşağı akışa iterek, birinin filtreleme veya birleştirme yapabilmesi için bir metin sütunundan JSON’u yeniden ayrıştırması gerekir.
Aspose.GIS farklı bir yaklaşım benimser. TopoJSON sürücüsü dosyayı okuduğunda, iç içe nesneyi katman şemasına, yoluna göre adlandırılmış düz bir öznitelik olarak, üst ve alt öğeyi bir alt çizgiyle birleştirerek projeler. Yukarıdaki özellik iki normal sütun olarak ortaya çıkar:
| Sütun | Değer |
|---|---|
name | Kuzey Bölgesi |
prop1_this | şu |
Düzleştirme okuma zamanında gerçekleştiği için dönüşüm adımının özel bir işleme ihtiyacı yoktur. Katmanın ortaya çıkardığı her şey yazılır, bu yüzden prop1_this CSV’de sıralayabileceğiniz, filtreleyebileceğiniz ve birleştirebileceğiniz bir birincil sütun olarak yer alır.
TopoJSON’ten CSV’ye Dönüştürme Gereksinimleri
- .NET 6.0 veya daha yeni bir sürüm, ya da .NET Framework 4.6.2 veya daha yeni bir sürüm
- Aspose.GIS for .NET, NuGet’ten yüklendi
- En az bir iç içe öznitelik nesnesi içeren bir TopoJSON dosyası
Paketi .NET CLI ile kurun:
dotnet add package Aspose.GIS
Veya Paket Yöneticisi Konsolundan:
Install-Package Aspose.GIS
Bir adlandırma detayı insanları şaşırtıyor: NuGet paketi ve derleme Aspose.GIS olarak adlandırılmış, ancak kök ad alanı Aspose.Gis ve is kısmı küçük harfle. CSV sürücü seçenekleri Aspose.Gis.Formats.Csv içinde bulunur.
using Aspose.Gis;
using Aspose.Gis.Formats.Csv;
Ürün detayları, Aspose.GIS for .NET ürün sayfasında bulunabilir; tam tip listesi ise API referansında yer alır.
Dönüştürmeden Önce Düzleştirilmiş Şemayı İnceleyin
Ne elde edeceksiniz: TopoJSON katmanını açın ve öznitelik adlarını yazdırın, böylece CSV’nin hangi sütunları içereceğini tam olarak bilirsiniz.
Bu adımı, temsilci bir dosya üzerinde bir kez yapmak değerlidir. Düzleştirme ile üretilen gerçek sütun adlarını size bildirir; bu, ham JSON’dan tahmin etmeye göre çok daha güvenilirdir.
using System;
using Aspose.Gis;
using (VectorLayer layer = VectorLayer.Open("data/regions.topojson", Drivers.TopoJson))
{
Console.WriteLine($"Features: {layer.Count}");
foreach (FeatureAttribute attribute in layer.Attributes)
{
Console.WriteLine($" {attribute.Name} ({attribute.DataType})");
}
}
Daha önce gösterilen örnek özellik için, bu name (String) ve prop1_this (String) değerlerini yazdırır. İç içe nesne, kendi başına bir öznitelik olarak hiç görünmez; bu da tam olarak istediğiniz şeydir.
İç İçe Özellikleri Korumak İçin TopoJSON’ı CSV’ye Dönüştür
Ne başaracaksınız: Bir TopoJSON dosyası yükleyin, her düzleştirilmiş özelliği bir CSV dosyasına yazın ve sütunun başarıyla aktarıldığını doğrulamak için sonucu geri okuyun.
Adım adım süreç
- Kaynak TopoJSON yolunu ve hedef CSV yolunu tanımlayın.
- Kaynağı
VectorLayer.Openile açın ve düzleştirilmiş özniteliğin mevcut olduğunu doğrulayın. - Kaynak ve hedef sürücülerle statik
VectorLayer.Convertaşırı yüklemesini çağırın. - CSV’yi
Drivers.Csvile yeniden açın ve sütun sayısını ve değerleri kontrol edin.
Aşağıdaki örnek, bir TopoJSON dosyasını CSV’ye dönüştürür ve bu sırada iç içe geçmiş özellikleri düzleştirir.
using System;
using System.IO;
using Aspose.Gis;
class TopoJsonToCsv
{
static void Main()
{
string sourcePath = Path.Combine("data", "regions.topojson");
string destinationPath = Path.Combine("output", "regions.csv");
Directory.CreateDirectory("output");
// Confirm the nested property was flattened when the layer was opened.
using (VectorLayer source = VectorLayer.Open(sourcePath, Drivers.TopoJson))
{
Console.WriteLine($"Source features: {source.Count}");
Console.WriteLine($"Has prop1_this: {source.Attributes.Contains("prop1_this")}");
}
// No options are needed. The conversion writes whatever columns the
// source layer exposes, flattened attributes included.
VectorLayer.Convert(sourcePath, Drivers.TopoJson, destinationPath, Drivers.Csv);
// Read the CSV back and verify the schema survived the round trip.
using (VectorLayer csv = VectorLayer.Open(destinationPath, Drivers.Csv))
{
Console.WriteLine($"Rows: {csv.Count}, Columns: {csv.Attributes.Count}");
if (csv.Attributes.Contains("prop1_this"))
{
Console.WriteLine($"First value: {csv[0].GetValue<string>("prop1_this")}");
}
// No WKT column was requested, so features read back without geometry.
Console.WriteLine($"Geometry empty: {csv[0].Geometry.IsEmpty}");
}
}
}
Açıklama
VectorLayer.Open(string, FileDriver)dosyayı yalnızca okuma modunda açar.Drivers.TopoJsonTopoJSON formatı için sürücüyü döndürür.FeatureAttributeCollection.Contains(string)bir sütunu ad ile test etmenin en ucuz yoludur.IndexOfihtiyacınız olursa konumunu verir.VectorLayer.Convert(string, FileDriver, string, FileDriver)bir statik yardımcıdır ve kaynağı tek bir çağrıda hedef formata akıtır. AyrıcaConversionOptionsalan bir aşırı yükleme de vardır; bu bir sonraki bölümde kullanılır.Feature.GetValue<T>(string)tiplenmiş bir öznitelik değerini okur. Bir sütun eksik veya null olabileceği durumlardaGetValueOrDefault<T>(string)kullanın, çünküGetValue<T>değerin mevcut olduğunu varsayar.- Son kontrol, insanları şaşırtan olandır. Bir CSV dosyasında bir geometri sütunu yoktur, siz oluşturmadıkça, bu yüzden her özellik boş bir geometriyle geri döner. Bu varsayılan davranıştır, bir dönüşüm hatası değildir ve bir sonraki bölüm bunu düzeltir.
Her iki katmanı da using blokları içinde sarmalamak burada önemlidir: VectorLayer IDisposable arayüzünü uygular ve hedef dosya, serbest bırakılana kadar temizlenip kapatılacağı garanti edilmez.
CsvOptions Kullanarak Geometriyi WKT Olarak Dahil Et
Ne elde edeceksiniz: Düzleştirilmiş özniteliklerin ve her özelliğin geometrisini Well-Known Text olarak tutan bir sütun içeren bir CSV üretin.
Adım adım süreç
- Bir
CsvOptionsörneği oluşturun veColumnWktdeğerini seçtiğiniz sütun adı olarak ayarlayın. ConversionOptions.DestinationDriverOptions‘a atayın.VectorLayer.Convert‘in dönüşüm seçeneklerini kabul eden aşırı yüklemesini çağırın.- Sürücünün hangi sütunu geometri olarak ayrıştıracağını bilmesi için aynı
CsvOptionsile CSV’yi yeniden açın.
using System;
using System.IO;
using Aspose.Gis;
using Aspose.Gis.Formats.Csv;
class TopoJsonToCsvWithGeometry
{
static void Main()
{
string sourcePath = Path.Combine("data", "regions.topojson");
string destinationPath = Path.Combine("output", "regions-wkt.csv");
Directory.CreateDirectory("output");
// Ask the CSV driver for a geometry column named "GeometryWkt".
var csvOptions = new CsvOptions
{
ColumnWkt = "GeometryWkt"
};
var conversionOptions = new ConversionOptions
{
DestinationDriverOptions = csvOptions
};
VectorLayer.Convert(
sourcePath,
Drivers.TopoJson,
destinationPath,
Drivers.Csv,
conversionOptions);
// Pass the same options when reading, or the WKT column is just text.
using (VectorLayer layer = VectorLayer.Open(destinationPath, Drivers.Csv, csvOptions))
{
foreach (Feature feature in layer)
{
string name = feature.GetValueOrDefault<string>("name");
string wkt = feature.Geometry.IsEmpty ? "(empty)" : feature.Geometry.AsText();
Console.WriteLine($"{name}: {wkt}");
}
}
}
}
Açıklama
CsvOptions.ColumnWkther özelliğin geometrisini WKT biçiminde tutan sütunun adını belirler. Varsayılanınull‘dır ve onu null veya boş bırakmak, önceki örneğin geometri üretmemesinin tam nedenidir.ConversionOptions.DestinationDriverOptionsDriverOptionstipindedir; bu, her sürücünün ayar nesnesi için temel sınıftır. Hedef sürücüDrivers.Csvolduğunda birCsvOptionsgeçirmek, ayarın etkili olmasını sağlar; bir sürücü için yanlış tipte seçenekler geçirmek birArgumentExceptionoluşturur.- Aynı
CsvOptionsörneği okuma tarafında yeniden kullanılır. Onsuz, CSV sürücüsüGeometryWkt‘yi başka bir string sütun dışında bir şey olarak ele almaz. IGeometry.AsText()ISO WKT temsili döndürür, bu yüzden yazdırılan çıktı dosyaya yazılanla eşleşir.
Simetri noktadır: Öznitelik sütunları, geometri dahil edilip edilmemesine bakılmaksızın aynı şekilde davranır, bu yüzden WKT sütununu pipeline’ınızın geri kalanına dokunmadan açıp kapatabilirsiniz.
Dönüştürme Sırasında Yeniden Projeksiyon
Tüketen sistem belirli bir koordinat sistemini bekliyorsa, CSV’yi sonradan işlemek yerine dönüşümün bir parçası olarak bunu isteyin. ConversionOptions sürücü seçeneklerinin yanı sıra bir uzamsal referans taşır:
var conversionOptions = new ConversionOptions
{
DestinationDriverOptions = new CsvOptions { ColumnWkt = "GeometryWkt" },
DestinationSpatialReferenceSystem = SpatialReferenceSystem.Wgs84
};
VectorLayer.Convert(sourcePath, Drivers.TopoJson, destinationPath, Drivers.Csv, conversionOptions);
Her hedef sürücü, her mekansal referans sistemini desteklemez. Hedef sistem çalışma zamanında yapılandırılabilir ise önce Drivers.Csv.SupportsSpatialReferenceSystem(...) metodunu çağırın ve desteklenmediğinde null bir seçenek nesnesine geri dönün.
Bir Klasördeki TopoJSON Dosyalarını Toplu Dönüştür
API, bir dosya için olduğu gibi bin dosya için de aynıdır. Paralelleştirme yaparken aklınızda tutmanız gereken tek kural, her işçinin kendi katman ve seçenek nesnelerine ihtiyacı olduğudur.
using System;
using System.IO;
using System.Threading.Tasks;
using Aspose.Gis;
using Aspose.Gis.Formats.Csv;
static void ConvertFolder(string inputFolder, string outputFolder)
{
Directory.CreateDirectory(outputFolder);
var files = Directory.GetFiles(inputFolder, "*.topojson");
Parallel.ForEach(files, file =>
{
string destination = Path.Combine(
outputFolder,
Path.GetFileNameWithoutExtension(file) + ".csv");
// Fresh options per iteration: nothing is shared across threads.
var options = new ConversionOptions
{
DestinationDriverOptions = new CsvOptions { ColumnWkt = "GeometryWkt" }
};
try
{
VectorLayer.Convert(file, Drivers.TopoJson, destination, Drivers.Csv, options);
}
catch (GisException ex)
{
Console.Error.WriteLine($"Skipped {Path.GetFileName(file)}: {ex.Message}");
}
});
}
Döngünün tamamını kapsamak yerine her dosya için GisException yakalamak, tek bir hatalı TopoJSON dosyasının işlemi durdurmak yerine bir uyarı kaydetmesi anlamına gelir.
Ücretsiz Lisans Al
Aspose.GIS, bir lisans uygulanana kadar değerlendirme modunda çalışır. Ücretsiz geçici bir lisans talep etmek için Aspose temporary license page adresini kullanın ve uygulamayı başlatırken, başka bir Aspose.GIS çağrısından önce bir kez uygulayın:
var license = new Aspose.Gis.License();
license.SetLicense("Aspose.GIS.NET.lic");
Ücretsiz Ek Kaynaklar
Sonuç
.NET’te iç içe özelliklere sahip TopoJSON’ı CSV’ye dönüştürmek, tek bir faydalı davranışa dayanır: Aspose.GIS, katman okunurken iç içe özellik nesnelerini prop1_this gibi adlandırılmış sütunlara düzleştirir, bu yüzden VectorLayer.Convert bunları korumak için özel bir mantığa ihtiyaç duymaz. Aşağı akış sisteminin geometriye ihtiyacı olduğunda CsvOptions.ColumnWkt ekleyin, belirli bir projeksiyona ihtiyacı olduğunda DestinationSpatialReferenceSystem ekleyin ve bir klasörü işlemeniz gerektiğinde aynı çağrıyı döngüye alın. Sonuç, birkaç satır C# kodu ile üretilen, kendi JSON ayrıştırma katmanına ihtiyaç duymadan, analiz için hazır düz bir tablo olur.
SSS
Aspose.GIS, CSV’ye dönüştürürken iç içe JSON nesnelerini düzleştirebilir mi? Evet. TopoJSON sürücüsü, katman açıldığında iç içe bir öznitelik nesnesini ayrı sütunlar olarak ortaya çıkarır ve üst ve alt isimleri alt çizgiyle birleştirir, böylece düzleştirme dönüşüm çalıştırılmadan önce zaten yapılmış olur.
İç içe geçmiş özellikleri işlemek için özel kod yazmam gerekiyor mu? Hayır.
VectorLayer.Convertkaynak katmanın sunduğu tüm sütunları yazar, bu yüzden iç içe geçmiş özellikler için ekstra bir ayrıştırma koduna ihtiyacınız yok.CSV çıktısına geometriyi nasıl ekleyebilirim?
CsvOptionsbir örnek oluşturun,ColumnWktözelliğini istediğiniz sütun adıyla ayarlayın, bunuConversionOptions.DestinationDriverOptions‘a atayın veVectorLayer.Convert‘a geçirin.CSV’yi geri okuduğumda geometri neden boş? Bir CSV, siz istemediğiniz sürece geometri sütunu içermez. Yazma ve okuma sırasında kullandığınız
CsvOptionsüzerindeColumnWktayarlayın, aksi takdirde sürücü bir geometri oluşturacak sütuna sahip olmaz.Dönüştürme sırasında hangi istisnaları ele almalıyım? Belirtilen istisnalar şunlardır:
ArgumentNullExceptionnull bir yol için,ArgumentExceptionbir seçenek nesnesi sürücüyle eşleşmediğinde,GisExceptionbir özelliğin dosyadan okunamadığında veIOExceptiontemel I/O hataları için.TopoJSON dosyalarının bir toplu halinde aynı anda dönüştürülmesi mümkün mü? Evet. Dosya listesi üzerinde döngü yapın ve her dosya için
VectorLayer.Convertmetodunu çağırın. Döngüyü paralelleştiriyorsanız, her işçiye birVectorLayerve seçenek örnekleri verin; bunları iş parçacıkları arasında paylaşmayın.Dönüşüm koordinat sistemini değiştirir mi? Varsayılan olarak değişmez. Dönüşüm sırasında yeniden projelendirmek için,
ConversionOptions.DestinationSpatialReferenceSystemöğesini hedef sisteme ayarlayın veConvertmetodunu çağırmadan önce.
