Thuật toán nào được sử dụng bởi công cụ ArcGIS Watershed?


10

Có ai biết loại thuật toán nào được sử dụng trong công cụ ArcGIS Watershed (trong gói Spatial Analyst) không?

Rất ít thông tin được cung cấp trên trang web của Esri ... nhưng tôi nghi ngờ đó có thể là một loại tìm kiếm chuyên sâu / rộng.

Tôi đã xem các trang Trợ giúp Trực tuyến ArcGIS này:

Vì vậy, có, nó sử dụng raster hướng dòng chảy, nhưng nó sử dụng thuật toán gì để đi qua raster?

Xin lưu ý, tôi không tìm kiếm câu trả lời dọc theo dòng 'nó sử dụng D8 ..'... D8 không thực sự là một thuật toán, mà là một mô hình để giúp xác định thuật toán bạn sẽ sử dụng. IE bạn có thể triển khai lược đồ D8 trong thuật toán tìm kiếm theo chiều sâu và / hoặc thuật toán tìm kiếm theo chiều rộng


James, tôi đang cố gắng làm điều tương tự, tức là tạo một ứng dụng có tọa độ xác định và cung cấp cho chúng tôi một bản phân định đầu nguồn. Tôi đang sử dụng python. Hãy nói về sự tiến bộ của chúng tôi.

Tôi cũng đang sử dụng Python. Tôi đang bắt đầu với vấn đề đơn giản hơn là tính toán lưới hướng dòng chảy và chuyển từ đó.
James

Câu trả lời:


6

Phương pháp mà tôi đã triển khai bằng một vài ngôn ngữ và tin rằng ESRI sử dụng (xin lỗi, không có tài liệu tham khảo nào ngoài Jenson và paramue được trích dẫn ở nơi khác trong trang này) là bắt đầu tại một ô "đổ điểm" do người dùng cung cấp hoặc một ô ở rìa của lưới hướng dòng chảy (fdr), kiểm tra tám lân cận của nó để tìm dòng nào trong số đó chảy trực tiếp vào ô hiện tại và gán các ô đó cho "lưu vực" hiện tại trong lưới đầu ra. Sau đó, hàm đệ quy gọi chính nó một lần cho mỗi hàng xóm đang chảy. Quá trình này lặp lại cho đến khi tất cả các tế bào chảy vào cạn kiệt cho một điểm đổ, và sau đó sẽ lặp lại cho tất cả các điểm đổ.

Thiết kế thuật toán đệ quy có thể khá tốn kém vì cuối cùng nó có thể cố giữ nhiều dữ liệu trong bộ nhớ, phải trao đổi / trang vào đĩa và do đó thường bị chậm lại.

(xem bình luận của người dưới đây về các phương pháp đệ quy khác nhau, nếu bạn sẽ RỦI RO)

_____________ EDIT _____________

Lấy mã C cũ của tôi làm ví dụ (lưu ý: Mặc dù hầu hết các python có thể muốn chạy khỏi phòng, nhưng không nên quá tệ). Nghĩ rằng nó có thể được quan tâm để minh họa. Mặc dù bây giờ tôi chỉ quen thuộc một cách hời hợt với lần đệ quy đầu tiên so với đệ quy sâu đầu tiên, tôi nghĩ rằng thói quen của tôi thực sự là sâu sắc (và mô tả ngôn ngữ tự nhiên của tôi ở trên là sai lệch) dựa trên bài đăng stackoverflow này (hy vọng @ whuber hoặc người khác thông minh hơn tôi có thể xác nhận / từ chối).

Mã: giải thích: idirlà raster của các giá trị hướng dòng chảy. offsetđề cập đến ô trung tâm hiện đang được phân tích và offkiểm tra từng ô lân cận của ô đó. Điều này gọi một hàm khác, does_it_flow_into_metrả về một boolean về việc liệu luồng dữ liệu của ô lân cận trỏ đến ô hiện tại. Nếu đúng với một người hàng xóm, sau đó tái diễn đến vị trí đó.

