Domanda

Sql Server 2008 supporta i dati spaziali con nuove geometrie e geografie UDT. Entrambi supportano il metodo AsGml () per serializzare i dati in formato gml. Tuttavia serializzano i dati nel formato GML3. C'è un modo per dirgli di serializzare i dati in formato GML2?

È stato utile?

Soluzione 3

Come diceva Marko, non c'è supporto per gml2 in Sql Server 2008, quindi ho appena finito di scrivere una funzione per trasformare gml3 restituita dal server in gml2 di cui avevo bisogno.

Altri suggerimenti

AFAIK, non esiste una funzione integrata per serializzare i dati geospaziali su GML 2.x. È necessario utilizzare alcuni strumenti di terze parti, implementare uno scrittore youserlf o, questo suggerimento può sembrare un po 'strano, utilizzare PostGIS per questa transizione.

PostGIS è un database geospaziale alternativo, soluzione simile a SQL Server, ma che implementa de- / serializzazione per entrambi i formati: GML 2 e GML 3 .

Quello che suggerirei è di utilizzare PostGIS come memoria intermedia e di traduzione.

  1. Archivia i dati in GML 3 utilizzando le funzioni di SQL Server

  2. Carica dati serializzati su GML 3 usando la funzione PostGIS ST_GeomFromGML

  3. Archivia i dati da PostGIS al formato GML 2 utilizzando ST_AsGML che consente di specificare la versione di destinazione di GML: text ST_AsGML(integer version, geometry g1);

Può sembrare strano proporre un altro database geospaziale, ma sono sicuro che funzionerebbe abbastanza bene e senza problemi.

Non esiste supporto per GML2, ma esiste un'API di estensibilità che può essere utilizzata per implementare la serializzazione personalizzata.

Ecco un esempio di serializzazione personalizzata usando il metodo SqlGeometry.Populate (IGeometrySink) (codice 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(')');
    }
}

Per eseguire la deserializzazione, utilizzare la classe 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;

Bene, dato che hai finito non ha molto senso, ma consiglierei di mettere il geoserver davanti a SQL Server. Geoserver ha tutto il codice di serializzazione integrato per quasi tutti i formati desiderati, è facile da installare e funziona come pubblicizzato.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top