Xác định xem điểm được bao quanh bằng xử lý raster


9

Tôi đang cố gắng cải thiện một quy trình vectơ / trăn cực kỳ cồng kềnh hiện tại cho một mô hình nguy hiểm tự nhiên. Hiện tại, chúng tôi có một tập lệnh dài tạo ra các khoảng cách / đường mang từ một điểm nhất định để xác định:

  1. loại đa giác mà nó giao nhau (ví dụ: Rừng, cỏ, đầm lầy, v.v.)
  2. khoảng cách đến đa giác đó
  3. có bao nhiêu trong số các đường này giao nhau với đa giác, để xác định mức độ 'bao quanh' của nó.

Có nhiều thứ liên quan hơn nhưng đó là ý chính của nó. Tôi đang cố gắng tìm cách cải thiện điều này và hiện đang bị vấp ngã ở phần 3. Ý tưởng là xác định xem một điểm có bị bao quanh hoàn toàn bởi đa giác hay không, trong vòng 200mPointA được bao quanh, trong khi PointB chỉ được bao quanh ~ 50%

Vì vậy, trong hình ảnh đính kèm của tôi, tôi muốn điểm A được đánh dấu là có nguy cơ cao hơn điểm B vì nó được bao quanh hoàn toàn bởi các đa giác của tôi. Điều này được lặp đi lặp lại cho khoảng 13 triệu điểm vì vậy đây không phải là một nhiệm vụ nhỏ và tôi muốn có một bề mặt để lấy các giá trị từ đó, thay vì chạy tập lệnh của chúng tôi. Tôi nghĩ rằng phải có một biến thể của các công cụ thủy văn hoặc đường dẫn chi phí để làm điều này nhưng dường như tôi không thể xoay quanh nó.

Làm thế nào tôi có thể đi về điều này?


1
Viewshed tùy thuộc vào nhiệm vụ nhưng sẽ cần trợ giúp đáng kể khi áp dụng tới 13 triệu điểm! Trước tiên hãy suy nghĩ về cách loại bỏ các điểm có môi trường xung quanh dễ kiểm tra, chẳng hạn như các điểm nằm trong khu vực bên ngoài đa giác có đường kính nhỏ hơn (giả sử) 200m: có thể loại trừ "A" nhưng có thể không loại trừ "B". "B" sẽ không bao giờ bị loại trừ vì chế độ xem của nó (lấy các khu vực đa giác thành các vị trí rất "cao" chặn tầm nhìn) kéo dài hơn 200m từ vị trí của B.
whuber

Một điểm tốt @whuber. chắc chắn tôi có thể giảm tổng số điểm thực sự được xử lý bằng khoảng cách gần và trên thực tế là các khoảng thời gian trễ duy nhất (tôi đang nói địa chỉ được mã hóa địa lý để các khối căn hộ có thể giảm từ 50 điểm xuống 1) nhưng tôi vẫn đang tìm kiếm tại vài triệu địa điểm. Tôi cũng có thể chia mọi thứ thành các khối chồng lên nhau nếu cần thiết. Sẽ điều tra viewshed. Cảm ơn!
Loz

Một màn hình nhanh khác là tính trung bình tiêu cự của lưới chỉ số 0-1 của đa giác của bạn bằng cách sử dụng một vùng lân cận hình khuyên: tại bất kỳ ô nào có giá trị của nó là 1, đa giác của bạn chiếm toàn bộ chu vi ở bán kính, chúng phải được bao quanh. Đây là một phép tính nhanh và có thể loại bỏ phần lớn các điểm của bạn, tùy thuộc vào vị trí của chúng và mức độ đa giác của bạn. Bạn cũng có thể tăng tốc độ sàng lọc ban đầu bằng cách thay đổi kích thước lưới của bạn thành độ phân giải thô hơn, chẳng hạn như 25-50 m hoặc khoảng đó.
whuber

