Microsoft SQL Geometryはそんなに優秀なのか? – 1 –


MS SQL Geometry STBuffer 対 ArcObjects Bufferの速度比較
結論から言うと手持ち環境にてArcGISの圧勝

やはり空間データ関連では一日の長だけある? > コードミスってなければ。。。
Bufferだけではつまらないのでまた試そう

環境書くのを忘れていたので追記
SQL Server 2008 R2(用のDLL)
ArcGIS 10.0

次記事

結果
msTime:24511.4019ms
esriTime:354.0203ms
msTime:22539.2892ms
esriTime:431.0246ms
msTime:22303.2757ms
esriTime:314.018ms
msTime:23487.3434ms
esriTime:352.0201ms
msTime:23640.3521ms
esriTime:440.0252ms

テストデータはランダム地点2万点

ちなみに環境やコードに依存するので速いor遅いと言う時は再現コードと
テストデータ等をある程度書かないと無意味ということを理解しておく必要がある。

試したコードは以下

public static void TEST(string gdbPath, string name)
{
    using (ComReleaser lifetime = new ComReleaser())
    {
        Type t = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
        IWorkspaceFactory2 wsf = (IWorkspaceFactory2)Activator.CreateInstance(t);
        lifetime.ManageLifetime(wsf);

        IFeatureWorkspace fw = (IFeatureWorkspace)wsf.OpenFromFile(gdbPath, 0);
        lifetime.ManageLifetime(fw);
        IFeatureClass fc = fw.OpenFeatureClass(name);
        lifetime.ManageLifetime(fc);

        IFeature feature = null;
        IFeatureCursor cursor = fc.Search(null, false);
        lifetime.ManageLifetime(cursor);

        List<ITopologicalOperator> topoList = new List<ITopologicalOperator>();;
        List<SqlGeometry> sqlGeomList = new List<SqlGeometry>();

        Type geomType = Type.GetTypeFromProgID("esriGeometry.GeometryEnvironment");
        IGeometryFactory3 geomfact = (IGeometryFactory3)Activator.CreateInstance(geomType);
        lifetime.ManageLifetime(geomfact);

        while ((feature = cursor.NextFeature()) != null)
        {
            byte[] shape = (byte[])geomfact.CreateWkbVariantFromGeometry(feature.Shape);

            System.Data.SqlTypes.SqlBytes bytes = new SqlBytes(shape);
            Microsoft.SqlServer.Types.SqlGeometry geom = SqlGeometry.STGeomFromWKB(bytes, 0);

            sqlGeomList.Add(geom);
            topoList.Add((ITopologicalOperator)feature.ShapeCopy);
        }
        for (int i = 0; i < 5; i++)
        {
            DateTime dt = DateTime.Now;

            foreach (var item in topoList)
            {
                item.Buffer(500d);
            }

            TimeSpan esriTime = DateTime.Now - dt;

            dt = DateTime.Now;

            foreach (var item in sqlGeomList)
            {
                item.STBuffer(500d);
            }

            TimeSpan msTime = DateTime.Now - dt;

            string msg = string.Format("msTime:{0}ms\nesriTime:{1}ms", msTime.TotalMilliseconds, esriTime.TotalMilliseconds);
            Console.WriteLine(msg);
        }

        foreach (var item in topoList)
        {
            ComReleaser.ReleaseCOMObject(item);
        }
        topoList.Clear();
        topoList = null;

    }//end com
}//end method
カテゴリー: 開発, 設計 タグ: パーマリンク