Tìm giá trị ô raster gần nhất dựa trên điểm vectơ?


9

Tôi có hai lớp trong ArcGIS: Một là điểm vectơ và lớp kia là lớp raster. Tôi muốn nối giá trị của lưới dữ liệu raster vào điểm vectơ. Vấn đề là điểm vectơ nằm xa bất kỳ lưới raster hiện có nào có giá trị, vì vậy lệnh "Mẫu" không trả về giá trị nào cho các điểm vectơ đó.

Vì vậy, câu hỏi của tôi là: Làm thế nào tôi có thể tìm thấy ô raster gần nhất được cho một điểm vectơ và trích xuất giá trị từ ô?

Thật ra có hai điều tôi cần làm:

  1. Xác định người đứng ngoài trong một kiểm lâm viên (Thường cách 1-2 raster của tôi hiện tại)
  2. Gán một giá trị từ raster gần nhất cho chúng, nếu chúng nằm trong một phạm vi

Đã chỉnh sửa: Tôi có khoảng 3000 điểm vector và vấn đề của tôi là: nhập mô tả hình ảnh ở đây

Tôi cần nối thêm giá trị raster dựa trên các vị trí vào các điểm vectơ. Tôi đã sử dụng công cụ "Mẫu" và nó hoạt động tốt cho hầu hết các điểm.

Tuy nhiên, có một tình huống như thế này nhập mô tả hình ảnh ở đây

Điểm bên phải có thể nhận giá trị từ raster ("Mẫu" hoạt động) nhưng điểm bên trái không thể do các vấn đề căn chỉnh.

Raster to polygon không hoạt động vì tôi nhận được thông báo lỗi rằng tôi không thể biến chúng thành vector vì chúng nằm ngoài miền. Ngoài ra tôi có điểm như thế nàynhập mô tả hình ảnh ở đây

Những điểm trên không nên nhận bất kỳ giá trị nào vì chúng ở quá xa raster.

Tôi nghĩ về một số ngày để làm việc xung quanh:

Bước 1. Làm "mẫu" trước

Bước 2. Chọn giá trị null sau các thao tác "mẫu"

Bước 3. xây dựng vùng đệm (trong vòng 1 độ thập phân) dựa trên các điểm null

Bước 4. sử dụng số liệu thống kê khu vực ?? ? hoặc các công cụ khác để lặp qua tất cả các ô raster trong bộ đệm, tìm cái gần nhất, trích xuất giá trị của nó và đặt nó vào điểm vectơ.

Tôi bị kẹt ở bước 4. Tôi không biết công cụ nào trong ArcSDK tôi có thể sử dụng để đạt được chức năng này.

Hoặc nếu không ... Bạn có ý tưởng tốt hơn để đối phó với điều đó?

Tôi có 20 lớp raster như thế này và tôi muốn làm cho nó tự động (sử dụng trình xây dựng mô hình và arcobject).


@whuber: Phương pháp của bạn nghe rất thông minh. Câu hỏi của tôi là tôi đang xử lý dữ liệu trên phạm vi toàn cầu và làm cách nào tôi có thể xác định x0 và x1 cho raster phác thảo?
Xem

Kiểm tra các thuộc tính của nó sau khi thêm nó vào dự án.
whuber

1
Chỉ số Zonal là một ngõ cụt. Dựa trên chỉnh sửa của bạn, có một giải pháp trực tiếp đơn giản: mở rộng raster một chút xung quanh ranh giới của nó và lấy mẫu raster mở rộng. Có nhiều cách để làm điều này, nhưng tất cả đều cần một cơ sở nhỏ với các tính toán raster. Một trong những cách đơn giản nhất là mở rộng phạm vi phân tích, tính toán trung bình tiêu cự và (sử dụng 'con') dán các giá trị của nó vào vùng ranh giới NoData. Điều này gán giá trị trung bình của các giá trị raster gần đó cho từng vị trí mẫu ngoài raster.
whuber

@whuber Có một vấn đề khác là tôi không biết người ngoài cuộc ở đâu. Vì vậy, thực sự có 2 thủ tục trong quy trình của tôi: xác định các outliners và gán giá trị cho chúng.
Đã xem

Một "người ngoài cuộc" là gì? Nếu đó là một điểm không được bao phủ bởi giá trị raster, bạn không thể không tìm thấy chúng: đây sẽ là những điểm không nhận được bất kỳ giá trị nào khi bạn áp dụng Samplecông cụ.
whuber

Câu trả lời:


8

