Sql Server 2008 支持具有新几何和地理 UDT 的空间数据。它们都支持 AsGml() 方法以 gml 格式序列化数据。然而,它们将数据序列化为 GML3 格式。有什么方法可以告诉它将数据序列化为 GML2 格式吗?
4 回答
AFAIK,没有将地理空间数据序列化为 GML 2.x 的内置功能。您需要使用一些第三方工具,自己实现一个作家,或者,这个建议可能听起来有点奇怪,使用PostGIS进行这种转换。
PostGIS 是替代地理空间数据库,与 SQL Server 类似的解决方案,但实现了两种格式的反序列化: GML 2 和 GML 3。
我的建议是使用 PostGIS 作为中间和翻译存储。
使用 SQL Server 函数将数据存储到 GML 3
使用 PostGIS 函数ST_GeomFromGML加载序列化为 GML 3 的数据
使用ST_AsGML将PostGIS 中的数据存储为 GML 2 格式,它允许您指定 GML 的目标版本:
text ST_AsGML(integer version, geometry g1);
提出另一个地理空间数据库可能听起来很奇怪,但我相信它会运行得相当顺利和良好。
不支持 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;
正如 Marko 所说,Sql Server 2008 中不支持 gml2,所以我最终编写了一个函数,用于将服务器返回的 gml3 转换为我需要的 gml2。
好吧,既然你完成了,没什么意义,但我建议将 geoserver 放在 SQL Server 前面。Geoserver 为您想要的几乎任何格式内置了所有序列化代码,易于安装,并且像宣传的那样工作。
http://docs.geoserver.org/2.0.x/en/user/services/wfs/outputformats.html