द्विआधारी रेखापुंज में यादृच्छिक बिंदुओं की बड़ी मात्रा का निर्माण?


9

मैं एक द्विआधारी रेखापुंज के भीतर 10000 अंक (या बड़ा) का एक बिंदु वेक्टर डेटासेट बनाना चाहता हूं, जहां अंक उन क्षेत्रों के लिए विवश होना चाहिए जहां रेखीय मान 1 है।

मैंने निम्नलिखित चरणों की कोशिश की।

  1. बहुभुज रेखापुंज
  2. QGIS: वेक्टर -> अनुसंधान उपकरण -> यादृच्छिक अंक

यह 2000 अंकों तक ठीक काम करता है, लेकिन ऊपर कुछ भी QGIS दुर्घटना का कारण बनता है।

क्या एक द्विआधारी रेखापुंज (या इसके बहुभुज संस्करण) द्वारा विवश बिंदु सुविधाओं की एक बड़ी संख्या के साथ एक वेक्टर डेटासेट बनाने का एक तरीका है?

निम्नलिखित उपकरण मेरे निपटान में हैं, जो कि सबसे कम से कम अनुकूल हैं: QGIS, पायथन, R, ArcGIS

यह मैं केवल 10x पॉइंट फीचर्स के लिए जा रहा हूं।

1k यादृच्छिक अंक


आमतौर पर आपका रैस्टर कितना बड़ा है?
9

ऊपर दिए गए उदाहरण में से एक 19200 x 9600 है। ठेठ रेखापुंज लगभग 10000 x 10000 पिक्सेल है।
केर्स्टन

ठीक है, आपकी मशीन में रैम अधिक बेहतर है। मैं यहाँ अपने छोटे पीसी पर 10,000x10,000 रेखापुंज पर परीक्षण करने की हिम्मत नहीं करता, हालांकि आप हमेशा रेखापुंज को विभाजित कर सकते हैं, भागों में नमूना ले सकते हैं, और जुड़ सकते हैं ...
10

क्यों रेखापुंज बहुभुज? क्या आपको लगता है कि यह उत्तर आपके लिए उपयोगी है? gis.stackexchange.com/questions/22601/…
लुइगी पिरेली

क्योंकि तब मैं "रैंडम पॉइंट्स इन पॉलीगॉन" फ़ंक्शन का उपयोग कर सकता हूं, जबकि QGIS में "रैस्टर के विशिष्ट मानों के अंदर रैंडम पॉइंट्स" नहीं है।
केर्स्टन

जवाबों:


7

यहाँ R में एक तरीका है:

एक परीक्षण रेखापुंज करें, 20x30 कोशिकाएं, 1 से 1 तक के सेल सेट करें, प्लॉट:

> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)

एक फ़ाइल में एक मौजूदा रेखापुंज के लिए, उदाहरण के लिए एक जियोटीफ़, आप बस कर सकते हैं:

> m = raster("mydata.tif")

अब 1 कोशिकाओं के xy निर्देशांक का एक मैट्रिक्स प्राप्त करें, उन बिंदुओं को प्लॉट करें, और हम देखते हैं कि हमारे पास सेल केंद्र हैं:

> ones = xyFromCell(m,1:prod(dim(m)))[getValues(m)==1,]
> head(ones)
       x    y
[1,] -42 85.5
[2,] 102 85.5
[3,] 162 85.5
[4,]  42 76.5
[5,] -54 67.5
[6,]  30 67.5
> points(ones[,1],ones[,2])

चरण 1. एक एकल कक्ष के आकार में 1000 (xo, yo) जोड़े उत्पन्न करें जो एक बॉक्स में 0 पर केंद्रित हैं। resसेल का आकार पाने के लिए नोट का उपयोग करें :

> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])

चरण 2. उपरोक्त सभी बिंदुओं में से प्रत्येक से 1 कोशिकाओं की संख्या से 1000 मानों को बेतरतीब ढंग से नमूना करने के लिए कौन सा सेल काम कर रहा है:

> pts$cell = sample(nrow(ones), 1000, replace=TRUE)

अंत में ऑफ़सेट में सेल केंद्र को जोड़कर समन्वय की गणना करें। जाँच करने के लिए प्लॉट:

> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)

यहाँ 10,000 अंक दिए गए हैं (1000 से ऊपर 1000 बदलें), के साथ प्लॉट किया गया pch=".":

अंक

एक 200x300 रेखापुंज पर 10,000 अंकों के लिए बहुत अधिक तात्कालिक रूप से आधे अंक वाले। मुझे लगता है कि रेखापुंज में कितने लोगों के साथ समय में वृद्धि होगी।

एक आकृति के रूप में सहेजने के लिए, किसी SpatialPointsऑब्जेक्ट में कनवर्ट करें , इसे सही समन्वय प्रणाली संदर्भ (अपने रेखापुंज के समान) दें और सहेजें:

> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")

यह एक आकृति का निर्माण करेगा जिसमें विशेषता के रूप में सेल नंबर और ऑफ़सेट शामिल हैं।


यह बहुत ही आशाजनक लग रहा है। मेरे आर ने थोड़ा कठोर हो गया है: मैं एक वेक्टर प्रारूप (शेपफाइल, जियोजोन, जीएमएल, ... जो कुछ भी वास्तव में) को अंक निर्यात करने में सक्षम होगा - मुझे बाद में उपयोग के लिए नमूना बिंदुओं के स्थानों को बचाने की आवश्यकता है।
केर्स्टन

संपादन दिखाते हैं कि एक रेखापुंज को कैसे पढ़ें और
पीटीएस

3

जब भी मैं बड़े डेटासेट के साथ काम करता हूं, तो मैं QGIS के बाहर टूल / कमांड चलाना पसंद करता हूं, जैसे कि स्टैंडअलोन स्क्रिप्ट से या OSGeo4W शेल से । ऐसा नहीं है क्योंकि क्यूजीआईएस क्रैश (भले ही यह "जवाब नहीं दे रहा है" कहता है, यह संभवतः अभी भी डेटा को संसाधित कर रहा है जिसे आप टास्क मैनेजर से जांच सकते हैं ), लेकिन क्योंकि डेटा को संसाधित करने के लिए अधिक CPU संसाधन जैसे RAM उपलब्ध हैं। QGIS स्वयं चलाने के लिए स्मृति का एक अच्छा हिस्सा लेता है।

वैसे भी, QGIS के बाहर एक उपकरण चलाने के लिए ( आपको OSGeo4W इंस्टॉलर के माध्यम से QGIS स्थापित करना होगा ), इस पोस्ट में @gcarrillo द्वारा वर्णित पहले 2 चरणों का पालन करें : आयात qgis.core के साथ समस्या जब एक स्टैंड-अलोन PyQGIS स्क्रिप्ट लिख रहा है (मैं उसकी .bat फ़ाइल को डाउनलोड करने और उपयोग करने का सुझाव देता हूं)।

PATHS सेट होने के बाद, pythonकमांड लाइन में टाइप करें । सुविधा के लिए, निम्न कोड को एक पाठ संपादक जैसे कि नोटपैड में कॉपी करें, मापदंडों को संपादित करें जैसे कि आपके शेपफाइल का पथनाम आदि आदि और फिर राइट-क्लिक> पेस्ट द्वारा पूरी चीज़ को कमांड लाइन में पेस्ट करें :

import os, sys
from qgis.core import *
from qgis.gui import *
from PyQt4.QtGui import *

from os.path import expanduser
home = expanduser("~")

QgsApplication( [], False, home + "/AppData/Local/Temp" )

QgsApplication.setPrefixPath("C://OSGeo4W64//apps//qgis", True)
QgsApplication.initQgis()
app = QApplication([])

sys.path.append(home + '/.qgis2/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

shape = home + "/Desktop/Polygon.shp"
result = home + "/Desktop/Point.shp"
general.runalg("qgis:randompointsinlayerbounds", shape, 10000, 0, result)

स्क्रिप्ट का उपयोग करते हुए, मैंने लेयर बाउंड्स टूल में रैंडम पॉइंट्स को काफी बड़े शेपफाइल के लिए चलाया और इसमें 10k पॉइंट्स जेनरेट करने में 20 सेकंड का समय लगा। क्यूजीआईएस के अंदर इसे चलाने में मेरे लिए लगभग 2 मिनट का समय लगा, इसलिए एक महत्वपूर्ण अंतर है।


1
उत्कृष्ट विकल्प, +1। बस इसे मेरे आवेदन के लिए परीक्षण किया गया है और जबकि यह आर दृष्टिकोण से थोड़ा धीमा है, यह वांछित परिणाम बनाता है।
कर्स्टन

@Kersten - बहुत बढ़िया, खुशी है कि यह काम करता है :)
यूसुफ

1

आप इस काम के लिए सीधे GRASS GIS का उपयोग कर सकते हैं - स्तरीकृत यादृच्छिक नमूना: स्थानिक बाधाओं के साथ वेक्टर मानचित्र से यादृच्छिक नमूनाकरण :

https://grass.osgeo.org/grass72/manuals/v.random.html#stratified-random-sampling:-random-sampling-from-vector-map-with-spatial-constraints

इसके अतिरिक्त, विशेषता द्वारा वेक्टर मानचित्र से यादृच्छिक नमूनाकरण और कुछ अन्य तरीकों को कमांड में लागू किया जाता है।

नोट: प्रसंस्करण के माध्यम से QGIS में उजागर v.random संस्करण पूर्ण कार्यक्षमता को प्रतिबिंबित नहीं करता है, लेकिन सिर्फ एक सरलीकृत दृश्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.