Một phác thảo raster chiếm một hình chữ nhật giới hạn ở phía dưới bên trái bởi gốc tọa độ, có tọa độ (giả sử) (x0, y0) và ở phía trên bên phải bởi (x1, y1): đây là những thuộc tính dễ dàng phát hiện ra của bất kỳ raster nào. Bạn có thể sử dụng thông tin này để di chuyển bất kỳ điểm nào bên ngoài phạm vi của raster lên điểm gần nhất trên ranh giới của raster và trích xuất các giá trị raster tại các vị trí mới.

Các nhiệm vụ như thế này thường được thực hiện dễ dàng bằng cách xem xét kích thước thấp hơn . Phạm vi của raster một chiều chỉ là một khoảng của các số, giả sử từ x0 đến x1> x0, được viết theo quy ước [x0, x1]. Giả sử bạn muốn tìm điểm gần nhất trong khoảng này với một số x cho trước. Có ba trường hợp: x <x0 (x nằm bên trái), x0 <= x <= x1 (x nằm trong khoảng) và x1 <x (x nằm bên phải). Rõ ràng các điểm gần nhất lần lượt là x0, x và x1. Một công thức cho kết quả này là

x -> phút (tối đa (x, x0), x1),

như bạn có thể thấy bằng cách suy ngẫm từng trường hợp trong ba trường hợp riêng biệt.

Bởi vì phạm vi của raster là sản phẩm của Cartesian gồm hai khoảng, [x0, x1] * [y0, y1], cùng một công thức hoạt động theo hai chiều. Chỉ cần áp dụng nó cho từng khoảng. Do đó, tọa độ của điểm được chiếu có thể được tính (trong Máy tính trường, giả sử) như