void shed(int init_x, int init_y, int basin_id){

int i, j, offset, off, flow_dir;

offset = ((init_y - 1) * nc) + (init_x - 1);
*(basin + offset) = basin_id;


/* kernel analysis */
for (i = -1; i <  2; i++) {
    for (j = -1; j <  2; j++) {
        if ((i) || (j)) {

            off = offset + (j * nc +  i);
            flow_dir = *(idir + off);


            if (does_it_flow_into_me(i,j,flow_dir)){
                shed(init_x+i, init_y+j,basin_id);
            }
        } /*not center */
    } /* do - j */
} /* do - i */
}

Bạn mô tả đệ quy đầu tiên. Bằng một ngăn xếp nhỏ, bạn có thể thực hiện đệ quy độ sâu hiệu quả, đòi hỏi ít bộ nhớ. Vấn đề hiệu suất chính sẽ liên quan đến các lưu vực sông lớn, nơi các ô của lưới có thể phải hoán đổi liên tục trong và ngoài RAM. Tuy nhiên, như đã thảo luận trong các nhận xét cho các câu trả lời khác, vấn đề thực sự liên quan đến việc đối phó với các ô không có hướng D8 được xác định duy nhất, đặc biệt là các ô nằm trong các bản vá ngang phẳng rộng rãi (chẳng hạn như các ô được tạo bởi thói quen đổ đầy sơ bộ).
whuber

Chắc chắn là một vấn đề rác trong thùng rác. Những gì tôi và hầu hết GIss làm sẽ không dọn sạch đầu vào! Âm thanh như tôi cần phải tìm kiếm đệ quy sâu đầu tiên để đánh bóng bản hack của tôi.
Roland

Tôi không nghĩ đây là rác trong - hãy nhớ, bất kể việc triển khai bị phá vỡ như thế nào, đầu vào ban đầu là chính DEM chứ không phải mã hóa D8 của ai đó - nhưng chắc chắn đó là một thách thức. Thế giới thực có nhiều nơi bằng phẳng đến nỗi khó xác định hướng dòng chảy: bất kỳ dòng nước tĩnh nào cũng là một ví dụ điển hình. Trong thực tế, bạn cần tìm các cửa hàng của hồ và các khu vực bằng phẳng khác và bạn cần phải đối phó với các khu vực bằng phẳng có nhiều cửa hàng. Điều này đòi hỏi các tìm kiếm không phải địa phương , rất khó để thực hiện.
whuber

Có lẽ tôi đang bối rối. Tôi đang nghĩ rằng chúng ta đang thảo luận về help.arcgis.com/en/arcgisdesktop/10.0/help../index.html#// , trong đó lấy Flowdir làm đầu vào. Đừng muốn kéo chúng tôi vào đám cỏ dại nếu tôi không đọc phần còn lại đủ chặt chẽ!
Roland

Không, tôi nghĩ bạn đã đúng: khi tôi đọc lại câu hỏi, tôi thấy nó tập trung cụ thể vào việc xử lý raster hướng dòng chảy làm đầu vào, thay vì vào tình huống chung hơn mà tôi đang hình dung. Vì vậy, +1 cho câu trả lời của bạn để giải quyết nó trực tiếp và với những gợi ý sâu sắc và hữu ích.
whuber

4

Trợ giúp ArcGIS cho biết:

Đầu nguồn có thể được phân định từ DEM bằng cách tính toán hướng dòng chảy và sử dụng nó trong công cụ đầu nguồn. Để xác định khu vực đóng góp, trước tiên phải tạo một raster đại diện cho hướng của dòng chảy bằng công cụ Flow Direction.

Hướng dòng chảy được tính toán từ DEM bằng phương pháp D8 , trong đó dòng chảy được trừu tượng hóa bằng cách tính toán cho từng ô, trong đó có 8 ô lân cận, nước từ ô này sẽ chảy đến.

