ArcObjectsを使用してファイルジオデータベースの高精度データセットを低精度に変換しますか?


8

高精度のデータセットがファイルジオデータベースからarcsde 9.3.1に読み込まれました。データロードは、ArcCatalogでのコピー/貼り付けによって実現されました。

データセットから低精度のパーソナルジオデータベースに抽出するカスタムツール(arcobjects)が、出力フィーチャクラスを作成しようとすると失敗するようになりました。

パーソナルジオデータベースをsdeから抽出する他のすべてのデータセットは低精度であるため、パーソナルジオデータベースを高精度にアップグレードすることはできません。

高精度のデータセットをダウングレードできますか?


新しい、低精度のデータセットを作成してから、高精度データをインポートすることを検討しましたか?これはモデルビルダーでさらに自動化できます。
Jakub Sisak GeoGraphics

データセットが非常に大きいため、再読み込みを回避する方法を探していますが、それが唯一の方法である可能性があります。
nef001

精度とは、データセットの数値的な精度(float16とfloat32など)または詳細を意味しますか?
Paul Hiemstra、2011

ESRIが9.3をリリースしたとき、彼らはいわゆる高精度空間参照を導入し、9.3より前のジオデータベースを高精度にアップグレードするツールを提供しました。ただし、高精度のデータセットを低精度のジオデータベースに抽出することはできません。
nef001 2012年

実際には9.2
nef001 2012年

回答:


2

結局、カスタム抽出コードを変更して、ソースとデスティネーションの空間参照の精度を考慮に入れることで、これを解決しました。

コード:

        public ISpatialReference createDestinationSpatialRef(IGeoDataset srcDataset, IFeatureWorkspace destinationWorkspace)
        {
            ISpatialReference result = srcDataset.SpatialReference;
            IControlPrecision2 sourceDatasetPrecision = result as IControlPrecision2;

            if (sourceDatasetPrecision.IsHighPrecision)
            {
                if (geodatabaseSupportsHighPrecision(destinationWorkspace))
                {
                    // HP to HP, no conversion
                }
                else
                {
                    IEnvelope extent = srcDataset.Extent;
                    result = ConvertSpatialReferenceFromHighToLowPrecision(result, extent);
                }
            }
            else
            {
                if (geodatabaseSupportsHighPrecision(destinationWorkspace))
                {
                    result = ConvertSpatialReferenceFromLowToHighPrecision(result, -1, 0, 0);
                }
                else
                {
                    // LP to LP, no conversion
                }
            }

            return result;
        }

        public bool geodatabaseSupportsHighPrecision(IFeatureWorkspace fws)
        {
            IGeodatabaseRelease2 release = fws as IGeodatabaseRelease2;
            // geodatabase release is numbered 2.2 at 9.2
            return ((release != null) && ((release.MajorVersion + 7) >= 9) && (release.MinorVersion >= 2));
        }



        /// <summary>
        /// Converts an existing low precision spatial reference and returns a new high precision spatial reference.
        /// </summary>
        /// <param name="lowSpatialReference">An ISpatialReference interface that is the low spatial reference to be converted.</param>
        /// <param name="xyDoubler">A System.Int32 that is the amount of doubling (2^x) based on the input resolution; -1 produces a value close to the default resolution. Example: -1</param>
        /// <param name="mDoubler">A System.Int32 that determines doubling of m-resolution based on input m-resolution; the default is 0. Example: 0</param>
        /// <param name="zDoubler">A System.Int32 that determines doubling of z-resolution based on input z-resolution; default is 0. Example: 0</param>
        /// <returns>An ISpatialReference interface that is the new high precision spatial reference.</returns>
        public ISpatialReference ConvertSpatialReferenceFromLowToHighPrecision(ISpatialReference lowSpatialReference, int xyDoubler, int mDoubler, int zDoubler)
        {
            IControlPrecision2 controlPrecision2 = lowSpatialReference as IControlPrecision2;
            if (controlPrecision2.IsHighPrecision)
                throw new ArgumentException("Expected a low precision spatial reference.", "lowSpatialReference");

            ISpatialReferenceFactory3 spatialReferenceFactory3 = new SpatialReferenceEnvironmentClass();
            ISpatialReference highSpatialReference = spatialReferenceFactory3.ConstructHighPrecisionSpatialReference(lowSpatialReference, xyDoubler, zDoubler, mDoubler);
            return highSpatialReference;
        }


        /// <summary>
        /// Converts an existing high precision spatial reference and returns a new low precision spatial reference.
        /// </summary>
        /// <param name="highSpatialReference">An ISpatialReference interface that is a high precision spatial reference.</param>
        /// <param name="envelope">An IEnvelope that is the area covering the extent of the new low precision spatial reference.</param>
        /// <returns>An ISpatialReference interface that is the new low precision spatial reference.</returns>
        public ISpatialReference ConvertSpatialReferenceFromHighToLowPrecision(ISpatialReference highSpatialReference, IEnvelope envelope)
        {
            IControlPrecision2 controlPrecision2 = highSpatialReference as IControlPrecision2;
            if (!controlPrecision2.IsHighPrecision)
                throw new ArgumentException("Expected a high precision spatial reference.", "highSpatialReference");
            ISpatialReference lowSpatialReference = null;

            ISpatialReferenceFactory3 spatialReferenceFactory3 = new SpatialReferenceEnvironmentClass();
            try
            {
                lowSpatialReference = spatialReferenceFactory3.ConstructLowPrecisionSpatialReference(true, highSpatialReference, envelope);
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                if (ex.ErrorCode == -2147220986)
                {
                    lowSpatialReference = spatialReferenceFactory3.ConstructLowPrecisionSpatialReference(false, highSpatialReference, envelope);
                }
            }
            return lowSpatialReference;
        }

1

ArcGIS 9.0 / 9.1 / 9.2バージョンの古いEsri ArcTutorデータは常に保持しています。使用されるジオデータベースは精度が低く、精度を変更する必要がある場合は、データのインポート/エクスポートのテンプレートとしていつでも使用できます。Esri担当者に相談するか、ソフトウェアの共有ドライブを見てください。おそらく、この目的に使用できる古いArcTutorデータまたは古いArcGISジオデータベースが見つかるでしょう。


-1

数値に小数位がある場合、たとえば10.343243とすると、arcmap属性データベースでleft({column name}、#preserved)関数を使用できます。正確さは劣りますが10.343を提供します。

数値が10343243の場合、同じ関数を再度使用できます。最初の関数の後の数値にゼロを追加するだけです。初歩的な丸めのようなものです。

理にかなっていますか?


おかげで、この質問はジオデータベースのESRI空間参照の精度に関係しています。
nef001 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.