कैसे बहुभुज को रेखापुंज बहुभुज


15

मैं रैस्टर को बहुभुज (कोई आर्किपी) में बदलने के लिए एक ओपन-सोर्स अजगर समाधान की मांग कर रहा हूं।

मैं RD को बहुभुज में बदलने के लिए GDAL फ़ंक्शन को जानता था, और यहाँ मैनुअल है: http://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#polygonize-a-raster-band

फिर भी, मुझे उम्मीद है कि आउटपुट एक फ़ाइल के रूप में सहेजा नहीं गया है, अस्थायी रूप से बहुभुज या किसी भी वस्तु, स्मृति में हो सकता है। क्या इस मुद्दे को संभालने के लिए कोई पैकेज या कोड है?

यदि रेखापुंज को एक संख्यात्मक सरणी में संसाधित किया गया है, तो दृष्टिकोण नीचे सूचीबद्ध है।

जवाबों:


22

सीन गिल्ली के रैस्टोरियो का उपयोग करें । यह आसानी से साथ जोड़ा जा सकता फियोना (पढ़ने और लिखने शेपफ़ाइलें) और सुडौल ही लेखक की।

स्क्रिप्ट rasterio_polygonize.py में शुरुआत है

import rasterio
from rasterio.features import shapes
mask = None
with rasterio.drivers():
    with rasterio.open('a_raster') as src:
        image = src.read(1) # first band
        results = (
        {'properties': {'raster_val': v}, 'geometry': s}
        for i, (s, v) 
        in enumerate(
            shapes(image, mask=mask, transform=src.affine)))

परिणाम GeoJSON सुविधाओं का एक जनरेटर है

 geoms = list(results)
 # first feature
 print geoms[0]
 {'geometry': {'type': 'Polygon', 'coordinates': [[(202086.577, 90534.3504440678), (202086.577, 90498.96207), (202121.96537406777, 90498.96207), (202121.96537406777, 90534.3504440678), (202086.577, 90534.3504440678)]]}, 'properties': {'raster_val': 170.52000427246094}}

कि आप सुडौल ज्यामितीय में बदल सकते हैं

from shapely.geometry import shape
print shape(geoms[0]['geometry'])
POLYGON ((202086.577 90534.35044406779, 202086.577 90498.96206999999, 202121.9653740678 90498.96206999999, 202121.9653740678 90534.35044406779, 202086.577 90534.35044406779))

जियोपैन्डस डेटाफ़्रेम बनाएँ और स्थानिक जुड़ाव, प्लॉटिंग, जियोजोन के रूप में बचत, ईएसआरआई शेपफाइल आदि की कार्यक्षमता का उपयोग करने के लिए आसान सक्षम करें।

geoms = list(results)
import geopandas as gp
gpd_polygonized_raster  = gp.GeoDataFrame.from_features(geoms)

यदि रेखापुंज को एक सुस्पष्ट सरणी के रूप में संसाधित किया गया है, तो क्या बहुगुण के रूप में एक खस्ता सरणी को बदलने का कोई तरीका है? धन्यवाद!
विक्की लियाओ

सिद्धांत रूप में, हां-
जीन

1
आपके उदाहरण में मास्क चर और पैरामीटर अनावश्यक लगता है। लेकिन मैं if value > src.nodataस्रोत के नोडटा मान का उपयोग करने के लिए सूची समझ में जोड़ने की सिफारिश करूंगा और इसके अनुरूप किसी भी आकार को छोड़ दूंगा। यह सुनिश्चित नहीं है कि यदि कोई नोडा वात नहीं है तो क्या होगा। : ओ)
बगमेनॉट १२

3
इस बीच उन्होंने rasterio.drivers को rasterio.Env और src.affine में बदलकर src.transform
Leo

4

यहाँ मेरा कार्यान्वयन है।

from osgeo import ogr, gdal, osr
from osgeo.gdalnumeric import *  
from osgeo.gdalconst import * 
import fiona
from shapely.geometry import shape
import rasterio.features

#segimg=glob.glob('Poly.tif')[0]
#src_ds = gdal.Open(segimg, GA_ReadOnly )
#srcband=src_ds.GetRasterBand(1)
#myarray=srcband.ReadAsArray() 
#these lines use gdal to import an image. 'myarray' can be any numpy array

mypoly=[]
for vec in rasterio.features.shapes(myarray):
    mypoly.append(shape(vec))

इंस्टालेशन समस्या होने पर रैस्टोरियो को इंस्टाल करने का तरीका 'conda install -c https://conda.anaconda.org/ioos rasterio' है।


रास्टरियो का परिणाम सीधे एक सुन्न सरणी है, इसलिए आपको जरूरत नहीं हैmyarray=srcband.ReadAsArray() #or any array
जीन

@ मैंने नोट को संशोधित किया। यह रेखा (myarray = srcband.ReadAsArray ()) छवि को आयात करने के लिए गदल का उपयोग करती है।
विक्की लियाओ

छवि को एक सुव्यवस्थित सरणी के रूप में आयात करें और rasterio सीधे छवि को एक सुव्यवस्थित सरणी के रूप में आयात करें
जीन

यह मेरे लिए काम कर रहा था, हालांकि मुझे vec को अनुक्रमित करना पड़ा क्योंकि यह एक टुपल के रूप में वापस आ रहा था। आकार (vec [0])
user2723146
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.