Bộ đệm tính năng trong ArcMap để ArcObjects truy cập ở đâu?


8

Dường như ArcMap giữ một bộ đệm cho mọi lớp chứa dữ liệu tính năng và mỗi lần muốn làm mới lớp hoặc áp dụng thay đổi, hãy sử dụng bộ đệm này. Như tôi đã tìm thấy, khi ArcMap muốn vẽ một lớp từ đầu, hãy gửi truy vấn này đến geodatabase:

chọn ObjectId, Shape từ "FeatureClassName" [trong đó "biểu thức truy vấn định nghĩa lớp"]

Trong chế độ chỉnh sửa, khi sử dụng chụp nhanh, có vẻ như dữ liệu tính năng trong bộ đệm này được sử dụng để xác định trạng thái chụp trong khi di chuyển chuột. Tôi không biết làm thế nào ArcMap lưu trữ dữ liệu không gian trong bộ đệm này, ở định dạng hình dạng ESRI hoặc dưới dạng WKB, nhưng tôi cần phải lấy lại các dữ liệu tính năng này.

Có cách nào để truy xuất lại dữ liệu tính năng của một lớp bằng cách sử dụng bộ đệm (bộ đệm của lớp) thay vì sử dụng IFeatureClass::get_Featurephương thức không? ..... Có thể ý tưởng của tôi không đúng và một lớp không có bất kỳ bộ đệm nào (ý tôi không phải là bộ đệm là tùy chọn cho các lớp và tăng tốc độ vẽ lớp), nhưng tôi gần như chắc chắn dữ liệu không gian của các lớp (bản đồ) được lưu trữ trong bộ nhớ ArcMap ở đâu đó và ArcMap sử dụng nó cho hoạt động của nó như chụp nhanh trong quá trình chỉnh sửa. Có cách nào để truy cập phần dữ liệu ArcMap này (nếu thực sự tồn tại)?


Tôi không muốn thiết lập bộ đệm, tôi muốn lấy dữ liệu từ ArcMap cache.ISpatialCacheManagerkhông cung cấp bất kỳ phương pháp nào để lấy dữ liệu cụ thể từ nó. Hãy để tôi thảo luận về những gì tôi có nghĩa là chi tiết hơn.

Khi tôi đặt mã này vào chương trình của mình

//C#

IFeature ipF=ipMyFeatureClassObject.GetFeature(10);

ArcMap ban hành lệnh chọn cho cơ sở dữ liệu địa lý, giả sử:

select * from MyFeatureClassTableName Where ObjectId=10

và trả lại một bản ghi dữ liệu.

Trong chế độ chỉnh sửa, ArcMap không thể sử dụng phương pháp này để lấy dữ liệu không gian và tính toán trạng thái chụp cho các tính năng trên bản đồ vì tốn thời gian phương pháp này và tính toán chụp nhanh cần lấy dữ liệu tốc độ cao, vì chuột có thể di chuyển mọi nơi trên bản đồ và chụp nhanh được bật cho bất kỳ thu phóng nào, tất cả các nhân chứng này cho thấy dữ liệu không gian phải có sẵn ở đâu đó trong bộ nhớ và tôi đang tìm kiếm một phương pháp để truy cập nó.

Nếu tất cả các giả định này không thành hiện thực, thì phải có một phương pháp hoàn hảo mà ArcMap sử dụng để truy xuất dữ liệu không gian từ cơ sở dữ liệu địa lý khi đang di chuyển (ví dụ: lập chỉ mục không gian cấp 4 hoặc 6 dựa trên phạm vi bản đồ và chỉ sử dụng vị trí chuột để lấy một phần dữ liệu không gian trong khi chuột di chuyển rất nhanh, theo cách này chỉ có quyền truy cập vào cơ sở dữ liệu địa lý khi khu vực lập chỉ mục nhỏ nhất của chuột thay đổi).

Tôi đang xử lý việc phát triển một công cụ như "Công cụ phác thảo và" Công cụ chỉnh sửa "cho nguồn dữ liệu không phải là nguồn dữ liệu ArcObject và tôi không muốn thiết lập bộ đệm song song với ArcMap. Nếu có thể tôi muốn sử dụng cùng một dữ liệu ArcMap. lưu trữ trong bộ nhớ cho nguồn dữ liệu này.

