यह निर्धारित करना कि रेखापुंज प्रसंस्करण का उपयोग करके बिंदु को घेर लिया गया है


9

मैं एक प्राकृतिक खतरे वाले मॉडल के लिए वर्तमान में बेहद बोझिल वेक्टर / अजगर प्रक्रिया में सुधार करने का प्रयास कर रहा हूं। फिलहाल हमारे पास एक लंबी लिपि है जो निर्धारित करने के लिए दिए गए बिंदु से दूरी / असर लाइनें उत्पन्न करती है:

  1. बहुभुज का प्रकार जो इसे काटता है (जैसे। वन, घास, दलदल, आदि)
  2. उस बहुभुज की दूरी
  3. इनमें से कितनी पंक्तियाँ पॉलीगन्स को काटती हैं, यह निर्धारित करने के लिए कि यह कैसे 'घिरी' है।

इसमें और भी बहुत कुछ शामिल है लेकिन यह इसका सार है। मैं इसे सुधारने का एक तरीका खोजने की कोशिश कर रहा हूं और वर्तमान में भाग 3 पर स्टम्प्ड हूं। विचार यह निर्धारित करने के लिए है कि कोई बिंदु पूरी तरह से पॉलीगोन से घिरा हुआ है, 200 मी के भीतरपॉइंटए चारों ओर से घिरा हुआ है, जबकि पॉइंटबी केवल ~ 50% से घिरा हुआ है

इसलिए मेरी संलग्न छवि में, मैं बिंदु A को बिंदु B से अधिक जोखिम वाले होने के रूप में चिह्नित करना चाहूंगा क्योंकि यह पूरी तरह से मेरे बहुभुजों से घिरा हुआ है। यह लगभग 13 मिलियन अंकों के लिए दोहराया जाता है, इसलिए यह एक छोटा काम नहीं है और मुझे हमारी स्क्रिप्ट चलाने के बजाय मूल्यों को प्राप्त करने के लिए एक सतह होगी। मुझे लगता है कि ऐसा करने के लिए जल विज्ञान उपकरण या लागत-पथ का एक भिन्नता है, लेकिन मैं इसके चारों ओर अपना सिर प्राप्त करने के लिए प्रतीत नहीं कर सकता।

मैं इस बारे में कैसे जा सकता हूं?


1
Viewshed कार्य पर निर्भर है, लेकिन 13 मिलियन अंकों पर लागू होने पर काफी मदद की आवश्यकता है! पहले इस बात पर विचार करें कि किस तरह से खरपतवार ऐसे बिंदु हैं जिनके आसपास की जाँच करना आसान है, जैसे कि बहुभुज के बाहरी क्षेत्रों में स्थित बिंदु जो कि व्यास से कम है (कहना) 200 मी: जो "ए" को नियंत्रित कर सकता है लेकिन शायद "बी" नहीं। "बी" को कभी भी खारिज नहीं किया जाएगा क्योंकि इसका दृश्य (बहुभुज क्षेत्रों को बहुत "उच्च" स्थानों को देखने से रोकते हुए) बी के स्थान से 200 मीटर से अधिक तक फैला हुआ है।
whuber

एक अच्छा बिंदु @whuber। निश्चित रूप से मैं वास्तव में निकटता द्वारा संसाधित किए गए अंकों की कुल संख्या को कम करने में सक्षम हूं और वास्तव में अद्वितीय लैट-लॉन्ग (साथ ही मैं जियोकोडेड पते पर बात कर रहा हूं ताकि अपार्टमेंट ब्लॉक 50 अंक से 1 तक कम हो सकते हैं) लेकिन मैं अभी भी देख रहा हूं कई मिलियन स्थानों पर। यदि आवश्यक हो तो मैं भी सब कुछ अतिव्यापी ब्लॉकों में तोड़ सकता हूं। जांच की जाएगी। धन्यवाद!
लोज

