Đếm các giá trị pixel liên tiếp cho tập hợp các trình quét bằng ArcGIS Spatial Analyst?


23

Tôi đang sử dụng ArcGIS 10 với Nhà phân tích không gian.

Tôi có một bộ raster (tổng cộng 8) chỉ mỗi cái chứa 1 hoặc 0 cho mỗi ô. Mỗi raster đại diện cho một năm dữ liệu khác nhau. Đối với các đối số vì năm 1 đến năm 8.

Tôi có thể cộng tất cả các trình quét với nhau, nó sẽ cung cấp cho tôi một lưới cuối cùng với các giá trị nằm trong khoảng từ 0 đến 8. Một số 8 chỉ ra rằng ô liên tục là 1 cho tập hợp các trình quét (tất cả các năm).

Tôi muốn tìm ra cho mỗi ô số 1 liên tiếp dài nhất.

Vì vậy, ví dụ, tổng lưới có thể ghi cho một ô có giá trị là 5 nhưng trên 8 lưới mà ô đó có số liên tiếp lớn nhất là 1 bằng 3. Hoặc một cách khác để biểu thị điều này là trong 3 năm, ô đó là 1 sau đó nó bắt đầu dao động giữa số không và số không.

Kỹ năng xử lý raster của tôi không nóng bằng kỹ năng xử lý véc tơ của tôi và tôi đã xem kỹ tệp trợ giúp ESRI nhưng tôi không thể hiểu làm thế nào một người có thể đạt được điều này bằng cách sử dụng các công cụ xử lý địa lý?

Có ý kiến ​​gì không?


1
Đó thực sự là một phân tích khá tuyệt vời. Như thường lệ, có nhiều hơn một cách để làm những gì bạn đang cố gắng làm. Tôi nghĩ rằng bạn sẽ cần phải thực hiện một số chương trình để lặp qua tất cả các kết hợp.
MLowry

1
Một nhận xét chung (lấy cảm hứng từ nhận xét này của @MLowry): vui lòng nêu lên các câu hỏi bất cứ khi nào chúng có vẻ thú vị hoặc được khớp nối rõ ràng. Câu hỏi hay thúc đẩy mọi thứ trên trang web của chúng tôi; xin vui lòng làm những gì chúng ta có thể để thưởng cho những người yêu cầu họ!
whuber

Câu trả lời:


14

Vì đây là thao tác cục bộ, chúng ta hãy tìm cách thực hiện nó cho một ô duy nhất: Đại số bản đồ sẽ lo phần còn lại.

Đầu tiên lưu ý rằng thứ tự của các raster rõ ràng có vấn đề. Do đó, thống kê ô một lần bắn, chẳng hạn như tổng ô, sẽ không làm điều đó.

Nếu chúng tôi gặp phải một chuỗi như 01110101 tại một ô đã cho, chúng tôi sẽ xử lý việc này từ đầu đến cuối và

  1. Bắt đầu với số đếm bằng không.

  2. Tăng số đếm mỗi lần chúng ta gặp 1.

  3. Đặt lại số đếm mỗi lần chúng ta gặp 0, sau khi lưu số đếm cuối cùng .

  4. Cuối cùng, lấy số lượng lưu tối đa (bao gồm cả số cuối cùng).

Bước 1 được thực hiện với lưới không đổi. Bước 2 và 3 phụ thuộc vào những gì chúng ta gặp phải: do đó, đây là một hoạt động có điều kiện . Bước 4 rõ ràng là một tối đa địa phương. Chúng tôi sẽ mã này, sau đó, chính thức hơn một chút là:

count = 0
result = 0
For each value:
    If (value==1):
        count=count+1
    else
        result = max(result, count)
        count=0
result = max(result, count)

Điều đó được thực hiện tốt nhất với tập lệnh Python khi bạn có nhiều lưới, nhưng với tám tập lệnh, việc kiểm soát vòng lặp và viết ra các bước bằng tay là không hợp lý. Điều này cho thấy một vấn đề nhỏ: đó result=max(longest,count)là một loại "hiệu ứng phụ" khó mã hóa với các hoạt động raster. (Nhưng nó có thể được thực hiện, như thể hiện trong giải pháp thứ hai bên dưới.) Nó cũng không hiệu quả, bởi vì nó thêm một phép tính bổ sung ở mỗi bước. Do đó, chúng tôi sửa đổi cách tiếp cận một chút, với mục đích tắt maxhoạt động cho đến khi kết thúc. Điều này sẽ yêu cầu tiết kiệm một số lượng riêng biệt ở mỗi giai đoạn.

Trong quá trình thực hiện, tôi cũng tìm thấy một lối tắt cho bước đầu tiên. Điều này dẫn đến giải pháp sau, mặc dù hơi dài và tốn nhiều RAM, rất đơn giản và bao gồm các bước được thực hiện nhanh chóng:

result1 = "grid1"
result2 = con("grid2"==1, "result1"+1, 0)
result3 = con("grid3"==1, "result2"+1, 0)
result4 = con("grid4"==1, "result3"+1, 0)
result5 = con("grid5"==1, "result4"+1, 0)
result6 = con("grid6"==1, "result5"+1, 0)
result7 = con("grid7"==1, "result6"+1, 0)
result8 = con("grid8"==1, "result7"+1, 0)
CellStatistics(["result1", "result2", "result3", "result4", "result5", "result6", "result7" "result8"], "max")

