是否可以以gml2格式从Sql Server 2008导出空间数据?

时间:2008-12-09 14:03:45

标签: sql-server-2008 spatial gml-geographic-markup-lan

Sql Server 2008支持具有新几何和地理UDT的空间数据。它们都支持AsGml()方法以gml格式序列化数据。但是,他们将数据序列化为GML3格式。有没有办法告诉它将数据序列化为GML2格式?

4 个答案:

答案 0 :(得分:1)

AFAIK,没有内置功能可以将地理空间数据序列化为GML 2.x.你需要使用一些第三方工具,实现一个作家youserlf,或者这个建议可能听起来有点奇怪,使用PostGIS进行此转换。

PostGIS是替代地理空间数据库,类似于SQL Server的解决方案,但为两种格式实施解/序列化:GML 2和GML 3

我建议将PostGIS用作中间存储和翻译存储。

  1. 使用SQL Server函数将数据存储到GML 3

  2. 使用PostGIS函数ST_GeomFromGML

  3. 将序列化的数据加载到GML 3
  4. 使用ST_AsGML将数据从PostGIS存储到GML 2格式,允许您指定GML的目标版本:text ST_AsGML(integer version, geometry g1);

  5. 提出另一个地理空间数据库可能听起来很奇怪,但我相信它会相当顺利地工作。

答案 1 :(得分: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;

答案 2 :(得分:0)

正如Marko所说,在Sql Server 2008中不支持gml2,所以我最终编写了一个函数,用于将服务器返回的gml3转换为我需要的gml2。

答案 3 :(得分:0)

好了,你完成后没有多大意义,但我建议将geoserver放在SQL Server前面。 Geoserver拥有内置的所有序列化代码,几乎可以用于任何您想要的格式,安装起来很容易,并且可以像宣传的那样工作。

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