आर या पायथन का उपयोग करके बड़े रैस्टर को पॉलीलाइन में बदलने का सबसे तेज़ तरीका?


14

मेरे पास वैश्विक जल निकायों (1 बिट मान 0 और 1) के साथ एक बड़ी रेखापुंज फ़ाइल (129600 64800 पिक्सेल) है और समुद्र और अंतर्देशीय जल शोरनों को निकालने का प्रयास करें।

मैंने आरकेजीआईएस और क्यूजीआईएस के साथ रेखापुंज से पॉलीलाइन में बदलने की कोशिश की है, लेकिन इसमें उम्र लगती है।

क्या कोई इस कार्य के लिए एक बेहतर / तेज़ तरीका (पायथन या आर) या एक बेहतर उपकरण जानता है?

अपडेट करें

  • R: rasterToContour तेज और सटीक हो सकता है, लेकिन अगर आपके पास मेरा (8,398,080,000 पिक्सेल) जैसा एक बहुत बड़ा डेटासेट है, तो आपको या तो बहुत बड़ी मात्रा में RAM (16GB से अधिक) की आवश्यकता है या आप R को हार्ड ड्राइव पर अधिक प्रोसेसिंग करने के लिए बाध्य करते हैं और यह उम्र भी लगेगा।
  • पायथन / GDAL: gdal_poligonize पॉलीइलाइन के बजाय बहुभुज बनाता है

अपडेट २

  • RasterToContour: rasterToContour वांछित परिणाम प्रदान नहीं करता है। आर्कजीआईएस (रेखांकन से बहुभुज तक रेखापुंज की सुविधा के बाद पंक्ति में) की तुलना में यह सटीक पिक्सेल रूपरेखा नहीं निकालता है, जैसा कि नीचे दिए गए उदाहरणों में दिखाया गया है।

rasterToContour परिणाम rasterToContour परिणाम

ArcGIS परिणाम ArcGIS परिणाम

अद्यतन 3

पायथन / GDAL: मैंने एक परीक्षण डेटासेट पर ArcGIS के खिलाफ कमांड लाइन से gdal_polygonize चलाया है और परिणाम बेहद स्पष्ट थे:

  • गदल: ४ ९ सेकंड
  • ArcGIS: 1.84 सेकंड

क्या ऐसा हुआ, देखें अपडेट 3.
जेनेरिक वीवर्स

क्या आप उस परीक्षण डेटासेट को प्रदान कर सकते हैं, इसलिए हम यह देख सकते हैं कि प्रस्तावित विकल्प तेज़ हैं और / या आवश्यक परिणाम तैयार कर रहे हैं?
कर्स्टन

ऐसे विशाल रेखापुंज के लिए, आप बेहतर तरीके से गाल्ड लाइब्रेरी के साथ C / C ++ का उपयोग कर सकते हैं।
रॉड्रिगो

जवाबों:


8

मैं आर के साथ काम कर रहा हूं और अतीत में पैकेज rasterToPolygonsसे इस्तेमाल किया rasterगया था, लेकिन अब मैं gdal_polygonizeRजॉन बॉमगार्टनर द्वारा पसंद करता हूं । यह आधार gdal_polygonize.pyऔर अधिक तेज है। जॉन बॉमगार्टनर ने कोड प्रकाशित किया और अपने ब्लॉग में उपयोग के लिए एक उदाहरण दिया ।

यदि आप अजगर से परिचित हैं तो आप gdal_polygonize.pyसीधे कोर्स का उपयोग कर सकते हैं ।


1
मैं देता हूँ मैं कोशिश करता हूँ। पिछली बार मैंने gdal_polygonize.py का उपयोग किया था। ArcGIS अभी भी तेज था।
जेनेरिक वीवर्स

मुझे उम्मीद नहीं थी कि आर्कगिस उस गदल से तेज हो सकता है। @ जेनरिक मिलित्जर
आइरिस

आह रुको, यह बहुभुज बनाएगा लेकिन मुझे पॉलीइन्स की आवश्यकता है।
जेनेरिक वीवर्स

यदि आप अपने डेटा को फाइल जियोडेटाबेस में रखते हैं तो यह बहुत तेज है। लेकिन फिर भी पर्याप्त उपवास नहीं किया। इसलिए मैं विकल्प खोज रहा हूं।
जेनेरिक वीवर्स

2
यह जरूरी नहीं कि एक समस्या है जो आपको पॉलीगॉन मिलती है, आप हमेशा उन्हें पॉलीइन्स में बदल सकते हैं (हालांकि, कई के साथ यह निश्चित रूप से कुछ समय लग सकता है)।
मार्टिन

