Poszukuję bezpłatnego programu Shapefile Writer dla platformy .NET

11

Szukam dobrze udokumentowanej biblioteki Open Source, która może tworzyć i zapisywać pliki shapefile z .NET. Potrzebuję dostępu z niższą dźwignią, tzn. Powinienem być w stanie pisać funkcja po funkcji.

Zbadałem i znalazłem:

Czy istnieje biblioteka, której można użyć do napisania nowego pliku kształtu?

Devdatta Tengshe
źródło

Odpowiedzi:

5

Sam go nie używałem, ale szybko przeglądam dokumentację DotSpatial , wygląda na to, że powinna być w stanie zrobić to, co chcesz.

Ma pojedyncze zestawy w NuGet, jeśli wiesz, których potrzebujesz (których ja nie potrzebuję).

Oto próbka, która przynajmniej pokazuje taką możliwość. Byłoby miło, gdyby istniał czytnik / konwerter WKT dla bardziej czytelnej próbki, ale wydaje się, że jej brakuje.

blah238
źródło
9

Czuję twój ból. Przeszedłem przez to samo z NetTopologySuite (v1.13) i odniosłem pewien sukces, patrząc na testy jednostkowe.

Po pierwsze, możesz sprawdzić bibliotekę DotSpatial, do której odwoływano się w podobnym pytaniu dotyczącym operacji na plikach kształtów DS

Jestem osobiście zadowolony z biblioteki NTS. Kiedy już wymyślisz model obiektowy, nie jest zbyt wielkim kłopotem, aby coś połączyć. Ponieważ do tego tematu prawdopodobnie będzie się odwoływać więcej niż raz, tutaj jest szybki zrzut kodu do pisania plików shapefile z NTS.

1) Pobierz pliki binarne NTS (1.13.0)

2) Odwołaj się do następujących zespołów:

-GeoAPI, NetTopologySuite, NetTopologySuite.IO, NetTopologySuite.IO.GeoTools (zgadnij, ile czasu zajęło ustalenie tego ostatniego)

3) Napisz kod (jest to 10-minutowe zadanie włamania)

dodaj za pomocą instrukcji dla NetTopologySuite, NetTopologySuite.IO, NetTopologySuite.Features, GeoAPI, GeoAPI.Geometries (przepraszam, nie wiem, jak uzyskać SO, aby je sformatować)

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

Więc nie jest to dobrze udokumentowane, ale warto zacząć od zrobienia zdjęcia.

WolfOdrade
źródło
2

Istnieje również shapelib: http://shapelib.maptools.org/

Opakowanie .NET jest wymienione na stronie internetowej.

Uffe Kousgaard
źródło
1

Możesz także rozważyć MapWinGIS .

MapWinGIS.ocx służy do zapewnienia funkcji GIS i mapowania do dowolnej aplikacji opartej na Windows Forms. MapWinGIS.ocx to BEZPŁATNY i OPEN SOURCE C ++ programujący system informacji geograficznej ActiveX Control i interfejs programisty aplikacji (API), który można dodać do formularza Windows w Visual Basic, C #, Delphi lub innych językach, które obsługują ActiveX, udostępniając twoją aplikację z mapą.

Hornbydd
źródło
1

Chociaż na to pytanie już udzielono odpowiedzi, sugestią dla osób przeglądających to w późniejszym terminie jest również EGIS (Easy GIS), który umożliwia zapisywanie plików kształtów według funkcji.

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

Dodaje to jedną funkcję do wybranego pliku kształtu, a metoda AddRecord ma 7 przeciążeń.

Alfie Goodacre
źródło
Czy możesz opublikować fragment kodu, który pokazuje, jak to zrobić? Odpowiedź w obecnym stanie nie może sama stać na wypadek, gdyby łącze przestało działać.
Devdatta Tengshe,
0

Mogę polecić EasyGIS. Pobierz najnowszą wersję ze strony https://www.easygisdotnet.com , dołącz EGIS.ShapeFileLibi za pomocą kilku wierszy utworzysz swój pierwszy plik kształtów. Poniższy kod tworzy plik kształtu wielokąta z jednym polem atrybutu „Nazwa” i jednym kształtem (prostokąt o nazwie „FirstRecord”).

DbfFieldDesc[] lFields = new DbfFieldDesc[1];
DbfFieldDesc fld1 = new DbfFieldDesc();
fld1.FieldName = "Name";
fld1.FieldType = DbfFieldType.Character;
fld1.FieldLength = 16;
lFields[0] = fld1;
ShapeFileWriter sfw = ShapeFileWriter.CreateWriter(sExportDir, "testShapeFile", ShapeType.Polygon, lFields);
PointD[] lPoints = new PointD[4];
lPoints[0] = new PointD(1, 1);
lPoints[1] = new PointD(1, 2);
lPoints[2] = new PointD(2, 2);
lPoints[3] = new PointD(2, 1);
String[] lFieldValues = new String[1];
lFieldValues[0] = "FirstRecord";
sfw.AddRecord(lPoints, 4, lFieldValues);
sfw.Close();
Ralph Elsaesser
źródło