Gibt es einen kostenlosen Opensource Shapefile Writer für .NET?


12

Ich bin auf der Suche nach einer gut dokumentierten OpenSource-Bibliothek, die Shapefiles aus .Net erstellen und in diese schreiben kann. Ich benötige einen Zugriff mit niedrigerem Hebel, dh ich sollte in der Lage sein, Feature für Feature zu schreiben.

Existiert eine solche Bibliothek?

Ich habe Folgendes untersucht und festgestellt:

  • SharpMap behauptet, in Shapefiles in Version 2.0 zu schreiben, diese Version wurde jedoch nicht veröffentlicht.
  • NTS hat absolut keine Dokumentation.
  • Catfood Shapefile Reader bietet nur Lesezugriff.

Gibt es irgendeine Hoffnung für mich? Gibt es eine Bibliothek, mit der ein neues Shapefile geschrieben werden kann?


1
NTS verfügt über Dokumentation - nur im Code (z. B. code.google.com/p/nettopologysuite/source/browse/trunk/… ) und einige Tests. Manchmal hilft das Lesen von JTS-Dokumenten.
BradHards

Antworten:


5

Ich habe es selbst nicht benutzt, aber ich schaue mir die Dokumentation für DotSpatial schnell an. Es sieht so aus, als ob es in der Lage sein sollte, das zu tun, was Sie wollen.

In NuGet gibt es einzelne Assemblys, wenn Sie wissen, welche Sie benötigen (was ich nicht tue).

Hier ist ein Beispiel , das zumindest die Möglichkeit demonstriert. Es wäre schön, wenn es einen WKT-Reader / Konverter gäbe, um ein besser lesbares Beispiel zu erstellen, aber das scheint zu fehlen.


1
Ich bin Ihrem Rat gefolgt und habe dieses Dokument ( dotspatial.codeplex.com/… ) gefunden, das zeigt, was ich tun möchte.
Devdatta Tengshe

9

Ich fühle deinen Schmerz. Mit NetTopologySuite (v1.13) habe ich das Gleiche durchgemacht und bei den Unit-Tests einige Erfolge erzielt.

Zunächst sollten Sie die DotSpatial-Bibliothek überprüfen, auf die in einer ähnlichen Frage speziell für DS-Shapefile-Vorgänge verwiesen wurde

Ich persönlich bin mit der NTS-Bibliothek sehr zufrieden. Sobald Sie das Objektmodell herausgefunden haben, ist es nicht allzu aufwändig, etwas zusammenzusetzen. Da auf dieses Thema wahrscheinlich mehrmals verwiesen wird, finden Sie hier einen schnellen Code-Dump zum Schreiben von Shapefiles aus NTS.

1) Laden Sie die NTS-Binärdateien (1.13.0) herunter

2) Verweisen Sie auf die folgenden Baugruppen:

-GeoAPI, NetTopologySuite, NetTopologySuite.IO, NetTopologySuite.IO.GeoTools (raten Sie, wie lange es gedauert hat, bis Sie herausgefunden haben, dass dieser letzte Schritt erforderlich war)

3) Schreiben Sie einen Code (dies ist ein 10-minütiger Hack-Job)