एक और त्वरित स्क्रीन एक कुंडलाकार पड़ोस का उपयोग करके अपने बहुभुज के 0-1 संकेतक ग्रिड का एक फोकल माध्य गणना करने के लिए है: किसी भी कोशिकाओं पर जहां इसका मूल्य 1 है, आपके पॉलीगोन पूरे परिधि को त्रिज्या पर बाहर निकालते हैं, जहां उन्हें घेरना चाहिए। यह एक तेज़ गणना है और आपके अंकों के विशाल हिस्से पर निर्भर करता है कि वे कहां हैं और आपके पॉलीगोन कितने जटिल हैं। आप पहले अपने ग्रिड को किसी मोटे रिज़ॉल्यूशन में 25-50 मीटर या उसके स्थान पर फिर से खोलकर शुरुआती स्क्रीनिंग को भी तेज़ कर सकते हैं।
whuber

एक अन्य संभावित प्रसंस्करण कदम, या पूर्व-प्रसंस्करण कदम, आपके डेटासेट के rasterized संस्करण के माध्यम से अपने बिंदुओं को पास करना होगा, जो बिंदुओं के आस-पास के पड़ोस के आंकड़ों की तुलना करता है। आप या तो बिंदुओं के पड़ोस के एक आंकड़े के रूप में अपनी 'घिरी हुई' आवश्यकता को समाप्त कर सकते हैं, या यदि 'घिरा हुआ' आवश्यक है, तो आप रास्टर पड़ोस का उपयोग करते हुए 'आसान' अंक (जोखिम वाले क्षेत्र में पूरी तरह से एक बिंदु) पा सकते हैं, सभी बिंदुओं से 'आसान' बिंदुओं को पार्स करें, फिर बाकी बिंदुओं के लिए वेक्टर विश्लेषण का उपयोग करें।
DPierce

वाह मेरी क्वेरी निश्चित रूप से बहुत रुचि पैदा की है! सुझाव और टिप्पणियों में योगदान करने वाले सभी को धन्यवाद। मैं अपने तरीके से काम करने जा रहा हूँ, हालांकि वे सब और जवाब देते हैं, लेकिन वे सभी मुझे परीक्षण करने के लिए कुछ समय लेने जा रहे हैं। मैं वादा करता हूँ मैं अंततः जवाब दूंगा!
Loz

जवाबों:


6

एक लागत-पथ समाधान है लेकिन आपको इसे स्वयं कोड करना होगा। जब प्रश्न में छवि के प्रत्येक बिंदु पर लागू किया जाता है तो यह कैसा दिख सकता है (गणनाओं को गति देने के लिए थोड़ा सा छोटा):

चित्र 0

काली कोशिकाएँ आसपास के बहुभुजों का हिस्सा होती हैं। नीले (लंबे) के माध्यम से हल्के नारंगी (छोटे) से लेकर रंग, अधिकतम दूरी (अधिकतम 50 कोशिकाओं तक) दिखाते हैं, जो बहुभुज कोशिकाओं को बाधित किए बिना लाइन-ऑफ-द-ट्रैवर्सल तक पहुंच सकते हैं। (इस छवि की सीमा के बाहर किसी भी कोशिका को बहुभुज के हिस्से के रूप में माना जाता है।)

आइए डेटा के रेखापुंज प्रतिनिधित्व का उपयोग करते हुए एक कुशल तरीके पर चर्चा करें। इस प्रतिनिधित्व में सभी "आसपास" पॉलीगोनल कोशिकाओं में, नॉनज़रो वैल्यूज़ और किसी भी सेल को "के माध्यम से" देखा जा सकता है, का शून्य मान होगा।

चरण 1: एक पड़ोस डेटा संरचना को पूर्वव्यापी करना

आपको पहले यह तय करना होगा कि एक सेल को दूसरे को ब्लॉक करने का क्या मतलब है। सबसे उचित नियमों में से एक मैं यह पा सकता हूं: पंक्तियों और स्तंभों के लिए अभिन्न निर्देशांक (और वर्ग कोशिकाओं को संभालने) का उपयोग करते हुए, आइए हम विचार करें कि कौन सी कोशिकाएं मूल (0,0) के दृश्य से सेल (i, j) को रोक सकती हैं। मैं सेल (i ', j') को नामांकित करता हूं जो कि उन सभी कोशिकाओं के बीच (i, j) से (0,0) को जोड़ने वाले लाइन सेगमेंट के सबसे करीब है, जिनके निर्देशांक i और j से अलग-अलग होते हैं। 1. क्योंकि यह हमेशा नहीं होता है एक अनूठा समाधान प्राप्त करें (उदाहरण के लिए, (i, j) = (1,2) दोनों (0,1) और (1,1) समान रूप से अच्छी तरह से काम करेंगे), संबंधों को हल करने के कुछ साधनों की आवश्यकता है। संबंधों के इस संकल्प के लिए यह अच्छा होगा कि ग्रिड में परिपत्र पड़ोस के समरूपता का सम्मान करें: समन्वय को नकारना या निर्देशांक को स्विच करना इन पड़ोस को संरक्षित करता है। इसलिए हम तय कर सकते हैं कि कौन सी कोशिकाएँ ब्लॉक होती हैं (i,

इस नियम का वर्णन निम्नलिखित प्रोटोटाइप कोड में लिखा गया है R। यह कोड एक डेटा संरचना देता है जो ग्रिड में मनमानी कोशिकाओं के "घेरने" को निर्धारित करने के लिए सुविधाजनक होगा।

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) )
}