Có nhiều lựa chọn thay thế cho D8, chẳng hạn như Rho8, Froh8 & Stream Tube, nhưng hầu hết các Phần mềm GIS bao gồm ArcGIS đều có xu hướng sử dụng D8, vì nó đơn giản hơn và ít tính toán hơn các phần mềm khác.


Vài năm trước, tôi đang làm việc trong một dự án Delineation đầu nguồn và chúng tôi đã phải đối mặt với một số vấn đề do ArcGIS sử dụng phương pháp D8. Hai vấn đề chính là

  • D8 chỉ cho phép Uni Directional Flow. Nước chỉ có thể chảy ra theo một hướng từ một tế bào.
  • Các luồng Stream được tạo ra có độ lệch lớn dọc theo trục chéo. Điều này đã dẫn đến những dòng tìm kiếm kỳ lạ.

Từ dữ liệu của chúng tôi, chúng tôi biết rằng hai vấn đề này là những vấn đề lớn, vì vậy tôi đã phát triển một số công cụ để tạo hướng dòng chảy bằng phương pháp lai.

Một trong những nhiệm vụ đầu tiên của tôi là thiết kế ngược công cụ tính toán Lưu vực. Tôi thấy rằng nó khá đơn giản. Nếu bạn muốn tìm lưu vực cho điểm đã cho (còn gọi là điểm đổ), trước tiên bạn tìm ô chứa nó. Thường thì bạn sẽ cố gắng đưa nó đến điểm có tích lũy dòng chảy cao nhất trong một dung sai cho trước.

Đối với ô này, bạn sẽ tìm thấy tất cả các ô trong vùng lân cận đóng góp cho nó. Đối với mỗi ô lân cận này, bạn tìm thấy các ô đóng góp cho chúng, v.v. Bạn tiếp tục quá trình lặp lại này cho đến khi bạn không tìm thấy ô nào mới. Đó là khi bạn đã đạt đến các đường sườn núi hoặc ranh giới đầu nguồn.

Tôi thấy rằng mã đơn giản của tôi đã làm điều này cho các trình quét của ASCII, đã cho đầu ra gần như tương tự khi so sánh với công cụ đầu nguồn của ArcGIS. Đôi khi, có một sự khác biệt của một vài ô trên đường biên, vì vậy tôi tin rằng ArcGIS tuân theo thuật toán D8 chưa được sửa đổi.


Cảm ơn bạn đã xây dựng. Nhưng thuật toán sử dụng các hướng D8 để tìm lưu vực sông là gì? Xin vui lòng xem các ý kiến ​​sau câu trả lời của dmahr .
whuber

Xin chào, cảm ơn nhưng điều này không thực sự trả lời câu hỏi. Bạn nhấn vào câu "Đối với ô này, bạn sẽ tìm thấy tất cả các ô trong vùng lân cận đóng góp cho nó. Đối với mỗi ô lân cận này, bạn tìm thấy các ô đóng góp cho chúng, v.v." Có nhiều thuật toán khác nhau để thực hiện tìm kiếm đó. Câu hỏi là cái nào
James

4

Điều này đã được hỏi trước đây , mặc dù có lẽ trong một bối cảnh hơi khác. Tất cả các công cụ xử lý địa lý trong bộ công cụ thủy văn của Nhà phân tích không gian sử dụng mô hình hướng dòng chảy D8 , như đã nêu trong trang Cách thức hoạt động của dòng chảy :

Có tám hướng đầu ra hợp lệ liên quan đến tám ô liền kề mà luồng có thể di chuyển. Cách tiếp cận này thường được gọi là mô hình dòng chảy tám hướng (D8) và tuân theo cách tiếp cận được trình bày trong Jenson và Sebastue (1988).

Một bản sao của bài báo Jenson và hque (1988) có sẵn ở đây .

Tất cả các công cụ sử dụng trình quét Flow Direction làm đầu vào sử dụng mô hình hướng dòng chảy này bằng cách liên kết. Điều này bao gồm đầu nguồn, tích lũy dòng chảy, chiều dài dòng chảy, điền, v.v.


