Ngôn ngữ của SQL có thể truy cập được ở mức độ nào thông qua các công cụ ArcGIS?


10

Câu hỏi đó nghe có vẻ dư thừa ...
Dù sao đi nữa, tôi đã được yêu cầu khám phá việc sử dụng SQL trong ArcGIS. Chúng tôi sử dụng DB SDE cho tất cả lưu trữ phía máy chủ và quản lý DB / chỉnh sửa quy mô lớn. Tuy nhiên, tôi đang cố gắng tìm hiểu sâu hơn về cách SQL tích hợp trong các công cụ của ArcGIS. Có một lưu ý trong Hướng dẫn tham khảo truy vấn SQL của trợ giúp ArcGIS 10, trong đó nêu rõ cú pháp SQL không hoạt động khi sử dụng công cụ Máy tính trường. Tôi thấy điều này rất đáng thất vọng vì nó có vẻ rất hữu ích khi có thể lấy và thu thập thông tin trực tiếp từ chính cơ sở dữ liệu khi tính toán các giá trị trường.

Những hạn chế và cạm bẫy lớn nhất mà người ta có thể rơi vào khi cố gắng sử dụng SQL trong ArcGIS là gì? Những công cụ nào thấy chức năng tốt nhất khi được tích hợp với SQL?

Nếu một ví dụ được yêu cầu để làm cho câu hỏi này rõ ràng hơn, tôi đang cố gắng theo dõi số lượng điểm quan tâm thuộc một loại nhất định trong một khu vực nhất định. Mỗi điểm có một thuộc tính mô tả loại và khu vực của nó. Giải pháp hiện tại của tôi liên quan đến việc sử dụng nhiều con trỏ để đếm và truy xuất dữ liệu, nhưng một cấp trên chỉ ra rằng một truy vấn SQL đơn giản có thể thực hiện tất cả những điều này và hơn thế nữa. Thật không may, có vẻ như chức năng không có mặt cho việc này.

Hoặc là nó?


Có bất kỳ bảng truy vấn được phiên bản?
Michael Todd

Phiên bản? Tôi không nghĩ rằng tôi quen thuộc với thuật ngữ đó.
Nathanus

1
Phiên bản một lớp cho phép một người thực hiện các thay đổi cho lớp trong khi vẫn giữ các tính năng trước đó. Vì vậy, nếu một tính năng bị xóa, phiên bản hiện tại của lớp cho thấy tính năng đó không còn tồn tại; tuy nhiên, trên thực tế tính năng này vẫn tồn tại trong lớp "cơ sở" và các công cụ GIS có thể được sử dụng để xem các phiên bản khác nhau của lớp hiển thị tính năng này. Bạn có thể biết nếu lớp của bạn được phiên bản bằng cách nhấp chuột phải vào lớp trong ArcCatalog và chọn Thuộc tính. Phần dưới cùng của tab Chung có phần gọi là Phiên bản và thông tin ở đây sẽ cho bạn biết nếu lớp được phiên bản.
Michael Todd

Câu trả lời:


9

Nếu bạn muốn sử dụng Python, hãy xem lệnh ArcSDESQLExecute . Điều này sẽ cho phép bạn thực thi SQL tùy ý nhưng nó phải được kết nối thông qua SDE. Nếu kết quả của truy vấn là một tập hợp các hàng, các thuộc tính sẽ được trả về dưới dạng danh sách danh sách Python. Nếu không, nó sẽ trả về True nếu SQL thực thi thành công hoặc Không nếu không. Xem thêm: Thi hành SQL bằng kết nối ArcSDE


Tôi chắc chắn sẽ làm điều đó! Điều này có vẻ giống như những gì tôi đang tìm kiếm, trong bối cảnh này. Cảm ơn rất nhiều.
Nathanus

5

Nếu bạn đang viết ArcObjects tùy chỉnh, bạn có thể thực thi SQL tùy ý đối với Không gian làm việc SDE bằng cách sử dụng phương thức ExecuteQuery . Phương pháp này được giới hạn ở các truy vấn không trả về các tập kết quả, chẳng hạn như CHERTN, CẬP NHẬT hoặc một số thủ tục được lưu trữ.