screen(12)इस स्क्रीनिंग रिलेशन के इस चित्रण का उपयोग करने के लिए मूल्य का उपयोग किया गया था: तीर उन कोशिकाओं से इंगित करते हैं जो उन्हें तुरंत स्क्रीन करते हैं। इस दूरी को मूल से दूरी के अनुपात में रखा गया है, जो इस पड़ोस के बीच में है:

आकृति 1

यह गणना तेज है और किसी दिए गए पड़ोस के लिए केवल एक बार किया जाना चाहिए। उदाहरण के लिए, 5 मीटर कोशिकाओं वाले ग्रिड पर 200 मीटर की दूरी पर देखने पर, पड़ोस का आकार 200/5 = 40 यूनिट होगा।

चरण 2: चयनित बिंदुओं पर अभिकलन लागू करना

शेष सीधा है: यह निर्धारित करने के लिए कि इस पड़ोस डेटा संरचना के संबंध में (x, y) (पंक्ति और स्तंभ निर्देशांक में स्थित) "घिरा हुआ" है, फिर से (i, j) की भरपाई के साथ पुनरावर्ती शुरुआत करें। = (0,0) (पड़ोस मूल)। यदि बहुभुज ग्रिड में मान (x, y) + (i, j) नॉनजरो है, तो वहां दृश्यता अवरुद्ध हो जाती है। अन्यथा, हमें उन सभी ऑफसेटों पर विचार करना होगा जिन्हें ऑफसेट (i, j) पर अवरुद्ध किया जा सकता है (जो O (1) समय में डेटा संरचना द्वारा दिए गए समय का उपयोग करके पाया जाता है screen)। यदि कोई भी अवरुद्ध नहीं है, तो हम परिधि तक पहुंच गए हैं और निष्कर्ष निकालते हैं कि (x, y) घिरा नहीं है, इसलिए हम गणना को रोकते हैं (और पड़ोस में किसी भी शेष बिंदुओं का निरीक्षण करने के लिए परेशान नहीं करते हैं)।

हम एल्गोरिथ्म के दौरान पहुंची दूर-दूरी की दृष्टि का ट्रैक रखकर और भी उपयोगी जानकारी एकत्र कर सकते हैं। यदि यह वांछित त्रिज्या से कम है, तो सेल घिरा हुआ है; अन्यथा यह नहीं है।

यहाँ Rइस एल्गोरिथम का एक प्रोटोटाइप है। ऐसा लगता है की तुलना में लंबा है, क्योंकि Rपुनरावृत्ति को लागू करने के लिए आवश्यक सरल (सरल) स्टैक संरचना का समर्थन नहीं करता है, इसलिए एक स्टैक को कोडित भी करना पड़ता है। वास्तविक एल्गोरिथ्म लगभग दो-तिहाई रास्ते से शुरू होता है और केवल एक दर्जन लाइनों या तो की जरूरत है। (और आधे लोग केवल ग्रिड के किनारे के आस-पास की स्थिति को संभालते हैं, पड़ोस के भीतर-बाहर अनुक्रमित अनुक्रमों के लिए जाँच करते हैं। यह बहुभुज ग्रिड को kइसकी परिधि के चारों ओर पंक्तियों और स्तंभों द्वारा विस्तारित करके और अधिक कुशल बनाया जा सकता है , किसी को भी नष्ट कर सकता है। बहुभुज ग्रिड को रखने के लिए थोड़ी अधिक रैम की कीमत पर इंडेक्स रेंज की जाँच की आवश्यकता है।)

