Существует ли бесплатная программа для написания шейп-файлов с открытым исходным кодом для .NET?

12

Я ищу хорошо документированную библиотеку OpenSource, которая может создавать и писать в шейп-файл из .Net. Мне нужен более низкий доступ к рычагу: т.е. я должен быть в состоянии написать функцию за функцией.

Существует ли такая библиотека?

Я исследовал и обнаружил следующее:

  • SharpMap утверждает, что пишет в шейп-файлы в версии 2.0, но эта версия еще не выпущена.
  • У НТС нет абсолютно никакой документации.
  • Читатель шейп-файла Catfood предоставляет доступ только для чтения.

Есть ли надежда для меня? Есть ли библиотека, которую можно использовать для написания нового шейп-файла?

Девдатта Тенгше
источник
1
У NTS есть документация - она ​​есть только в коде (например, code.google.com/p/nettopologysuite/source/browse/trunk/… ) и в нескольких тестах. Иногда помогает чтение документов JTS.
BradHards

Ответы:

5

Я не использовал его сам, но быстро просматривал документацию по DotSpatial , похоже, он сможет делать то, что вы хотите.

Он имеет отдельные сборки на NuGet, если вы знаете, какие из них вам нужны (а я нет).

Вот пример, который по крайней мере демонстрирует возможность. Было бы неплохо, если бы был читатель / конвертер WKT, чтобы сделать его более читабельным, но этого, похоже, не хватает.

blah238
источник
1
Я последовал вашему совету и нашел этот документ ( dotspatial.codeplex.com/… ), в котором показано, что я хочу сделать.
Девдатта Тенгше
9

Я чувствую твою боль. Я проделал то же самое с NetTopologySuite (v1.13) и с некоторым успехом посмотрел на модульные тесты.

Во-первых, вы можете проверить библиотеку DotSpatial, на которую ссылался аналогичный вопрос, специфичный для операций с шейп- файлом DS.

Я лично доволен библиотекой NTS. Как только вы выясните объектную модель, вам не составит труда собрать что-то вместе. Поскольку на эту тему, вероятно, будут ссылаться более одного раза, здесь приведен быстрый дамп кода для записи шейп-файлов из NTS.

1) Скачать бинарники NTS (1.13.0)

2) Ссылка на следующие сборки:

-GeoAPI, NetTopologySuite, NetTopologySuite.IO, NetTopologySuite.IO.GeoTools (угадайте, сколько времени потребовалось, чтобы выяснить, что требуется последний)

3) Напишите некоторый код (это 10-минутная хакерская работа)

добавить операторы использования для NetTopologySuite, NetTopologySuite.IO, NetTopologySuite.Features, GeoAPI, GeoAPI.Geometries (извините, я не могу понять, как получить SO для их форматирования)

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

Так что, не очень хорошо документировано, но это справедливо, если вы начнете.

WolfOdrade
источник
Я забыл о подобном ответе специально для DotSpatial gis.stackexchange.com/questions/5816/… , но я довольно доволен NTS.
WolfOdrade
Именно вы ответили на этот вопрос, что привело меня к следующему: dotspatial.codeplex.com/… именно это я и искал.
Девдатта Тенгше
2

Похоже, у gdal есть библиотека ac #: http://trac.osgeo.org/gdal/wiki/GdalOgrInCsharp

CLJ
источник
Можете ли вы показать мне некоторую документацию, где вы можете написать функцию шейп-файла за функцией, используя эту привязку C #? Я пытался, но ничего не нашел.
Девдатта Тенгше
1
Как правило, привязки SWIG плохо документированы, но в github.com/OSGeo/gdal/tree/trunk/gdal/swig/csharp/apps имеется множество примеров , и большая часть кода должна быть очень похожа на C ++. версия.
Scw
1

Вы также можете рассмотреть MapWinGIS .

MapWinGIS.ocx используется для предоставления ГИС и картографических функций любому приложению на основе Windows Forms. MapWinGIS.ocx - это БЕСПЛАТНЫЙ и ОТКРЫТЫЙ ИСТОЧНИК СИСТЕМЫ, основанный на C ++, программирующий ActiveX Control и интерфейс прикладного программиста (API), который можно добавить в форму Windows на Visual Basic, C #, Delphi или других языках, поддерживающих ActiveX, предоставляя ваше приложение. с картой.

Hornbydd
источник
1
+1. Вот пример, демонстрирующий создание шейп-файла полигона. Следует отметить, что альфа-версия MapWinGIS 6 использует DotSpatial в своей основе. Если вам не нужен аспект пользовательского интерфейса, может быть проще и легче просто получить соответствующие сборки из библиотеки DotSpatial, как в моем ответе.
blah238
1

Может быть, натянуто, но ...

PyShp предоставляет вам управление шейп-файлом на уровне объектов или более в чистом Python: http://code.google.com/p/pyshp/

IronPython позволяет запускать чистые сценарии Pythin в .NET CLR: http://ironpython.net/

Превратите сценарий IronPython в библиотеку .Net, такую ​​как этот поток: /programming/1578010/ironpython-2-6-py-exe/9609120#9609120

GeospatialPython.com
источник
1

Хотя на этот вопрос уже был дан ответ, для тех, кто просматривает его позднее, также предлагается EGIS (Easy GIS), который позволяет шейп-файлам записываться по элементам.

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

Это добавляет одну особенность к выбранному шейп-файлу, а метод AddRecord имеет 7 перегрузок.

Альфи Гудэйкр
источник
Не могли бы вы опубликовать фрагмент кода, который показывает, как это можно сделать? Ответ в его текущем состоянии не может стоять сам по себе, в случае, если ссылка не работает.
Девдатта Тенгше