Можно ли экспортировать пространственные данные из Sql Server 2008 в формате gml2? - PullRequest
1 голос
/ 09 декабря 2008

Sql Server 2008 поддерживает пространственные данные с новой UDT геометрии и географии. Они оба поддерживают метод AsGml () для сериализации данных в формате gml. Однако они сериализуют данные в формат GML3. Есть ли способ сказать ему, чтобы сериализовать данные в формате GML2?

Ответы [ 4 ]

1 голос
/ 03 февраля 2010

AFAIK, нет встроенной функции для сериализации геопространственных данных в GML 2.x. Вам нужно использовать некоторые сторонние инструменты, реализовать собственный писатель youserlf или, это предложение может показаться немного странным, использовать PostGIS для этого перехода.

PostGIS - это альтернативная геопространственная база данных, похожая на SQL Server, но с реализацией де-сериализации для обоих форматов: GML 2 и GML 3 .

Я бы предложил использовать PostGIS в качестве промежуточного и переводящего хранилища.

  1. Сохранение данных в GML 3 с использованием функций SQL Server

  2. Загрузка данных, сериализованных в GML 3, с использованием функции PostGIS ST_GeomFromGML

  3. Сохранение данных из PostGIS в формат GML 2 с использованием ST_AsGML , что позволяет указать целевую версию GML: text ST_AsGML(integer version, geometry g1);

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

0 голосов
/ 08 февраля 2010

Ну, так как вы закончили, нет особого смысла, но я бы порекомендовал поместить геосервер перед SQL Server. Geoserver имеет весь код сериализации, встроенный практически для любого формата, который вы можете легко установить, и работает так, как рекламируется.

http://docs.geoserver.org/2.0.x/en/user/services/wfs/outputformats.html

0 голосов
/ 14 февраля 2009

Как сказал Марко, в Sql Server 2008 нет поддержки gml2, поэтому я просто написал функцию преобразования gml3, возвращенного сервером, в gml2, который мне был нужен.

0 голосов
/ 30 января 2009

GML2 не поддерживается, но есть API расширяемости, который можно использовать для реализации настраиваемой сериализации.

Вот пример пользовательской сериализации с использованием метода SqlGeometry.Populate (IGeometrySink) (код C #):

CustomWriter w = new CustomWriter();
SqlGeometry.Parse("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))").Populate(w);
System.Console.WriteLine(w);

public class CustomWriter : IGeometrySink {
    private StringBuilder _builder = new StringBuilder();

    public string ToString() {
        return _builder.ToString();
    }

    public void SetSrid(int srid) {
        _builder.Append('@');
        _builder.Append(srid);
    }

    public void BeginGeometry(OpenGisGeometryType type) {
        _builder.Append(" (");
        _builder.Append(type);
    }

    public void BeginFigure(double x, double y, double? z, double? m) {
        _builder.Append(" [");
        _builder.Append(x);
        _builder.Append(' ');
        _builder.Append(y);
    }

    public void AddLine(double x, double y, double? z, double? m) {
        _builder.Append(',');
        _builder.Append(x);
        _builder.Append(' ');
        _builder.Append(y);
    }

    public void EndFigure() {
        _builder.Append(']');
    }

    public void EndGeometry() {
        _builder.Append(')');
    }
}

Для десериализации используйте класс SqlGeometryBuilder:

// Create "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))" using Builder API
SqlGeometryBuilder b = new SqlGeometryBuilder();
b.SetSrid(0);
b.BeginGeometry(OpenGisGeometryType.Polygon);
    b.BeginFigure(0, 0);
    b.AddLine(10, 0);
    b.AddLine(10, 10);
    b.AddLine(0, 10);
    b.AddLine(0, 0);
    b.EndFigure();
b.EndGeometry();
SqlGeometry g = b.ConstructedGeometry;
...