Nếu bạn đang làm việc thông qua ArcMap UI, các tùy chọn của bạn bị giới hạn hơn một chút. Lý do tại sao bạn không thể sử dụng SQL thông qua Trường tính toán là vì biểu thức thực sự là VBScript và / hoặc Python. Bạn có thể sử dụng VBScript hoặc Python để thực thi một biểu thức SQL tùy ý và kéo các giá trị từ con trỏ kết quả, nhưng tôi không khuyến nghị điều đó.

Ngoài ra, bạn có thể sử dụng câu trả lời của Regan và tạo Lớp truy vấn. Đối với dữ liệu chỉ đọc, đây là cách tiếp cận tốt nhất của bạn. Nếu bạn cần cập nhật dữ liệu, nó phức tạp hơn một chút. Bạn sẽ cần tạo một lớp truy vấn với các giá trị "mới" của mình, thực hiện nối với bảng hiện có của bạn và sau đó sử dụng các trường tính toán. Điều này có thể được kết hợp với ExecuteSQL để thực hiện các cập nhật phức tạp và sau đó xem kết quả (loại khó hiểu).

Thay thế cuối cùng của bạn là thực thi SQL trực tiếp với các bảng ArcSDE.


1
Điểm cuối cùng của bạn (thực thi SQL trực tiếp với các bảng) là lý do tại sao tôi hỏi câu hỏi phiên bản của tôi. Một truy vấn SQL ở cấp cơ sở dữ liệu chỉ lấy từ lớp cơ sở (trừ khi người ta thiết lập chế độ xem đa dạng), do đó sẽ không hoạt động nếu lớp được phiên bản.
Michael Todd

Công việc tôi đang làm chủ yếu là bằng Python, nhưng dường như ngày càng nhiều chức năng thực sự trong UI phụ thuộc vào ArcObjects.
Nathanus

Mọi thứ được xây dựng trên ArcObjects bên trong, bao gồm cả chức năng python.
James Schek

nếu ArcSDESQLExecute trong Python có thể trả về kết quả, làm thế nào có thể đạt được điều tương tự thông qua IWorkspace.ExecuteQuery?
Petr Krebs 23/03

@petr bạn không thể trực tiếp ... Tôi đã cập nhật câu trả lời của tôi.
James Schek


1

Tùy thuộc vào RDBMS nào bạn đang sử dụng, bạn có thể tận dụng các thư viện SQL bên ngoài ArcObjects hoặc arcpy, miễn là bạn không phụ thuộc vào việc lấy lại dữ liệu tính năng. Nhiều truy vấn trong cơ sở dữ liệu SQL Server mà tôi sử dụng hàng ngày không có bản chất không gian, vì vậy tôi sẽ sử dụng các lớp System.Data bên trong .NET hoặc thư viện Python pymssql bên trong các ứng dụng Python. Nếu bạn yêu cầu sử dụng dữ liệu Không gian, thì Lớp Truy vấn là lựa chọn tốt nhất của bạn. Nhắc nhở duy nhất với Lớp truy vấn là chúng chỉ hoạt động với dữ liệu được lưu trữ bằng cách sử dụng các loại dữ liệu Không gian (không phải loại SDEBINARY tiêu chuẩn).


Điều này đang bắt đầu trở nên dữ dội. Tôi đoán tôi cần phải đánh giá cẩn thận hơn nhu cầu của tôi. Tôi sẽ không cần dữ liệu "không gian", nếu điều đó có nghĩa là những thứ như đa giác và điểm / dòng, mà chỉ đơn giản là các giá trị trong trường văn bản / số nguyên.
Nathanus

Nếu bạn cần trả về các kiểu hình học, thì tôi sẽ sử dụng truy cập dữ liệu ArcObjects / arcpy tiêu chuẩn. Nếu tất cả những gì bạn đang làm là truy cập dữ liệu "bảng" (không có loại không gian liên quan) thì chỉ cần thực hiện các cuộc gọi cơ sở dữ liệu bằng cách sử dụng SqlConnections thông thường (đối với SQL Server - loại kết nối của bạn có thể thay đổi). Các kết quả linh hoạt hơn so với những gì bạn nhận được từ ICthon. Nếu tôi hiểu câu hỏi của bạn và bạn bị giới hạn trong việc sử dụng máy tính trường, thì bạn sẽ không thể sử dụng SQL thô.
Sage BrushGIS
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.