Bây giờ, các bạn có nghĩ đây là những giả định thực sự không và nếu có thì có cách nào để truy cập dữ liệu không gian ArcMap trong bộ nhớ của nó không?


1
Nếu bạn đã xây dựng bộ đệm bằng ISpatialCacheManager, thì GetFeature (10) sẽ không đưa ra câu lệnh Chọn vào cơ sở dữ liệu, nó sẽ sử dụng những gì đã có trong bộ nhớ. Nói cách khác, bộ nhớ đệm là trong suốt. Tôi tò mò chuyện gì sẽ xảy ra nếu bạn lưu trữ một số lượng lớn các tính năng.
Kirk Kuykendall

1
Cảm ơn Kirk, nếu tôi muốn lưu trữ một số lượng lớn các tính năng, tôi có 3 lựa chọn, 1.OnClick tool 2.OnMouseDown 3.OnMouseMove 2 lựa chọn đầu tiên khiến enduser gặp con trỏ chuột đồng hồ cát trong một thời gian dài không thể chấp nhận được đối với anh ta, thứ ba cần một thuật toán không tạo ra bất kỳ sự chậm trễ nào trong việc di chuyển chuột cho công cụ, ví dụ như một vùng bên phải xung quanh con trỏ chuột được lưu vào bộ đệm và khi con trỏ đi vào vùng đệm khác, bộ đệm được làm mới, nhưng tôi không biết làm thế nào cơ chế phải được thực hiện, sử dụng lập chỉ mục không gian (như những gì sqlserver2008 sử dụng) hoặc sử dụng ISpatialFilter. Có ý tưởng nào o thực hiện không?
Reza

1
Vui lòng cung cấp thêm chi tiết về quy trình làm việc của bạn. Có lẽ bạn đang cố gắng cung cấp khả năng chỉnh sửa cho một plugindatasource? Nếu không có thể hỏi câu hỏi này bằng mọi cách: "Làm thế nào tôi có thể hỗ trợ chỉnh sửa các nguồn plugindatas?" Có lẽ điều này sẽ cung cấp một câu trả lời cho bạn. Mặc dù các yêu cầu cụ thể của bạn có thể khác nhau, một câu hỏi tổng quát hơn sẽ thu hút nhiều câu trả lời hơn.
Kirk Kuykendall

Có Kirk, điều đó gần như đúng, như bạn biết nguồn dữ liệu của plugin là chỉ đọc và vì tôi muốn có một thanh công cụ như "Trình chỉnh sửa" cho nguồn dữ liệu plugin hoặc trong trường hợp của riêng tôi "Nguồn dữ liệu OLEDB", vì thanh công cụ của trình soạn thảo không được bật cho các nguồn dữ liệu này ( và cho các lớp tùy chỉnh nữa). Bây giờ, tôi có các công cụ và tiện ích mở rộng cho "Trình soạn thảo của riêng tôi", nhưng tôi muốn thêm khả năng chụp nhanh cho các công cụ của mình và để làm điều này, tôi cần một bộ đệm của tất cả các hình học được tải trong các lớp (hoặc tại ít nhất là một phần của nó xung quanh con trỏ chuột), vì vậy tôi không phải truy vấn cơ sở dữ liệu trong khi di chuyển chuột. Có cách nào để truy cập bộ đệm ArcMap cho các tính năng của plugin-oledb không?
Reza

Câu trả lời:


6

Về cơ bản, tiện ích mở rộng Trình chỉnh sửa, khi ở chế độ chỉnh sửa, sẽ quản lý một tập hợp các tác nhân snap (xem ISnapEn Môi trường ). Mỗi tác nhân snap này có thể có bộ đệm tính năng liên quan ( IFeatureSnapAgent.FeatureCache ) để việc chụp có thể được thực hiện mà không cần thực hiện truy vấn không gian mỗi khi bạn di chuyển con trỏ chuột. Vì vậy, không có một bộ đệm tính năng duy nhất, mà thường là nhiều hơn trong số chúng tùy thuộc vào số lượng các lớp có thể chỉnh sửa và số lượng tác nhân chụp được bật.