#
# 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)
}

चित्र 2: उदाहरण

इस उदाहरण में, बहुभुज कोशिकाएँ काली होती हैं। रंग गैर-बहुभुज कोशिकाओं के लिए अधिकतम लाइन-ऑफ-विज़न दूरी (50 कोशिकाओं में से) देते हैं, सबसे छोटी दूरी के लिए हल्के नारंगी से लेकर गहरे नीले रंग तक। (कोशिकाएँ एक इकाई चौड़ी और ऊँची होती हैं।) "नदी" के मध्य में छोटे बहुभुज "द्वीप" द्वारा दिखाई देने वाली स्पष्ट रूप से स्पष्ट धारियाँ निर्मित होती हैं: प्रत्येक एक अन्य कोशिकाओं की लंबी रेखा को अवरुद्ध करता है।

एल्गोरिथ्म का विश्लेषण

स्टैक संरचना साक्ष्य के लिए पड़ोस दृश्यता ग्राफ की गहराई-पहली खोज को लागू करती है जो एक सेल से घिरा नहीं है। जहाँ कोशिकाएँ किसी भी बहुभुज से दूर होती हैं, इस खोज के लिए त्रिज्या-के वृत्ताकार पड़ोस के लिए केवल O (k) कोशिकाओं के निरीक्षण की आवश्यकता होगी। सबसे खराब स्थिति तब होती है जब पड़ोस के भीतर बिखरी हुई बहुभुज कोशिकाओं की एक छोटी संख्या होती है, लेकिन फिर भी पड़ोस की सीमा तक नहीं पहुँचा जा सकता है: इन्हें प्रत्येक पड़ोस में लगभग सभी कोशिकाओं का निरीक्षण करने की आवश्यकता होती है, जो एक O (k ^ 2) है ऑपरेशन।

निम्नलिखित व्यवहार विशिष्ट है जो सामना किया जाएगा। K के छोटे मानों के लिए, जब तक कि बहुभुज अधिकांश ग्रिड को भर नहीं देते, तब तक अधिकांश गैर-बहुभुज कोशिकाएं स्पष्ट रूप से नायाब होंगी और एल्गोरिथ्म ओ (k) की तरह। मध्यवर्ती मूल्यों के लिए, स्केलिंग O (k ^ 2) की तरह दिखने लगता है। जैसा कि k वास्तव में बड़ा हो जाता है, अधिकांश कोशिकाओं को घेर लिया जाएगा और पूरे पड़ोस का निरीक्षण करने से पहले इस तथ्य को अच्छी तरह से निर्धारित किया जा सकता है: एल्गोरिथम का कम्प्यूटेशनल प्रयास जिससे व्यावहारिक सीमा तक पहुंचता है। यह सीमा तब प्राप्त होती है जब पड़ोस की त्रिज्या ग्रिड में सबसे बड़े जुड़े गैर-बहुभुज क्षेत्रों के व्यास से संपर्क करती है।

एक उदाहरण के रूप में, मैंने प्रत्येक कॉल में उपयोग किए गए स्टैक संचालन की संख्या वापस करने countingके screenलिए प्रोटोटाइप में कोडित विकल्प का उपयोग किया है। यह कम्प्यूटेशनल प्रयास को मापता है। निम्नलिखित ग्राफ पड़ोस त्रिज्या के एक समारोह के रूप में स्टैक ऑप्स की औसत संख्या को प्लॉट करता है। यह पूर्वानुमानित व्यवहार को प्रदर्शित करता है।

चित्र तीन

