1

Sql Server 2008 は、新しいジオメトリおよび地理 UDT で空間データをサポートします。どちらも AsGml() メソッドをサポートして、データを gml 形式でシリアル化します。ただし、データを GML3 形式にシリアル化します。データを GML2 形式にシリアル化するように指示する方法はありますか?

4

4 に答える 4

1

私の知る限り、地理空間データを GML 2.x にシリアル化する組み込み機能はありません。いくつかのサードパーティ ツールを使用するか、ライターを実装するか、この提案は少し奇妙に聞こえるかもしれませんが、この移行にはPostGISを使用する必要があります。

PostGIS は代替の地理空間データベースであり、SQL Server と同様のソリューションですが、GML 2 と GML 3 の両方の形式の逆シリアル化を実装しています。

私が提案したいのは、PostGIS を中間および翻訳ストレージとして使用することです。

  1. SQL Server 関数を使用してデータを GML 3 に保存する

  2. PostGIS 関数ST_GeomFromGMLを使用して GML 3 にシリアル化されたデータをロードする

  3. GMLのターゲット バージョンを指定できるST_AsGMLを使用して、PostGIS から GML 2 形式にデータを保存します。text ST_AsGML(integer version, geometry g1);

別の地理空間データベースを提案するのは奇妙に聞こえるかもしれませんが、かなりスムーズにうまく機能すると確信しています。

于 2010-02-03T19:32:25.483 に答える
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 に答える
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 に答える