(x, y) -> (tối thiểu (tối đa (x, x0), x1), tối thiểu (tối đa (y, y0), y1).

Đây là công thức hoạt động với 100 điểm được đặt ngẫu nhiên xung quanh và trong phạm vi của lưới:

Nhân vật

Các đường đứt nét liên kết trực quan các điểm bên ngoài phạm vi đến các vị trí mà chúng sẽ được di chuyển.

Tạo một lớp điểm từ các tọa độ được tính toán này và áp dụng Samplecông cụ để trích xuất các giá trị raster. Tham gia kết quả trở lại lớp điểm ban đầu.

Như một vấn đề thực tế , để tránh các vấn đề với vòng tròn điểm nổi có thể giữ cho các điểm mới không nằm trong phạm vi của lưới, sẽ là khôn ngoan khi làm cho x0 và y0 lớn hơn một chút so với nguồn gốc thực sự (bạn có thể thêm một nửa số ô cho chúng) và tương tự, làm cho x1 và y1 nhỏ hơn một chút.

Tóm lại , quy trình công việc bao gồm tính toán hai trường (tọa độ mới) trong bảng của lớp điểm ban đầu, tạo lớp sự kiện điểm từ các tọa độ mới đó, chạy Samplecông cụ và thực hiện nối cơ sở dữ liệu (không phải là nối không gian).


Khi bạn có nhiều điểm vectơ hơn các ô trong raster , bạn nên chọn giải pháp được đưa ra bởi @celenius (người đề xuất chuyển đổi raster thành các điểm và sử dụng phép nối không gian). Tuy nhiên, thông thường, các trình quét có rất nhiều ô - từ hàng triệu đến hàng tỷ - và việc chuyển đổi thành điểm rất tốn thời gian và tốn đĩa nên cần thận trọng khi tiếp cận.

Ngoài ra, bạn có thể xúc tiến giải pháp của Celenius bằng cách sử dụng phép tính raster để tạo lưới số nguyên chỉ với các giá trị dọc theo đường biên của nó. Chuyển đổi thành một lớp điểm là nhanh chóng và dễ dàng bởi vì nó sẽ có ít điểm. Hãy gọi đây là "lớp ranh giới." Lấy mẫu lưới tại các điểm của lớp biên, do đó sao chép các giá trị lưới vào bảng thuộc tính của lớp biên. Sau khi chạy Samplevới lớp điểm ban đầu, loại bỏ tất cả các điểm lấy mẫu thành công. Không gian tham gia lớp ranh giới đến các điểm còn lại để hoàn thành quá trình lấy mẫu.

(Một cách để tạo lưới chỉ có các giá trị dọc theo ranh giới của nó là áp dụng thao tác vùng lân cận không thành công dọc theo đường biên: ví dụ bao gồm tìm độ dốc, độ dốc, chỉ số tiêu cự vùng 3 x 3. Điều này tạo ra lưới có một ô- sử dụng IsNull và SetNull để phát hiện các ô NoData và chuyển đổi giữa NoData và các ô dữ liệu tạo ra một lưới chứa đầy các giá trị NoData ngoại trừ xung quanh ranh giới.)


Tóm lại, quy trình công việc bao gồm tính toán hai trường (tọa độ mới) trong bảng của lớp điểm ban đầu, tạo lớp sự kiện điểm từ các tọa độ mới đó, chạy công cụ Mẫu và thực hiện nối cơ sở dữ liệu (không phải là nối không gian). Bạn có thể giải thích làm thế nào để làm điều này? (Bạn có thể thấy bức ảnh của tôi cho vấn đề của tôi). Cảm ơn!
Đã xem

Tôi có khoảng 15% điểm có vấn đề này. Làm thế nào bạn có thể xác định x0 và x1 cho mỗi điểm?
Xem

1
@ Xem x0, y0, x1, y1 dành cho các lưới. Các tọa độ điểm (x, y) có thể được tính toán trong Máy tính trường như được mô tả trong trợ giúp ArcGIS hoặc trong một số luồng trên trang web này. Có các mục menu để tạo một lớp điểm XY và tham gia cơ sở dữ liệu: đây là các thao tác cơ bản, tiêu chuẩn.
whuber

4

Bạn có thể chuyển đổi raster thành các điểm ( ref ), và sau đó thực hiện nối không gian trên các điểm (từ các raster) thành điểm.

(Tôi mới biết rằng các điểm có thể được tham gia không gian ở đây ngày hôm qua )


1
+1 cho cách tiếp cận thông minh. Đối với các lưới lớn, nơi điều này trở nên không thể thực hiện được, chỉ chuyển đổi các ô ranh giới của raster thành các điểm. (Tôi mô tả làm thế nào khi kết thúc câu trả lời của tôi.)
whuber

Tôi có hàng ngàn ô của mỗi lớp raster và tôi có 20 lớp như vậy ... vì vậy việc chuyển chúng vào các điểm vectơ rất tốn thời gian ...
Xem

Ngoài ra, khi tôi cố gắng thực hiện raster thành đa giác, tôi nhận được thông báo lỗi là ERROR 000864 Trình raster đầu vào: Đầu vào không nằm trong miền xác định. LRI 000863: Kiểu dữ liệu GP không hợp lệ
Xem

Bạn có gặp lỗi khi chuyển raster thành điểm không?
djq

@celenius Nó hoạt động nhưng phải mất một thời gian dài.
Nhìn thấy

1

Bạn có thể chuyển đổi lớp raster thành đa giác bằng công cụ Raster to Polygon và chạy tham gia không gian (nhấp chuột phải vào lớp điểm và chọn Joins and Relates - Tham gia, trên trình đơn thả xuống đầu tiên, chọn tùy chọn nối không gian và chọn gần nhất để tùy chọn trên nút readio) hoặc sử dụng công cụ Gần.


Làm thế nào để bạn sử dụng kết quả của phép nối không gian để trích xuất giá trị raster thích hợp?
whuber

@whuber, trong hộp thoại Tham gia dữ liệu khi bạn chọn tùy chọn "gần nhất với nó", phép nối không gian chọn tính năng đa giác gần nhất (kết quả từ công cụ Raster to Polygon) và thêm thông tin thuộc tính này vào tính năng điểm. Đây có phải là những gì bạn hỏi đã hỏi? Trả lời ban đầu của tôi đã được đăng trước khi chỉnh sửa của mình. Tôi đoán raster của Seen có thể quá lớn để chuyển đổi thành đa giác?
nghệ thuật 21

Ý tưởng không phải là tìm ra raster gần nhất. Thực sự, những gì đang muốn là một cách để ngoại suy các giá trị của raster vượt quá phạm vi ban đầu của nó. Câu hỏi đề xuất một cách tiếp cận hàng xóm gần nhất: tại bất kỳ điểm nào gần đó không phải trên raster, hãy tìm ô gần nhất trong raster và sử dụng giá trị của ô đó.
whuber

Khi đọc lại bình luận cuối cùng của bạn, có vẻ như bạn có thể đề xuất biến raster không thành "đa giác" mà thành một lớp đa giác với một đa giác cho mỗi ô (hoặc tập hợp các ô liền kề). Nếu đúng như vậy, nó có thể thành công với các raster rất nhỏ, nhưng tại sao bạn lại đề xuất điều này - đó là một hoạt động phức tạp, tốn kém (và chỉ hoạt động cho các lưới số nguyên) - thay vì giải pháp tương tự nhưng hiệu quả hơn mà @celenius đưa ra trước đó? Những lợi thế của giải pháp của bạn cung cấp?
whuber

@whuber, lớp đa giác là chính xác. Có, phương pháp celenius sẽ tốn ít bộ nhớ hơn.
nghệ thuật 21
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.