हम ग्रिड पर 13 मिलियन अंकों के मूल्यांकन के लिए आवश्यक गणना का अनुमान लगाने के लिए इसका उपयोग कर सकते हैं। मान लीजिए कि k = 200/5 = 40 का एक पड़ोस उपयोग किया जाता है। तब कुछ सौ स्टैक ऑपरेशन की आवश्यकता होगी (बहुभुज ग्रिड की जटिलता के आधार पर और जहां पॉलीगोन के सापेक्ष 13 मिलियन अंक स्थित हैं), यह देखते हुए कि एक कुशल संकलित भाषा में, कुछ हज़ार सरल संख्यात्मक कार्यों पर की आवश्यकता होगी (जोड़, गुणा, पढ़, लिख, ऑफसेट, आदि)। अधिकांश पीसी उस दर पर लगभग एक लाख अंक की घेरे का मूल्यांकन करने में सक्षम होंगे। (Rकार्यान्वयन अधिक है, इससे बहुत धीमा है, क्योंकि यह इस तरह के एल्गोरिदम में खराब है, यही कारण है कि यह केवल एक प्रोटोटाइप हो सकता है।) तदनुसार, हम उम्मीद कर सकते हैं कि एक यथोचित कुशल और उपयुक्त भाषा में एक कुशल कार्यान्वयन - सी ++। और पायथन के दिमाग में आया - एक मिनट या उससे कम में 13 मिलियन अंकों के मूल्यांकन को पूरा कर सकता है, यह मानते हुए कि पूरे बहुभुज ग्रिड रैम में रहते हैं।

जब एक ग्रिड रैम में फिट होने के लिए बहुत बड़ा होता है, तो यह प्रक्रिया ग्रिड के टाइल वाले भागों पर लागू की जा सकती है। उन्हें केवल kपंक्तियों और स्तंभों द्वारा ओवरलैप करना होगा ; परिणामों की मॉसिंग करते समय ओवरलैप्स पर मैक्सिमा लें।

अन्य अनुप्रयोगों

पानी की एक शरीर के "को लाने" बारीकी से अपने अंकों की "surroundedness" से संबंधित है। वास्तव में, यदि हम वाटरबॉडी के व्यास के बराबर या उससे अधिक के पड़ोस वाले त्रिज्या का उपयोग करते हैं, तो हम वाटरबॉडी में हर बिंदु पर (गैर-दिशात्मक) भ्रूण की एक ग्रिड बनाएंगे। एक छोटे से पड़ोस के दायरे का उपयोग करके, हम कम से कम सभी उच्चतम-भ्रूण बिंदुओं पर लाने के लिए एक कम बाध्य प्राप्त करेंगे, जो कुछ अनुप्रयोगों में काफी अच्छा हो सकता है (और कम्प्यूटेशनल प्रयास को काफी कम कर सकता है)। इस एल्गोरिथ्म का एक प्रकार जो विशिष्ट दिशाओं के संबंध में "जांच की गई" को सीमित करता है, उन दिशाओं में कुशलता से लाने के लिए एक तरीका है। ध्यान दें कि ऐसे वेरिएंट के लिए कोड को संशोधित करने की आवश्यकता होती है screen; के लिए कोड panvisibilityबिल्कुल नहीं बदलता है।


2

मैं निश्चित रूप से यह देख सकता हूं कि कोई भी इसे रेखापुंज समाधान के साथ कैसे करना चाहता है, लेकिन अंकों के # कम होने पर भी, मैं एक बहुत बड़े / उच्च-रिज़ॉल्यूशन की उम्मीद करूंगा और इसलिए ग्रिड या ग्रिड के सेट को संसाधित करना मुश्किल होगा। यह देखते हुए, मुझे आश्चर्य है कि अगर एक gdb में टोपोलॉजी का दोहन अधिक कुशल हो सकता है। आप कुछ के साथ सभी आंतरिक voids पा सकते हैं:

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')`

फिर आप topoErrorsVoidPolysअपने सामान्य पैटर्न के साथ Intersect_analysis()या जो भी काम कर सकते हैं । आपको ब्याज की पॉलिस निकालने के साथ गड़बड़ करने की आवश्यकता हो सकती है topoErrorsVoidPolys। @whuber के पास gis.stackexchange.com पर अन्य जगहों पर इस तरह के बहुत सारे बेहतरीन पोस्ट हैं।


यह एक दिलचस्प पूर्व-प्रसंस्करण विचार है। मुझे लगता है कि यह 200 मी सीमा (बफरिंग और चौराहे, आदि द्वारा) को आसानी से शामिल करने के लिए अनुकूलित किया जा सकता है। ग्रिड के बारे में आपका कहना बहुत बड़ा हो रहा है निश्चित रूप से एक वास्तविक चिंता का विषय है। जीआईएस में कोई नियम नहीं है जो कहता है कि समस्या का समाधान विशुद्ध रूप से रेखापुंज या विशुद्ध रूप से वेक्टर-आधारित होना है (हालांकि एक सिद्धांत है जो कहता है कि आपके पास बीच में एक प्रतिनिधित्व से दूसरे में बदलने के लिए एक बहुत अच्छा कारण होना चाहिए। एक विश्लेषण, यहां, जैसा कि आप सुझाव देते हैं, वास्तव में ऐसा करने से पर्याप्त लाभ हो सकता है)।
whuber