7

पोस्टीरिटी के लिए, मुझे इस प्रकार के ऑपरेशन को जल्दी से करने के लिए stars::पैकेज के साथ सफलता मिली है R

library(raster)
library(stars)
library(sf)
library(magrittr)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- st_as_stars(r) %>% 
  st_as_sf() %>% # this is the raster to polygons part
  st_cast("MULTILINESTRING") # cast the polygons to polylines

plot(x)

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

plot(r)
plot(x, add = TRUE)

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


5

रेखापुंज पैकेज rasterToContourसे प्रयास करें ।

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- rasterToContour(r)
class(x)
> [1] "SpatialLinesDataFrame"
> attr(,"package")
> [1] "sp"

plot(r)
plot(x, add=TRUE)

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

फिर आप आसानी से एक स्थानीय फ़ोल्डर में फ़ाइलें लिख सकते हैं, उदाहरण के लिए 'ESRI शेपफाइल' (.shp) के रूप में, नीचे दिए गए कोड का उपयोग करके। पर एक नज़र डालें ogrDriversसे rgdal पता लगाने के लिए जो ड्राइवरों आपके सिस्टम के साथ संगत है।

library(rgdal)
writeOGR(x, dsn = getwd(), layer = "coastlines", driver = "ESRI Shapefile")

मैं कोशिश करूँगा और उँगलियाँ पार करूँगा यह मेरी रैम को नहीं मारेगा। भले ही मेरे पास 16 जीबी है, जो उम्मीद है कि पर्याप्त है, आर कभी-कभी बड़ी रास्टर फ़ाइलों के साथ इतना कुशल नहीं है। लेकिन देखते हैं।
जेनेरिक वीवर्स

रूपांतरण ने किसी तरह काम किया, लेकिन मैं विस्तार से जांच नहीं कर पाया। जैसा कि मैं आमतौर पर रेखापुंज डेटा प्रसंस्करण में अधिक होता हूं, क्या आप मुझे बता सकते हैं कि मैं एक आकृति या कुछ तुलनीय में SpatialLineDataFrame को कैसे स्थानांतरित कर सकता हूं। मैंने गुगली की है और अभी भी संघर्ष कर रहा हूं, क्योंकि मुझे परत नाम (OGRwrite) का पता नहीं है।
जेनेरिक वीवर्स

हाहा, मैं आपकी बात जरूर देखता हूं। ऊपर अद्यतन देखें।
fdetsch

2
एक और संकेत: 'मैक्सपिक्सल' rasterToContourको कुछ उच्च मूल्य पर सेट करने का प्रयास करें , जैसे 1e + 9। फिर आप अधिक विवरण के साथ समाप्त करेंगे। डिफ़ॉल्ट सेटिंग काफी सामान्यीकृत समोच्च लाइनें बनाती है।
fdetsch

1
यदि आप resampleएक मोटे स्थानिक संकल्प के लिए अपने डेटा के लिए तैयार नहीं हैं, तो एकमात्र समाधान जिसकी मैं कल्पना कर सकता हूं, वह है कि आप अपने डेटा को कई टाइलों (जैसे 16 उप-रस्टर्स) में विभाजित करें, फिर rasterToContourप्रत्येक टाइल पर एक पुनरावृत्त तरीके से प्रदर्शन करें और , अंत में, mergeपरिणामी आकृतिफाइल्स एक विशाल आकार आकृति में। यदि आप रुचि रखते हैं, तो हमारे कार्य समूह का पैकेज रुपेनल एक फ़ंक्शन प्रदान करता है जिसे splitRasterएक विशाल रास्टर से कई उप-रेखापुंज बनाने के लिए कहा जाता है।
fdetsch

2

जब मैं GDAL का बहुत बड़ा प्रशंसक हूं, तो बहुभुज उपकरण मेरे अनुप्रयोगों के लिए बहुत धीमा था।

एक तेज विकल्प है gdal_trace_outlineसे दहेज GDAL स्क्रिप्ट जो भी अधिक विकल्प के बारे में सहिष्णुता है, डोनट्स, आदि

जैसे gdal_polygonizeयह पॉलीगॉन भी पैदा करता है जिसे आपको बाद में बदलने की आवश्यकता होगी ogr2ogr -nlt MULTILINESTRING

जब तक आप लिनक्स या मैक ओएक्सएक्स सिस्टम पर नहीं होते, तब तक आपको इसे खुद कंपाइल करना होगा।


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