هل من الممكن تصدير البيانات المكانية من Sql Server 2008 في gml2 تنسيق ؟

StackOverflow https://stackoverflow.com/questions/352814

سؤال

يدعم Sql Server 2008 البيانات المكانية مع الهندسة والجغرافيا UDT هو.كلاهما دعم AsGml() طريقة إجراء تسلسل البيانات في gml الشكل.إلا أنها تسلسل البيانات في GML3 الشكل.هل هناك أي طريقة لمعرفة ذلك إلى إجراء تسلسل البيانات في GML2 تنسيق ؟

هل كانت مفيدة؟

المحلول 3

وكما قال ماركو، لا يوجد أي دعم لgml2 في SQL Server 2008، لذلك انتهى بي للتو كتابة وظيفة لتحويل gml3 إرجاعها من قبل الملقم إلى gml2 بأنني في حاجة.

نصائح أخرى

AFAIK ، ليس هناك المدمج في ميزة إجراء تسلسل البيانات الجغرافية المكانية إلى GML 2.x.تحتاج إلى استخدام بعض أدوات طرف ثالث ، وتنفيذ كاتب youserlf أو هذا اقتراح قد يبدو غريبا بعض الشيء ، استخدام PostGIS من أجل هذا الانتقال.

PostGIS هو البديل قاعدة البيانات الجغرافية المكانية ، على غرار الحل في SQL Server ولكن تنفيذ دي-/التسلسل لكل صيغ:GML 2 و 3 GML.

ما أقترحه هو استخدام PostGIS كوسيط وترجمة التخزين.

  1. تخزين البيانات GML 3 باستخدام SQL Server وظائف

  2. تحميل البيانات تسلسل إلى GML 3 باستخدام PostGIS وظيفة ST_GeomFromGML

  3. تخزين البيانات من PostGIS إلى GML 2 الشكل باستخدام ST_AsGML والذي يسمح لك لتحديد الهدف نسخة من 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;

وحسنا منذ الانتهاء ليس هناك فائدة كبيرة ولكن أنصح وضع geoserver أمام من SQL Server. Geoserver لديه كل رمز التسلسل بنيت في أي شكل تقريبا تريد، من السهل تشيزي التركيب، ويعمل كما هو معلن.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top