0

यदि आप वास्तव में रेखापुंज करना चाहते हैं ... मैं इस छद्म कोड की तर्ज पर कुछ करूँगा (बस अशुद्धि न करें) क्योंकि यह स्पष्ट है कि मैं एक एएमएल थ्रोबैक हूँ!: P)

  1. अंक ("pts_g") और पॉलिस ("polys_g")
  2. voids = क्षेत्रसमूह (con (isnull (polys_g), 1))
  3. अवांछित बाहरी बहुभुज / खुले ब्रह्मांड क्षेत्र को खत्म करने के लिए voids को परिष्कृत करने के लिए कुछ करने की आवश्यकता हो सकती है
  4. pts_surrounded = con (voids, pts_g)

बस इसे बनाने की जरूरत है, इसलिए शोधन की आवश्यकता हो सकती है।


आपका समाधान सीमित दूरी (में, 200 मी) का कोई संदर्भ नहीं देता है, इसलिए यह प्रश्न का सही उत्तर नहीं देता है।
whuber

आप सही हे। यह मेरे दूसरे उत्तर पर भी लागू होता है। मुझे लगता है कि कोई भी उपयोग कर सकता है Expand(), लेकिन उस समय मुझे लगता है कि @radouxju से उत्तर कार्यात्मक रूप से समतुल्य होगा और शायद तेज होगा। (देखे जाने के खिलाफ कुछ भी नहीं, बस इसका ज्यादा इस्तेमाल न करें)।
रोलैंड

जब समय समाप्त हुआ तो संपादित करने का प्रयास कर रहा था। का विस्तार करने के Expand()लिए कहना है कि pts_gबस पर और Con()साथ का उपयोग करने के लिए करना चाहते हैं polys_g
रोलैंड

0

यदि आप थ्रेसहोल्ड डिस्टेंस वैल्यू का उपयोग करते हैं (यहां आप 200 मीटर की बात करते हैं), तो वेक्टर विश्लेषण का उपयोग करने का सबसे अच्छा समाधान है:

1) प्रत्येक बिंदु के चारों ओर एक 200 मीटर बफर बनाएं (चित्रण में काले रंग में)

2) बफर और बहुभुज (चित्रण पर नीले रंग में) के बीच प्रतिच्छेद उपकरण (विश्लेषण) का उपयोग करें। यदि आप आसपास के बहुभुज और बफर की सीमाओं के बीच ऐसा करते हैं, तो यह अच्छा लगेगा, लेकिन अंतिम परिणाम समान है।

3) बहुभुज बनाने के लिए बहुभुज (प्रबंधन) की सुविधा का उपयोग करें जहां आपके बिंदु पूरी तरह से घिरे हुए हैं (चित्र में लाल रंग में)

4) उन बिंदुओं की पहचान करने के लिए स्थान (प्रबंधन) या स्थानिक जुड़ाव (विश्लेषण) द्वारा परतों का चयन करें। स्थानिक जुड़ाव का उपयोग आपको एम्बेडिंग बहुभुज (बहुभुज का क्षेत्र, आंचलिक सांख्यिकी ...) के बारे में जानकारी रखने की अनुमति देता है जो आगे की प्रक्रिया के लिए उपयोगी हो सकता है।

अल्टरनेटिव्स 2 बी) अपनी आवश्यकताओं के आधार पर, आप 200 मीटर की दूरी के भीतर आसपास के बहुभुज का चयन कर सकते हैं, फिर आप कुछ प्रकार के "संलग्नक" की पहचान कर सकते हैं लेकिन कड़ाई से 2 के रूप में नहीं)।

यहां छवि विवरण दर्ज करें

