Chuyển đổi tập dữ liệu có độ chính xác cao trong cơ sở dữ liệu địa lý tệp sang độ chính xác thấp bằng ArcObjects?


8

Một bộ dữ liệu có độ chính xác cao đã được tải từ cơ sở dữ liệu địa lý tệp vào arcsde 9.3.1. Tải dữ liệu đã đạt được bằng cách sao chép / dán trong ArcCatalog.

Một công cụ tùy chỉnh (arcobjects) trích xuất từ ​​tập dữ liệu sang cơ sở dữ liệu địa lý cá nhân có độ chính xác thấp hiện không thành công khi cố gắng tạo lớp tính năng đầu ra.

Việc nâng cấp cơ sở dữ liệu địa lý cá nhân lên độ chính xác cao là không khả thi vì tất cả các bộ dữ liệu khác mà nó trích xuất từ ​​sde đều có độ chính xác thấp.

Tập dữ liệu có độ chính xác cao có thể bị hạ cấp không?


Bạn có cân nhắc việc tạo một bộ dữ liệu mới, độ chính xác thấp, sau đó nhập dữ liệu có độ chính xác cao vào nó không? Điều này có thể được tự động hơn nữa với người xây dựng mô hình.
Jakub Sisak GeoGraphics

Tìm kiếm một cách để tránh tải lại vì tập dữ liệu quá lớn, nhưng nó có thể là cách duy nhất.
nef001

Theo độ chính xác, bạn có nghĩa là tiền số (ví dụ float16 so với float32) hoặc chi tiết trong bộ dữ liệu?
Paul Hiemstra

Khi ESRI phát hành 9.3, họ đã giới thiệu cái gọi là tham chiếu không gian có độ chính xác cao và cung cấp các công cụ để nâng cấp cơ sở dữ liệu địa lý trước 9.3 lên độ chính xác cao. Nhưng bạn không thể trích xuất một tập dữ liệu có độ chính xác cao sang cơ sở dữ liệu địa lý chính xác thấp.
nef001

Trên thực tế, đó là 9,2
nef001

Câu trả lời:


2

Tôi đã kết thúc việc giải quyết điều này bằng cách sửa đổi mã trích xuất tùy chỉnh để tính đến độ chính xác của các refs không gian nguồn và đích.

Mã số:

        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

Tôi luôn giữ dữ liệu Esri ArcTutor cũ cho các phiên bản ArcGIS 9.0 / 9.1 / 9.2. Các cơ sở dữ liệu địa lý được sử dụng có độ chính xác thấp và tôi luôn có thể sử dụng chúng làm khuôn mẫu để nhập / xuất dữ liệu khi tôi cần thay đổi độ chính xác. Nói chuyện với đại diện Esri của bạn hoặc xem xét các ổ đĩa được chia sẻ phần mềm của bạn, có lẽ bạn sẽ tìm thấy một số dữ liệu ArcTutor cũ hoặc có thể là cơ sở dữ liệu địa lý ArcGIS cũ có thể phục vụ cho mục đích này.


-1

Chà, nếu có một số thập phân trong số, giả sử 10.343243 bạn chỉ có thể sử dụng hàm trái ({tên cột}, #preserved) trong cơ sở dữ liệu thuộc tính arcmap. Cung cấp cho bạn 10.343, sẽ ít chính xác hơn.

Nếu số là 10343243, bạn có thể sử dụng lại hàm tương tự, chỉ thêm số không trở lại vào số sau hàm ban đầu. Sắp xếp một vòng tròn thô sơ.

Có lý?


Cảm ơn nhưng câu hỏi này liên quan đến độ chính xác của các tham chiếu không gian ESRI trong cơ sở dữ liệu địa lý.
nef001
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.