Hinzufügen von using-Anweisungen für NetTopologySuite, NetTopologySuite.IO, NetTopologySuite.Features, GeoAPI, GeoAPI.Geometries

        string path = @"C:\data\atreides";
        string firstNameAttribute = "firstname";
        string lastNameAttribute = "lastname";

        //create geometry factory
        IGeometryFactory geomFactory = NtsGeometryServices.Instance.CreateGeometryFactory();

        //create the default table with fields - alternately use DBaseField classes
        AttributesTable t1 = new AttributesTable();
        t1.AddAttribute(firstNameAttribute, "Paul");
        t1.AddAttribute(lastNameAttribute, "Atreides");

        AttributesTable t2 = new AttributesTable();
        t2.AddAttribute(firstNameAttribute, "Duncan");
        t2.AddAttribute(lastNameAttribute, "Idaho");

        //create geometries and features
        IGeometry g1 = geomFactory.CreatePoint(new Coordinate(300000, 5000000));
        IGeometry g2 = geomFactory.CreatePoint(new Coordinate(300200, 5000300));

        Feature feat1 = new Feature(g1, t1);
        Feature feat2 = new Feature(g2, t2);

        //create attribute list
        IList<Feature> features = new List<Feature>() { feat1, feat2 };
        ShapefileDataWriter writer = new ShapefileDataWriter(path) { Header = ShapefileDataWriter.GetHeader(features[0], features.Count) };

        System.Collections.IList featList = (System.Collections.IList)features;
        writer.Write(featList);

Also nicht gut dokumentiert, aber es ist ziemlich point & shoot, sobald Sie loslegen.


Ich habe eine ähnliche Antwort speziell auf DotSpatial gis.stackexchange.com/questions/5816/… vergessen , bin aber mit NTS ziemlich zufrieden.
WolfOdrade

Sie haben auf diese Frage geantwortet , was mich dazu führte: dotspatial.codeplex.com/… , wonach ich gesucht habe.
Devdatta Tengshe

2

Sieht so aus, als hätte GDAL eine ac # -Bibliothek: http://trac.osgeo.org/gdal/wiki/GdalOgrInCsharp


Können Sie mir eine Dokumentation zeigen, in der Sie mithilfe dieser C # -Bindung ein Shapefile-Feature für Feature schreiben können? Ich habe es versucht, aber nichts gefunden.
Devdatta Tengshe

1
Im Allgemeinen sind die SWIG-Bindungen nicht gut dokumentiert, aber es gibt eine gute Anzahl von Beispielen in github.com/OSGeo/gdal/tree/trunk/gdal/swig/csharp/apps , und der größte Teil des Codes sollte dem in C ++ sehr ähnlich sein Ausführung.
SCW


1

Sie können auch MapWinGIS in Betracht ziehen .

MapWinGIS.ocx wird verwendet, um GIS- und Zuordnungsfunktionen für alle Windows Forms-basierten Anwendungen bereitzustellen. MapWinGIS.ocx ist ein KOSTENLOSES und OPEN SOURCE C ++ - basiertes Programmiersystem für geografische Informationen, das ActiveX-Steuerelemente und Anwendungsprogrammierschnittstellen (Application Programmer Interface, API) enthält und in Windows Form in Visual Basic, C #, Delphi oder anderen Sprachen, die ActiveX unterstützen, hinzugefügt werden kann mit einer Karte.


1
+1. Hier ist ein Beispiel zum Erstellen eines Polygon-Shapefiles. Zu beachten ist, dass MapWinGIS 6 alpha im Kern DotSpatial verwendet. Wenn Sie den UI-Aspekt nicht benötigen, ist es möglicherweise einfacher und leichter, die relevanten Assemblys wie in meiner Antwort aus der DotSpatial-Bibliothek abzurufen.
blah238



1

Obwohl dies bereits beantwortet wurde, ist ein Vorschlag für jeden, der dies zu einem späteren Zeitpunkt betrachtet, auch EGIS (Easy GIS), mit dem Shapefiles Feature für Feature geschrieben werden können.

ShapeFileWriter sfw = ShapeFileWriter.CreateWriter(dir,fileName,shapeType,dataFieldHeadings);
sfw.AddRecord(pointArray, pointCount, fieldData);

Dies fügt dem Shapefile der Wahl eine Funktion hinzu, und die AddRecord-Methode verfügt über 7 Überladungen.


Könnten Sie ein Code-Snippet posten, das zeigt, wie dies getan werden kann? Die Antwort in ihrem aktuellen Zustand kann nicht für sich alleine stehen, falls die Verbindung unterbrochen wird.
Devdatta Tengshe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.