Cú pháp thực tế thay đổi theo phiên bản ArcMap của bạn. (Ví dụ, CellStatisticstôi mới sử dụng phiên bản 10, nhưng tôi luôn có sẵn một hoạt động tối đa cục bộ.)

Trong ví dụ với đầu vào 01110101, chuỗi các lưới "result *" sẽ chứa các giá trị 0, 1, 2, 3, 0, 1, 0, 1, do đó, ở cuối CellStatisticssẽ trả về 3, độ dài của chuỗi dài nhất là 1 giây.

Nếu RAM khan hiếm, giải pháp có thể được sửa đổi để sử dụng lại các kết quả trung gian, với chi phí gấp đôi thời gian thực hiện:

result = "grid1"
temp = con("grid2"==1, "result"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
temp = con("grid3"==1, "temp"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
...
temp = con("grid8"==1, "temp"+1, 0)
CellStatistics[["temp", "result"], "max"]

Trong ví dụ với đầu vào 01110101, các giá trị ("temp", "result") sẽ là (NoData, 0) sau dòng đầu tiên và sau mỗi cặp ("Con", "CellStatistic") các giá trị sẽ là (1 , 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3). Một lần nữa giá trị cuối cùng là 3.

Mẫu thông thường của biểu thức Đại số bản đồ trong một trong hai giải pháp cho biết cách mã hóa thuật toán dưới dạng vòng lặp trong tập lệnh, thay đổi chỉ mục cho phù hợp với mỗi lần lặp.


Có thể có một lỗi đánh máy trong khối mã loại: Count = Count = 1 có lẽ nên được đếm = đếm + 1
MLowry

1
@ML Cảm ơn (đôi mắt tốt!): Bây giờ nó đã được sửa. Thật khó để tạo mã giả hoàn toàn chính xác; đánh giá của con người là một tài sản thực sự trong việc tìm kiếm lỗi. Ngoài ra, mặc dù tôi không thử nghiệm các giải pháp trong ArcGIS, tôi đã thực hiện giải pháp đầu tiên trong R, vì vậy tôi có một số đảm bảo rằng phương pháp này là chính xác.
whuber

1
"Whuber" một lần nữa, bạn là người đàn ông biết! Chúa sẽ giúp đỡ những người còn lại nếu bạn chạy xe buýt! Cách tiếp cận Python ban đầu của bạn là hướng tôi đang nghĩ nhưng tôi biết với các raster, người ta thường có thể làm mọi thứ rất lắt léo mà bạn đã chứng minh. Nếu bạn thấy mình ở Anh, thật vinh dự khi mua cho bạn một cốc bia phẳng nhiệt độ phòng tốt nhất của chúng tôi! :)
Hornbydd

Cảm ơn, Duncan: nhưng hãy xem giải pháp tuyệt vời của Andy Harfoot!
whuber

14

Chỉ cần trò chuyện về điều này và tự hỏi liệu bạn có thể tiếp cận vấn đề bằng cách coi các lưới đầu vào là một luồng nhị phân. Điều này sẽ cho phép bạn kết hợp chúng để đưa ra một số nguyên tóm tắt duy nhất cho chuỗi - tức là 01110101 = 117. Giá trị này sau đó có thể được phân loại lại để đưa ra số lượng tối đa 1 giây liên tiếp.

Đây là một ví dụ cho thấy một cách để kết hợp tám lưới:

2*(2*(2*(2*(2*(2*(2*"g8" + "g7") + "g6") + "g5") + "g4") + "g3") + "g2") + "g1"

Hoạt động bitwise cũng có thể được nhấn vào dịch vụ cho bước này. Ngoài ra, bạn có thể sử dụng kết hợp theo sau là một tính toán trường. (Tính toán trường sẽ có biểu thức tương tự như trước.)

Bảng phân loại lại phải cung cấp độ dài chạy tối đa cho tất cả các giá trị trong khoảng từ 00000000B = 0 đến 11111111B = 255. Theo thứ tự, đây là:

0, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8

Cách tiếp cận này được giới hạn trong khoảng 20 lưới trong ArcGIS: sử dụng nhiều hơn mức này có thể tạo ra một bảng thuộc tính khó sử dụng. ( Combineđặc biệt giới hạn ở 20 lưới.)


+1 rất lớn: Đây là một ý tưởng rất tốt . (Hạn chế duy nhất là khi có hơn 31 lưới tham gia, bạn sẽ hết bit để sử dụng.) Tôi đã lấy tự do để đưa ra ý tưởng của mình một chút để người khác có thể thấy nó dễ thực hiện như thế nào.
whuber

3

Bạn có nghĩ đến việc thay đổi các giá trị từ 0 và 1 thành các giá trị với sức mạnh là 2 (1,2,4,8,16,32). Khi bạn kết hợp 8 lưới, bạn sẽ nhận được các giá trị duy nhất cho mỗi ô sẽ cung cấp cho bạn thông tin liên tiếp (nghĩa là: giá trị 3 có nghĩa là năm 1 và 2, trong đó giá trị từ 54 sẽ là năm 6 đến 8).

Chỉ là một suy nghĩ


Đây chính xác là những gì @Andy Harfoot đề xuất vài giờ trước đó, Ryan. :-)
whuber

Cảm ơn và xin lỗi. Tôi đang đọc điều này trên điện thoại của tôi vào kỳ nghỉ.
Ryan Garnett
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.