Vì vậy, tôi cho rằng một câu hỏi tiếp theo sẽ là, thuật toán đó được sửa đổi như thế nào để trả lại lưu vực?
James

Công cụ Watershed điều hướng raster hướng dòng chảy từ các điểm đổ. Đó là mặt trái của công cụ Tích lũy dòng chảy, ngoại trừ thay vì raster đầu ra mô tả số lượng ô, nó báo cáo ID của điểm đổ.
dmahr

1
Ok, tôi đoán tôi cần phải cụ thể hơn một chút. Tôi biết khái niệm về những gì nó làm. Tôi không biết thuật toán nào được thực hiện. Tức là tôi cho rằng nó là một loại thuật toán tìm kiếm, nhưng nó vẫn có thể; chiều rộng đầu tiên, chiều sâu đầu tiên, chiều sâu lặp đi lặp lại sâu đầu tiên, v.v ...
James

1
cảm ơn bạn @whuber: Theo tôi biết, các thuật toán tìm kiếm khác nhau có thể cho kết quả hơi khác nhau? Và đúng vậy, việc tìm kiếm một thuật toán chung không phải là vấn đề, nhưng tìm hiểu cách ESRI xử lý các khu vực dành riêng cho lưu vực sông (như các phần phẳng của DTM) là hữu ích.
James

1
James Vui lòng chỉnh sửa câu hỏi của bạn để làm rõ điểm cuối cùng đó, để chủ đề này ngừng thu thập các câu trả lời "đó là D8" vô dụng. (Cái gì hữu ích về các ý kiến D8 là nếu bạn chấp nhận rằng D8 dẫn đến một đồ thị hướng dòng chảy độc đáo, sau đó là một độc đáo giải pháp đúng cho vấn đề phân định nguồn, bởi vì các lưu vực sông là tài sản của đồ thị chính nó. Vì vậy, nếu có bất kỳ sự mơ hồ nào mà họ phải nằm trong (a) định nghĩa về "lưu vực", (b) cách tính hướng của D8 hoặc (c) cách các ô ngang (nghĩa là không có hướng D8 duy nhất) được xử lý.)
whuber

0

Để suy nghĩ nhiều hơn cho câu hỏi này, tôi đã chạy một phân tích lưu vực theo cung: Tôi lấy một DEM (điền), tính hướng dòng chảy và đặt một vài điểm tương ứng với các vị trí trên mạng luồng được tính toán trước đó. Tôi đã chạy công cụ 'đầu nguồn' và nó đã cho tôi một vài lưu vực đẹp, bao gồm hầu hết các khu vực còn lại 'ngược dòng' (như bạn mong đợi):

hình ảnh đầu nguồn

Sau đó, tôi đã mã hóa một thuật toán tìm kiếm nhanh trong Python (như câu trả lời ở trên), để kiểm tra lưới hướng dòng chảy và 'theo dõi' các đường dẫn luồng. Đối với mỗi nút, tôi kiểm tra 8 lân cận và nếu một hàng xóm chảy vào nút hiện tại, tôi gọi hàm tương tự đệ quy với nút lân cận là đầu vào.

Mã giả (ish):

class d8():
    def __init__(self, arr):
       self.catchment = set()
       self.arr = arr

    def search(self, node):
        """ Searches all neighbouring nodes to find flow paths """ 

        # add the current node to the catchment
        self.catchment.add(node)

        # search the neighbours, ignore ones we already visited
        for each_neighbour:
            if neighbour is in self.catchment:
               do nothing

            # if the neighbour flows into the current node, visit that neighbour
            elif neighbour_flows_into_me:
               self.search(neighbour)

Tôi đã chạy chức năng đó bằng cách sử dụng cùng một lưới đầu vào hướng dòng chảy và một trong những điểm giống nhau. Vấn đề là, nơi hồ quang trả về một lưu lượng khoảng 40000 ô cho điểm đó, thuật toán của tôi chỉ trả về 72 ô.

Có ai biết tôi đang làm gì sai không?

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.