Tính toán lại toàn bộ phạm vi của lớp tính năng File Geodatabase?


19

Tôi có một featureclass trong một cơ sở dữ liệu địa lý tập tin Esri. Khi tôi chỉnh sửa các tính năng bằng trình chỉnh sửa trong ArcMap và tôi xóa hầu hết các tính năng của mình và chỉ giữ các tính năng ở giữa, lệnh thu phóng đến lớp không hoạt động như mong đợi. Thay vì phóng to đến mức các tính năng còn lại trong lớp tính năng, phạm vi sẽ là tính năng trước đây (chứa tất cả các tính năng đã xóa). Khi xem xét các giá trị phạm vi trong hộp thoại thuộc tính cho lớp đối tượng, tôi có thể thấy rõ các giá trị cũ. Vì vậy, phiên chỉnh sửa dường như không thay đổi các giá trị phạm vi đầy đủ.

Có cách nào để tính toán lại các giá trị này?

Tôi khá chắc chắn rằng vấn đề này sẽ xảy ra với mọi người trong việc chỉnh sửa các tính năng trong ArcMap ...


1
Thật không may Arc: REBOX không được dịch thành công cụ ArcGIS :-)
PolyGeo

Câu trả lời:


6

Esri hiện có một công cụ cho việc này trong 10,4 (hooray): Tính toán lại lớp tính năng mở rộng.

Tôi đã gặp phải vấn đề này khi tôi đang tạo một lớp đối tượng và viết hình học vào đó bằng arcpy. Rõ ràng những công cụ đó không cập nhật phạm vi (có thể là một ý tưởng tốt cho lý do hiệu suất).

Tôi đã đặt lại thành công phạm vi trong 10.2.2 với đề xuất của @Lou:

arcpy.CompressFileGeodatabaseData_management(output_workspace)
arcpy.UncompressFileGeodatabaseData_management(output_workspace)

19

Bấm chuột phải vào lớp tính năng trong ArcCatalog và đi đến Thuộc tính. Trong tab Tính năng mở rộng, nhấp vào Tính toán lại. Và Voila!

Tôi đang sử dụng ArcGIS 10.2.1


6

Nén cơ sở dữ liệu địa lý sẽ dọn dẹp chỉ số không gian của bạn

"Nếu bạn thường xuyên thêm và xóa dữ liệu, bạn nên nén tệp hoặc cơ sở dữ liệu địa lý cá nhân hàng tháng. Bạn cũng nên nén cơ sở dữ liệu địa lý sau bất kỳ thay đổi quy mô lớn nào. Nén gọn lưu trữ bằng cách sắp xếp lại các bản ghi và loại bỏ không gian không sử dụng. dữ liệu trong mỗi tệp có thể được truy cập hiệu quả hơn. Nén cũng làm giảm kích thước của mỗi tệp. Có thể giảm kích thước của cơ sở dữ liệu địa lý xuống một nửa hoặc hơn. "

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/Compacting_file_and_personal_geodatabase/003n0000007t000000/

Nhỏ gọn (Quản lý dữ liệu)

"Nên nén cơ sở dữ liệu địa lý cá nhân khi chúng có dung lượng lớn hơn 250 MB. Nếu nhập dữ liệu, xóa hoặc chỉnh sửa chung thường được thực hiện trên cơ sở dữ liệu, cơ sở dữ liệu nên được nén thường xuyên để đảm bảo hiệu suất tối ưu."

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000000n000000


4
Nếu bạn đang thực hiện xóa lớn, đây là một việc quan trọng cần làm (đặc biệt đối với cơ sở dữ liệu địa lý lớn hơn). Cá nhân tôi đã không có nó đáng tin cậy khắc phục vấn đề phạm vi, nhưng đó chắc chắn là một ý tưởng tốt.
Lou


5

GeoDatabase Extent luôn mở rộng - không bao giờ rút ngắn tự động. Nén và nén chỉ tối ưu hóa lưu trữ và phân mảnh, nhưng không phải là bản thân Extent. Tôi sẽ thử tạo lại chỉ số không gian trước và xem liệu đó có phải là mẹo hay không.

Cập nhật:

Vì việc xây dựng lại chỉ mục không gian không thực hiện được mẹo, tôi chắc chắn mã VBA sau sẽ:

Public Sub reCalcExt()
  Dim pGXApplication As IGxApplication
  Set pGXApplication = Application

  Dim pGxObject As IGxObject
  Set pGxObject = pGXApplication.SelectedObject

  If Not TypeOf pGxObject.InternalObjectName Is IFeatureClassName Then
    Exit Sub
  End If

  Dim pName As IName
  Set pName = pGxObject.InternalObjectName
  Dim pSchemaLock As ISchemaLock
  Set pSchemaLock = pName.Open

  pSchemaLock.ChangeSchemaLock esriExclusiveSchemaLock
  Dim pFeatureClassManage As IFeatureClassManage
  Set pFeatureClassManage = pSchemaLock
  pFeatureClassManage.UpdateExtent

  Exit Sub

ErrHandler:
  pSchemaLock.ChangeSchemaLock esriSharedSchemaLock
End Sub

Bạn có thể làm điều này trong bất kỳ ngôn ngữ lập trình được hỗ trợ ESRI nào khác. Mẹo nhỏ là lấy schemalock và sử dụng phương thức IFeatureClassManage :: UpdateExtent .


Tôi đã thử tạo lại chỉ mục không gian trên một tập dữ liệu mẫu và điều đó không giúp ích gì trong trường hợp thử nghiệm của tôi. Tôi thật sự ngạc nhiên.
Lou

Cập nhật câu trả lời của tôi với một số mã sau đó.
Ragi Yaser Burhum

Bằng cách này, đây là mã VBA ArcCatalog.
Ragi Yaser Burhum

4

Tôi không biết chính xác nguyên nhân gây ra nó trong Cơ sở dữ liệu địa lý tệp, nhưng tôi thực sự có thể sao chép nó và đó là điều tôi đã phải đối mặt trước đây. Cách duy nhất tôi có thể tìm ra cách vượt qua nó là Nén tệp cơ sở dữ liệu địa lý. Điều đó sẽ khắc phục vấn đề phạm vi. Bạn sẽ cần giải nén nó khi hoàn thành, vì bạn không thể chỉnh sửa cơ sở dữ liệu địa lý tệp nén.

Trong phiên chỉnh sửa / ArcMap khi bạn thực sự sử dụng dữ liệu, bạn luôn có thể chọn tất cả | thu phóng để chọn làm giải pháp thay thế. Nó không tuyệt lắm, nhưng tôi đã sử dụng nó trong quy trình làm việc của mình cho đến khi tôi đạt đến một điểm đột phá nơi tôi có thể thực hiện thủ thuật nén / giải nén đó.

Lưu ý, Nén sẽ không hoạt động (ít nhất, không đáng tin cậy). Nó sẽ xây dựng lại các chỉ số của bạn, nhưng tôi thấy nó không đáng tin cậy để khắc phục các vấn đề về phạm vi. Thỉnh thoảng vẫn là điều bạn nên làm. Tôi vừa thử lại ngay bây giờ và nó không hoạt động trên tập dữ liệu mẫu của tôi. YMMV.


Bạn cũng có thể di chuyển các lớp đối tượng sang cơ sở dữ liệu địa lý / shapefile mới, nhưng tôi rất nghi ngờ đó là một câu trả lời chấp nhận được. Tuy nhiên, trong trường hợp kỳ lạ đó là một phần trong quy trình làm việc của bạn (đóng gói dữ liệu để phân phối), nó có thể hoạt động cho bạn và không yêu cầu thêm các bước.
Lou

3

Nếu bạn muốn cập nhật phạm vi tính năng phân loại trong tài liệu mxd của mình, đoạn mã này có thể giúp bạn:

Dim pLayer As ILayer
        Dim pEnumLayer As IEnumLayer
        Dim pFeatureLayer As IFeatureLayer
        Dim pFeatureClass As IFeatureClass
        Dim pFeatureClassManage As IFeatureClassManage


        pEnumLayer = pMap.Layers
        pLayer = pEnumLayer.Next

        Do Until pLayer Is Nothing
            If TypeOf pLayer Is FeatureLayer Then
                pFeatureLayer = pLayer
                pFeatureClass = pFeatureLayer.FeatureClass
                pFeatureClassManage = pFeatureClass
                pFeatureClassManage.UpdateExtent()
            End If
            pLayer = pEnumLayer.Next
        Loop
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.