Một bước xử lý tiềm năng khác, hoặc bước xử lý trước, sẽ là chuyển điểm của bạn thông qua phiên bản rasterized của tập dữ liệu của bạn so sánh số liệu thống kê của một vùng lân cận xung quanh các điểm. Bạn có thể trừu tượng hóa yêu cầu 'bao quanh' của mình như một thống kê về vùng lân cận các điểm hoặc nếu cần 'bao quanh', bạn có thể tìm thấy các điểm 'dễ dàng' (nghĩa là một điểm hoàn toàn trong khu vực rủi ro) bằng cách sử dụng vùng lân cận, phân tích các điểm 'dễ dàng' từ tất cả các điểm, sau đó sử dụng phân tích vectơ cho các điểm còn lại.
DPierce

wow truy vấn của tôi chắc chắn đã tạo ra rất nhiều quan tâm! Cảm ơn tất cả những người đã đóng góp ý kiến ​​và ý kiến. Tôi sẽ làm việc theo cách của mình mặc dù tất cả họ và trả lời nhưng tất cả họ sẽ dành thời gian để tôi kiểm tra. Tôi hứa tôi sẽ trả lời cuối cùng!
Loz

Câu trả lời:


6

Có một giải pháp đường dẫn chi phí nhưng bạn sẽ phải tự viết mã. Đây là những gì nó có thể trông giống như khi áp dụng cho mọi điểm trong hình ảnh trong câu hỏi (thô hơn một chút để tăng tốc các phép tính):

Hình 0

Các tế bào màu đen là một phần của đa giác xung quanh. Các màu, từ màu cam nhạt (ngắn) đến màu xanh lam (dài), hiển thị khoảng cách tối đa (tối đa 50 ô) có thể đạt được bằng cách di chuyển ngang tầm nhìn mà không chặn các ô đa giác. (Bất kỳ ô nào nằm ngoài phạm vi của hình ảnh này đều được coi là một phần của đa giác.)

Chúng ta hãy thảo luận một cách hiệu quả để làm điều đó bằng cách sử dụng biểu diễn dữ liệu raster. Trong biểu diễn này, tất cả các ô đa giác "xung quanh" sẽ có các giá trị khác 0 và bất kỳ ô nào có thể được "nhìn xuyên qua" sẽ có giá trị bằng không.

Bước 1: Tính toán trước cấu trúc dữ liệu vùng lân cận

