1

Sql Server 2008 支持具有新几何和地理 UDT 的空间数据。它们都支持 AsGml() 方法以 gml 格式序列化数据。然而,它们将数据序列化为 GML3 格式。有什么方法可以告诉它将数据序列化为 GML2 格式吗?

4

4 回答 4

1

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

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

我的建议是使用 PostGIS 作为中间和翻译存储。

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

  2. 使用 PostGIS 函数ST_GeomFromGML加载序列化为 GML 3 的数据

  3. 使用ST_AsGML将PostGIS 中的数据存储为 GML 2 格式,它允许您指定 GML 的目标版本:text ST_AsGML(integer version, geometry g1);

提出另一个地理空间数据库可能听起来很奇怪,但我相信它会运行得相当顺利和良好。

于 2010-02-03T19:32:25.483 回答
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;
于 2009-01-30T17:03:01.110 回答
0

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

于 2009-02-14T12:02:33.657 回答
0

好吧,既然你完成了,没什么意义,但我建议将 geoserver 放在 SQL Server 前面。Geoserver 为您想要的几乎任何格式内置了所有序列化代码,易于安装,并且像宣传的那样工作。

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

于 2010-02-08T03:24:31.080 回答