Bạn cũng có thể sử dụng lớp FeatureCache một cách riêng biệt mà không cần phải làm việc với Trình chỉnh sửa.


Cảm ơn petr, theo trợ giúp của EDN, featurecache dành cho một số lượng nhỏ các tính năng, làm thế nào ArcMap có thể tính toán để chụp trong chế độ chỉnh sửa cho một số lượng lớn các tính năng, ví dụ: tôi có hơn 5.000 polylines trên một lớp và thậm chí là đầy đủ phạm vi, ArcMap vẫn có thể chụp nhanh cho các đỉnh và cạnh?
Reza

1
Các tác nhân chụp nhanh thường xây dựng lại cá thể FeatureCache của chúng mỗi khi chuột rời khỏi khu vực mà bộ đệm được tạo lần cuối. Điều này giữ cho số lượng các tính năng trong bộ nhớ cache nhỏ. Khi chụp nhanh, không có cơ chế lưu trữ nào khác ngoài việc sử dụng IFeatureCache (lớp FeatureCache). Xem mẫu Buffer Snap Agent: resource.esri.com/help/9.3/ArcGISDesktop/dotnet/
mẹo

Vui lòng chú ý rằng dữ liệu của tôi không phải là ArcObject, vì vậy một số giao diện mà Edior Object thực hiện, tôi không thể sử dụng, ví dụ tôi phải sử dụng Công cụ phác thảo của riêng tôi thay vì thanh công cụ Editor.
Reza

1
Tôi hiểu điều đó, nhưng rõ ràng bạn chỉ có thể truy cập dữ liệu ArcObjects từ bộ đệm của ArcMap. Các cơ chế lưu trữ dựa trên ArcObjects cho dữ liệu không phải ArcObjects tất nhiên là không có sẵn. Câu hỏi của bạn có vẻ như bạn đang tạo dữ liệu không phải ArcObjects mới (sử dụng các công cụ của riêng bạn), nhưng muốn chụp nhanh vào dữ liệu ArcObjects, tận dụng bộ nhớ đệm như ArcMap. Đối với điều đó, bạn CÓ THỂ làm việc với trình soạn thảo. Nhưng bạn không cần tất cả, FeatureCache DOES đáp ứng nhu cầu của bạn nếu được sử dụng riêng biệt với trình chỉnh sửa.
Petr Krebs

1
Nếu bạn muốn chụp nhanh vào nguồn dữ liệu không phải AO của riêng mình, thì vui lòng định dạng lại câu hỏi của bạn vì nó không rõ ràng. Nhưng nếu đó là trường hợp, các cơ chế lưu trữ được ArcMap sử dụng để chụp nhanh sẽ vô dụng với bạn.
Petr Krebs

7

Nếu bạn đã xây dựng bộ đệm bằng ISpatialCacheManager3 thì IFeatureClass.GetFeature sẽ hoạt động nhanh hơn ...

Bật bộ đệm ẩn tính năng cải thiện hiệu suất của tất cả các tìm kiếm không gian có hình dạng truy vấn nằm trong vùng được lưu trong bộ nhớ cache và cũng cải thiện hiệu suất của tất cả các truy vấn truy xuất các tính năng bằng ID đối tượng (ví dụ: GetRow, GetFeature, GetRows và GetFeatures) ArcGIS phát hành 9.0 trở lên, sử dụng ISpatialCacheManager không yêu cầu phiên chỉnh sửa hoạt động.


Tôi đã thêm một số dòng vào câu hỏi gốc vì hạn chế về không gian trong bình luận seciton. Cảm ơn tất cả những người tham gia vào cuộc thảo luận này.
Reza

@KirkKuykendall Câu trả lời này có một ít ngày, nhưng vẫn xuất hiện có liên quan. Theo hiểu biết của bạn, ISpatialCacheManager ảnh hưởng đến các phương thức khác như ISelectionset như thế nào? Tôi tò mò về cách kết hợp bộ đệm tính năng vào một addin hiện có, hiện đang được sử dụng trên các lớp tính năng SDE.
Barbarossa
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.