2008-12-09 3 views
1

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

ответ

0

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

0

Поддержка 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; 
1

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

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

0

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

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

Смежные вопросы