Trước tiên, bạn phải quyết định ý nghĩa của việc một ô này chặn một ô khác. Một trong những quy tắc công bằng nhất mà tôi có thể tìm thấy là: sử dụng tọa độ tích phân cho các hàng và cột (và giả sử các ô vuông), chúng ta hãy xem xét các ô nào có thể chặn ô (i, j) từ chế độ xem tại điểm gốc (0,0). Tôi chỉ định ô (i ​​', j') gần nhất với đoạn đường nối từ (i, j) đến (0,0) trong số tất cả các ô có tọa độ khác với i và j nhiều nhất là 1. Bởi vì điều này không phải lúc nào cũng mang lại một giải pháp duy nhất (ví dụ, với (i, j) = (1,2) cả (0,1) và (1,1) sẽ hoạt động tốt như nhau), một số phương tiện để giải quyết các mối quan hệ là cần thiết. Sẽ là tốt đẹp cho độ phân giải các mối quan hệ này để tôn trọng các đối xứng của các vùng lân cận trong lưới: phủ định tọa độ hoặc chuyển đổi tọa độ bảo tồn các vùng lân cận này. Do đó, chúng ta có thể quyết định khối nào (i,

Minh họa quy tắc này là mã nguyên mẫu sau đây được viết bằng R. Mã này trả về một cấu trúc dữ liệu sẽ thuận tiện cho việc xác định "độ bao quanh" của các ô tùy ý trong một lưới.

screen <- function(k=1) {
  #
  # Returns a data structure:
  #   $offset is an array of offsets
  #   $screened is a parallel array of screened offset indexes.
  #   $distance is a parallel array of distances.
  # The first index always corresponds to (0,0).
  #
  screened.by <- function(xy) {
    uv <- abs(xy)
    if (reversed <- uv[2] > uv[1]) {
      uv <- rev(uv)
    }
    i <- which.min(c(uv[1], abs(uv[1]-uv[2]), uv[2]))
    ij <- uv + c(floor((1-i)/3), floor(i/3)-1)
    if (reversed) ij <- rev(ij)
    return(ij * sign(xy))
  }
  #
  # For each lattice point within the circular neighborhood,
  # find the unique lattice point that screens it from the origin.
  #
  xy <- subset(expand.grid(x=(-k:k), y=(-k:k)), 
               subset=(x^2+y^2 <= k^2) & (x != 0 | y != 0))
  g <- t(apply(xy, 1, function(z) c(screened.by(z), z)))
  #
  # Sort by distance from the origin.
  #
  colnames(g) <- c("x", "y", "x.to", "y.to")
  ij <- unique(rbind(g[, 1:2], g[, 3:4]))
  i <- order(abs(ij[,1]), abs(ij[,2])); ij <- ij[i, , drop=FALSE]
  rownames(ij) <- 1:length(i)
  #
  # Invert the "screened by" relation to produce the "screened" relation.
  #
  # (Row, column) offsets.
  ij.df <- data.frame(ij, i=1:length(i))
  #
  # Distances from the origin (in cells).
  distance <- apply(ij, 1, function(u) sqrt(sum(u*u)))
  #
  # "Screens" relation (represented by indexes into ij).
  g <- merge(merge(g, ij.df), ij.df, 
             by.x=c("x.to", "y.to"), by.y=c("x","y"))
  g <- subset(g, select=c(i.x, i.y))
  h <- by(g$i.y, g$i.x, identity)

  return( list(offset=ij, screened=h, distance=distance) )
}

Giá trị của screen(12)đã được sử dụng để tạo ra mô tả về mối quan hệ sàng lọc này: mũi tên chỉ từ các ô đến các ô ngay lập tức sàng lọc chúng. Các màu sắc được chia theo tỷ lệ khoảng cách với nguồn gốc, nằm ở giữa khu phố này:

Hình 1

Tính toán này là nhanh và chỉ cần được thực hiện một lần cho một vùng lân cận nhất định. Chẳng hạn, khi nhìn ra 200 m trên lưới có 5 m ô, kích thước vùng lân cận sẽ là 200/5 = 40 đơn vị.

Bước 2: Áp dụng tính toán cho các điểm đã chọn

Phần còn lại rất đơn giản: để xác định xem một ô nằm ở (x, y) (tọa độ hàng và cột) có được "bao quanh" đối với cấu trúc dữ liệu lân cận này hay không, thực hiện kiểm tra đệ quy bắt đầu bằng phần bù của (i, j) = (0,0) (nguồn gốc khu phố). Nếu giá trị trong lưới đa giác tại (x, y) + (i, j) là khác không, thì khả năng hiển thị bị chặn ở đó. Mặt khác, chúng ta sẽ phải xem xét tất cả các độ lệch có thể đã bị chặn ở offset (i, j) (được tìm thấy trong thời gian O (1) bằng cách sử dụng cấu trúc dữ liệu được trả về screen). Nếu không có cái nào bị chặn, chúng tôi đã đạt đến chu vi và kết luận rằng (x, y) không bị bao vây, vì vậy chúng tôi dừng tính toán (và không bận tâm kiểm tra bất kỳ điểm nào còn lại trong vùng lân cận).

Chúng ta có thể thu thập thông tin hữu ích hơn nữa bằng cách theo dõi khoảng cách tầm nhìn xa nhất đạt được trong thuật toán. Nếu giá trị này nhỏ hơn bán kính mong muốn, ô sẽ được bao quanh; nếu không thì không phải.

Đây là một Rnguyên mẫu của thuật toán này. Nó dài hơn dường như, vì Rthực chất không hỗ trợ cấu trúc ngăn xếp (đơn giản) cần thiết để thực hiện đệ quy, do đó, một ngăn xếp cũng phải được mã hóa. Thuật toán thực tế bắt đầu khoảng hai phần ba chặng đường và chỉ cần một chục dòng hoặc hơn. (Và một nửa trong số đó chỉ xử lý tình huống xung quanh mép lưới, kiểm tra các chỉ số ngoài phạm vi trong vùng lân cận. Điều này có thể hiệu quả hơn chỉ bằng cách mở rộng lưới đa giác bằng kcác hàng và cột quanh chu vi của nó, loại bỏ bất kỳ cần kiểm tra phạm vi chỉ mục với chi phí thêm một chút RAM để giữ lưới đa giác.)

#
# Test a grid point `ij` for a line-of-sight connection to the perimeter
# of a circular neighborhood.  
#   `xy` is the grid.
#   `counting` determines whether to return max distance or count of stack ops.
#   `perimeter` is the assumed values beyond the extent of `xy`.
#
# Grid values of zero admit light; all others block visibility
# Returns maximum line-of-sight distance found within `nbr`.
#
panvisibility <- function(ij, xy, nbr=screen(), counting=FALSE, perimeter=1) {
  #
  # Implement a stack for the algorithm.
  #
  count <- 0 # Stack count
  stack <- list(ptr=0, s=rep(NA, dim(nbr$offset)[1]))
  push <- function(x) {
    n <- length(x)
    count <<- count+n         # For timing
    stack$s[1:n + stack$ptr] <<- x
    stack$ptr <<- stack$ptr+n
  }
  pop <- function() {
    count <<- count+1         # For timing
    if (stack$ptr <= 0) return(NULL)
    y <- stack$s[stack$ptr]
    #stack$s[stack$ptr] <<- NA # For debugging
    stack$ptr <<- stack$ptr - 1
    return(y)
  }
  #
  # Initialization.
  #
  m <- dim(xy)[1]; n <- dim(xy)[2]
  push(1) # Stack the *indexes* of nbr$offset and nbr$screened.
  dist.max <- -1
  #
  # The algorithm.
  #
  while (!is.null(i <- pop())) {
    cell <- nbr$offset[i, ] + ij
    if (cell[1] <= 0 || cell[1] > m || cell[2] <= 0 || cell[2] > n) {
      value <- perimeter
    } else {  
      value <- xy[cell[1], cell[2]]
    }
    if (value==0) {
      if (nbr$distance[i] > dist.max) dist.max <- nbr$distance[i]
      s <- nbr$screened[[paste(i)]]
      if (is.null(s)) {
        #exited = TRUE
        break
      }
      push(s)
    }
  }
  if (counting) return ( count )
  return(dist.max)
}

Hình 2: Ví dụ

Trong ví dụ này, các ô đa giác có màu đen. Màu sắc cho khoảng cách tầm nhìn tối đa (tối đa 50 ô) cho các ô không đa giác, từ màu cam nhạt cho khoảng cách ngắn đến màu xanh đậm cho khoảng cách xa nhất. (Các ô có một đơn vị rộng và cao.) Các vệt rõ ràng rõ ràng được tạo ra bởi các "đảo" đa giác nhỏ ở giữa "dòng sông": mỗi ô chặn một hàng dài các ô khác.

Phân tích thuật toán

Cấu trúc ngăn xếp thực hiện tìm kiếm theo chiều sâu của biểu đồ khả năng hiển thị lân cận để tìm bằng chứng cho thấy một ô không được bao quanh. Khi các ô nằm xa bất kỳ đa giác nào, tìm kiếm này sẽ yêu cầu kiểm tra chỉ các ô O (k) cho một vùng lân cận bán kính-k. Các trường hợp xấu nhất xảy ra khi có một số lượng nhỏ các ô đa giác rải rác trong vùng lân cận nhưng ngay cả ranh giới của vùng lân cận cũng không thể đạt được: chúng yêu cầu kiểm tra gần như tất cả các ô trong mỗi vùng lân cận, đó là một O (k ^ 2) hoạt động.

Các hành vi sau đây là điển hình của những gì sẽ gặp phải. Đối với các giá trị nhỏ của k, trừ khi đa giác lấp đầy hầu hết lưới, hầu hết các ô không đa giác sẽ rõ ràng không có nền tảng và các tỷ lệ thuật toán như O (k). Đối với các giá trị trung gian, tỷ lệ bắt đầu trông giống như O (k ^ 2). Khi k thực sự lớn, hầu hết các ô sẽ được bao quanh và thực tế đó có thể được xác định rõ trước khi toàn bộ vùng lân cận được kiểm tra: nỗ lực tính toán của thuật toán do đó đạt đến giới hạn thực tế. Giới hạn này đạt được khi bán kính lân cận đạt đến đường kính của các vùng không đa giác được kết nối lớn nhất trong lưới.

Ví dụ, tôi sử dụng countingtùy chọn được mã hóa vào nguyên mẫu screenđể trả về số lượng thao tác ngăn xếp được sử dụng trong mỗi cuộc gọi. Điều này đo lường nỗ lực tính toán. Biểu đồ sau biểu thị số trung bình của ngăn xếp ops như là một hàm của bán kính lân cận. Nó thể hiện hành vi dự đoán.

Hình 3

Chúng ta có thể sử dụng điều này để ước tính tính toán cần thiết để đánh giá 13 triệu điểm trên lưới. Giả sử rằng một vùng lân cận k = 200/5 = 40 được sử dụng. Sau đó, trung bình sẽ cần vài trăm thao tác ngăn xếp (tùy thuộc vào độ phức tạp của lưới đa giác và vị trí của 13 triệu điểm so với đa giác), ngụ ý rằng trong một ngôn ngữ được biên dịch hiệu quả, nhiều nhất là vài nghìn thao tác số đơn giản sẽ được yêu cầu (thêm, nhân, đọc, viết, bù, v.v.). Hầu hết các PC sẽ có thể đánh giá mức độ bao quanh của khoảng một triệu điểm với tốc độ đó. (CácRtriển khai chậm hơn rất nhiều so với điều đó, vì nó kém về loại thuật toán này, đó là lý do tại sao nó chỉ có thể được coi là một nguyên mẫu.) Theo đó, chúng tôi có thể hy vọng rằng việc triển khai hiệu quả bằng ngôn ngữ phù hợp và hiệu quả hợp lý - C ++ và Python xuất hiện - có thể hoàn thành việc đánh giá 13 triệu điểm trong một phút hoặc ít hơn, giả sử toàn bộ lưới đa giác nằm trong RAM.

Khi lưới quá lớn để vừa với RAM, quy trình này có thể được áp dụng cho các phần được lát gạch của lưới. Chúng chỉ phải chồng lên nhau bởi kcác hàng và cột; lấy cực đại tại các phần trùng lặp khi ghép kết quả.

Các ứng dụng khác

Các "lấy" của một cơ thể của nước có liên quan chặt chẽ với "surroundedness" của các điểm của nó. Trên thực tế, nếu chúng ta sử dụng bán kính lân cận bằng hoặc lớn hơn đường kính của nước, chúng ta sẽ tạo ra một lưới của đường truyền (không định hướng) tại mọi điểm trong thân nước. Bằng cách sử dụng bán kính vùng lân cận nhỏ hơn, ít nhất chúng ta sẽ có được giới hạn thấp hơn cho việc tìm nạp tại tất cả các điểm tìm nạp cao nhất, trong một số ứng dụng có thể đủ tốt (và có thể làm giảm đáng kể nỗ lực tính toán). Một biến thể của thuật toán này giới hạn mối quan hệ "được sàng lọc bởi" theo các hướng cụ thể sẽ là một cách để tính toán tìm nạp hiệu quả theo các hướng đó. Lưu ý rằng các biến thể như vậy yêu cầu sửa đổi mã cho screen; mã cho panvisibilitykhông thay đổi gì cả.


2

Tôi chắc chắn có thể thấy người ta có thể muốn làm điều này như thế nào với giải pháp raster, nhưng ngay cả khi số điểm bị giảm, tôi sẽ mong đợi một lưới rất lớn / độ phân giải cao và do đó khó xử lý lưới hoặc bộ lưới. Do đó, tôi tự hỏi nếu khai thác cấu trúc liên kết trong một gdb có thể hiệu quả hơn. Bạn có thể tìm thấy tất cả các khoảng trống bên trong với một cái gì đó như:

arcpy.env.workspace = 'myGDB'
arcpy.CreateTopology_management('myGDB', 'myTopology', '')    
arcpy.AddFeatureClassToTopology_management('myTopology', 'myFeatures', '1','1')    
arcpy.AddRuleToTopology_management ('myToplogy', 'Must Not Have Gaps (Area)', 'myFeatures', '', '', '')    
arcpy.ValidateTopology_management('myTopology', 'Full_Extent')
arcpy.ExportTopologyErrors_management('myTopology', 'myGDB', 'topoErrors')
arcpy.FeatureToPolygon_management('topoErrors_line','topoErrorsVoidPolys', '0.1')`

sau đó bạn có thể làm việc với topoErrorsVoidPolysmô hình bình thường của bạn Intersect_analysis()hoặc bất cứ điều gì. Bạn có thể cần phải loay hoay với việc trích xuất các polys quan tâm từ topoErrorsVoidPolys. @whuber có một số bài viết khá xuất sắc về loại công cụ này ở nơi khác trên đây trên gis.stackexchange.com.


Đó là một ý tưởng tiền xử lý thú vị. Tôi nghĩ rằng nó có thể dễ dàng thích nghi để kết hợp giới hạn 200m (bằng cách đệm và giao cắt, v.v.) Quan điểm của bạn về lưới điện trở nên khá lớn chắc chắn là một mối quan tâm thực sự. Không có quy tắc nào trong GIS nói rằng giải pháp cho một vấn đề phải hoàn toàn dựa trên raster hoặc hoàn toàn dựa trên vectơ (mặc dù có một nguyên tắc nói rằng bạn nên có một lý do khá chính đáng để chuyển đổi từ đại diện này sang đại diện khác ở giữa về một phân tích, ở đây, như bạn đề xuất, có thể có lợi ích đáng kể từ việc làm chính xác điều đó).
whuber

0

Nếu bạn thực sự muốn đi raster ... Tôi sẽ làm một cái gì đó dọc theo dòng mã giả này (đừng co rúm lại vì nó rõ ràng tôi là một kẻ phản đối AML !: P)

  1. rasterize points ("pts_g") và polys ("polys_g" (
  2. voids = regiongroup (con (isnull (polys_g), 1))
  3. có thể cần phải làm gì đó để tinh chỉnh các khoảng trống để loại bỏ khu vực vũ trụ mở / đa giác không mong muốn
  4. pts_surrounded = con (voids, pts_g)

Chỉ cần làm cho nó lên, vì vậy có thể cần sàng lọc.


Giải pháp của bạn không liên quan đến khoảng cách giới hạn (của, giả sử, 200m), do đó dường như không trả lời chính xác cho câu hỏi.
whuber

bạn đúng. Điều này áp dụng cho câu trả lời khác của tôi, quá. Tôi cho rằng một người có thể sử dụng Expand(), nhưng tại thời điểm đó tôi sẽ nghĩ rằng câu trả lời từ @radouxju sẽ tương đương về chức năng và có thể nhanh hơn. (không có gì chống lại viewshed, chỉ không sử dụng nó nhiều).
Roland

đã cố gắng chỉnh sửa khi hết thời gian. muốn mở rộng trên Expand()để nói làm điều đó pts_gvà chỉ sử dụng Con()để giao nhau với polys_g.
Roland

0

Nếu bạn sử dụng giá trị khoảng cách ngưỡng (ở đây bạn nói khoảng 200 m), thì giải pháp tốt nhất là sử dụng phân tích vectơ:

1) tạo bộ đệm 200 m xung quanh mỗi điểm (màu đen trên hình minh họa)

2) sử dụng công cụ giao nhau (phân tích) giữa bộ đệm và đa giác (màu xanh lam trên hình minh họa). Nó sẽ trông đẹp hơn nếu bạn làm điều này giữa ranh giới của đa giác xung quanh và bộ đệm, nhưng kết quả cuối cùng là như nhau.

3) sử dụng tính năng cho đa giác (quản lý) để tạo đa giác trong đó các điểm của bạn được bao quanh hoàn toàn (màu đỏ trên hình minh họa)

4) chọn các lớp theo vị trí (quản lý) hoặc nối không gian (phân tích) để xác định các điểm được bao quanh. Việc sử dụng nối không gian cho phép bạn có thông tin về đa giác nhúng (diện tích của đa giác, thống kê khu vực ...) có thể hữu ích để xử lý thêm.

Các lựa chọn thay thế 2b) Tùy thuộc vào nhu cầu của bạn, bạn có thể chọn theo vị trí của các đa giác xung quanh trong khoảng cách 200 m, sau đó bạn có thể xác định một số loại "bao vây" nhưng không nghiêm ngặt như trong 2).

nhập mô tả hình ảnh ở đây

Xem xét "trường hợp mê cung", điều này có thể giúp: đánh giá thời gian "thoát" khỏi vị trí là bao lâu.

  • Bạn đã có thể loại trừ khỏi phân tích các điểm được bao gồm đầy đủ hoặc hoàn toàn miễn phí

  • sau đó, bạn chuyển đổi các chướng ngại vật của mình thành một raster và đặt các giá trị thành NoData nơi bạn có một đa giác và đến kích thước ô tính bằng mét nơi bạn không (điều này sẽ làm cho raster chi phí của bạn).

  • thứ ba, bạn có thể tính khoảng cách chi phí bằng cách sử dụng raster chi phí mới được tạo

  • cuối cùng, bạn sử dụng một thống kê khu vực dưới dạng bảng dựa trên các ranh giới bộ đệm được chuyển đổi thành raster (tạo thành một annulus). Nếu bạn có thể thoát theo mọi hướng, mức tối thiểu phải là xấp xỉ 200 (tùy thuộc vào kích thước ô của phân tích của bạn). Nhưng nếu bạn ở trong mê cung, mức tối đa sẽ lớn hơn 200. Vì vậy, mức tối đa của thống kê khu vực trừ 200 sẽ là một giá trị liên tục cho biết mức độ khó "thoát" của nó.


Hãy làm rõ định nghĩa của bạn về "bao quanh." Mô tả trong câu hỏi gợi ý rằng một điểm nên được coi là "bao quanh" khi một phần của đa giác có thể nhìn thấy theo mọi hướng xung quanh điểm đó (ra khoảng cách 200 m). Làm thế nào để bạn kiểm tra điều đó trong bước (3), chính xác? (Thật không dễ dàng khi sử dụng phân tích vectơ!)
whuber

Tôi đã thêm một minh họa nhỏ, sẽ dễ dàng hơn để giải thích như vậy. Nếu bộ đệm không cắt một đa giác theo mọi hướng, thì vòng lặp sẽ không bị đóng. Và nếu vòng lặp không đóng, điều này sẽ không tạo ra một đa giác.
radouxju

Tôi không chắc ý của bạn là "vòng lặp" hay "đóng". Lưu ý rằng một điểm có thể được "bao quanh" ngay cả khi không có vòng tròn bán kính r (dưới 200 m) xung quanh nó hoàn toàn được chứa trong đa giác. Hãy nghĩ về một mê cung: đa giác là tất cả mọi thứ trừ các hành lang trong mê cung. Người ta có thể thoát khỏi mê cung bắt đầu từ bất kỳ điểm nào trong đó, nhưng hầu hết các điểm sẽ bị "bao vây" theo nghĩa là bên ngoài mê cung sẽ không thể nhìn thấy được từ chúng.
whuber

từ sự hiểu biết của tôi, có nghĩa là ở đâu đó bạn không thể thoát ra. Khi không hợp lệ, bạn có thể thoát khỏi B nhưng không thoát khỏi A. Mặt khác, B dường như bị bao vây nếu bạn sử dụng chế độ xem (tốt, có thể không ở 200 m vì không có thanh tỷ lệ trên hình ảnh, nhưng bạn sẽ xem ranh giới đa giác khi nhìn theo mọi hướng). Tôi nghĩ rằng chúng tôi cần thêm chi tiết từ @Loz
radouxju

Đây hoàn toàn không phải là một câu hỏi khó nếu "không thể thoát" là tiêu chí cần kiểm tra: chỉ cần tập hợp lại phần bổ sung của đa giác, chỉ giữ lại thành phần bên ngoài duy nhất và kiểm tra để đưa vào bên trong nó. Tôi nghĩ rằng việc đọc kỹ câu hỏi - đặc biệt là các tài liệu tham khảo của nó để xem xét tất cả các vòng bi có thể - làm rõ ý nghĩa của việc "bao quanh" là gì, mặc dù tôi đồng ý rằng nó được nêu khá mơ hồ.
whuber
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.