"भूलभुलैया के मामले" को ध्यान में रखते हुए, यह मदद कर सकता है: मूल्यांकन करें कि यह स्थान से "भागने" के लिए कितना समय है।

  • आप पहले से ही उन बिंदुओं को विश्लेषण से बाहर कर सकते हैं जो पूरी तरह से शामिल हैं या पूरी तरह से मुक्त हैं

  • तब आप अपनी बाधाओं को एक रेखापुंज में परिवर्तित करते हैं और मानों को NoData में सेट करते हैं जहाँ आपके पास बहुभुज होता है, और सेल आकार में मीटर में जहाँ आप नहीं करते हैं (यह आपकी लागत को तेज कर देगा)।

  • तीसरा, आप नई उत्पन्न लागत रेखापुंज का उपयोग करके लागत दूरी की गणना कर सकते हैं

  • अंत में, आप एक आंचलिक आँकड़ों का उपयोग तालिका के रूप में करते हैं जो बफर सीमाओं पर आधारित होती है जो रेखापुंज में परिवर्तित हो जाती है (वार्षिकी का निर्माण करती है)। यदि आप सभी दिशाओं में बच सकते हैं, तो न्यूनतम लगभग 200 होना चाहिए (आपके विश्लेषण के सेल आकार के आधार पर)। लेकिन अगर आप भूलभुलैया में हैं, तो अधिकतम 200 से बड़ा होगा। इसलिए आंचलिक सांख्यिकी माइनस 200 की अधिकतम संख्या निरंतर मान होगी जो यह बताती है कि "बचना" कितना मुश्किल है।


कृपया "घिरी हुई" की अपनी परिभाषा स्पष्ट करें। प्रश्न में विवरण बताता है कि एक बिंदु को "घिरा हुआ" माना जाना चाहिए, जब बहुभुज का कुछ हिस्सा उस बिंदु के आसपास सभी दिशाओं में दिखाई देता है (200 मीटर की दूरी तक)। आप कदम (3) में परीक्षण कैसे करते हैं, बिल्कुल? (यह आसान एक सदिश विश्लेषण का उपयोग नहीं कर रहा है!)
whuber

मैंने थोड़ा चित्रण जोड़ा है, इस तरह समझाना आसान है। यदि बफर सभी दिशाओं में बहुभुज को नहीं काटता है, तो लूप बंद नहीं होगा। और अगर लूप बंद नहीं होता है, तो यह बहुभुज नहीं बनाएगा।
राडौक्सु

मुझे यकीन नहीं है कि आप "पाश" या "बंद" से क्या मतलब है। ध्यान दें कि एक बिंदु "घिरी" हो सकता है तब भी जब त्रिज्या r (200 मीटर से कम) का कोई घेरा पूरी तरह से बहुभुज के भीतर समाहित न हो। एक भूलभुलैया के बारे में सोचो: बहुभुज भूलभुलैया में गलियारों को छोड़कर सब कुछ है । इसके भीतर किसी भी बिंदु पर शुरू होने वाले भूलभुलैया से बच सकते हैं, लेकिन अधिकांश बिंदु इस अर्थ में "घिरे" होंगे कि भूलभुलैया का बाहरी हिस्सा उनसे दिखाई नहीं देगा।
whuber

मेरी समझ से, इसका मतलब यह है कि कहीं आप बच नहीं सकते। Ilustration पर, आप B से बच सकते हैं, लेकिन A. से नहीं। दूसरी तरफ, B को घेर लिया जाएगा यदि आप व्यूशेड का उपयोग करते हैं (अच्छी तरह से, शायद 200 मीटर पर नहीं क्योंकि छवि पर कोई स्केल बार नहीं है, लेकिन आप करेंगे सभी दिशाओं में देखते समय बहुभुज सीमाएं देखें)। मुझे लगता है कि हमें
radouxju

यह बिल्कुल मुश्किल सवाल नहीं होगा अगर "बच नहीं सकते" जांच करने के लिए कसौटी थे: बहुभुज के पूरक को केवल क्षेत्र में रखें, केवल अद्वितीय बाहरी घटक रखें, और इसके भीतर समावेश के लिए जांच करें। मुझे लगता है कि प्रश्न का एक करीबी पढ़ना - विशेष रूप से सभी संभव बीयरिंगों को देखने के लिए इसके संदर्भ - उस भावना को स्पष्ट करता है जिसमें "घिरे" का इरादा है, हालांकि मैं मानता हूं कि यह बहुत अस्पष्ट रूप से कहा गया है।
whuber
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.