कैसे आकृति और रेखापुंज ओवरले करने के लिए?


18

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

मैं इसे GDAL का उपयोग कैसे कर सकता हूं, परिणाम को आकृति के लिए लिख रहा हूं?


4
क्या GDAL एकमात्र उपकरण है जिसका आप उपयोग करना चाहते हैं?
Simbamangu

@ सिंबांगु नहीं, मूल रूप से कुछ भी ठीक है, और यह बहुत अच्छा होगा अगर यह पायथन में हो
andreash

जवाबों:


9

R में आप कर सकते हैं

library(raster)
library(rgdal)
r <- raster('raster_filename')
p <- readOGR('shp_path', 'shp_file')
e <- extract(r, p, fun=mean)

ई प्रत्येक बहुभुज के लिए रेखापुंज सेल मूल्यों के माध्यम से एक वेक्टर है।


यह आर अजगर नहीं है जैसा कि प्रश्न में कहा गया है
जीएम

6

सलाह के बाद मुझे गदल-देव मेलिंग सूची में मिला, मैंने स्टारस्पैन का इस्तेमाल किया :

starspan --vector V --raster R1 R2 ... --stats mystats.csv avg mode

परिणाम CSV प्रारूप में सहेजे जाते हैं। उस समय, यह मेरे लिए पहले से ही पर्याप्त था, लेकिन किसी तरह से उस जानकारी से एक शेपफाइल बनाना संभव होना चाहिए।


लगता है StarSpan GitHub में स्थानांतरित हो गया है। इसे यहाँ ले आओ
रिचर्ड

5

निम्न स्क्रिप्ट आपको GDAL के साथ कार्य करने की अनुमति देती है: http://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#calculate-zonal-statistics

# Calculates statistics (mean) on values of a raster within the zones of an polygon shapefile

import gdal, ogr, osr, numpy

def zonal_stats(input_value_raster, input_zone_polygon):

    # Open data
    raster = gdal.Open(input_value_raster)
    driver = ogr.GetDriverByName('ESRI Shapefile')
    shp = driver.Open(input_zone_polygon)
    lyr = shp.GetLayer()

    # get raster georeference info
    transform = raster.GetGeoTransform()
    xOrigin = transform[0]
    yOrigin = transform[3]
    pixelWidth = transform[1]
    pixelHeight = transform[5]

    # reproject geometry to same projection as raster
    sourceSR = lyr.GetSpatialRef()
    targetSR = osr.SpatialReference()
    targetSR.ImportFromWkt(raster.GetProjectionRef())
    coordTrans = osr.CoordinateTransformation(sourceSR,targetSR)
    feat = lyr.GetNextFeature()
    geom = feat.GetGeometryRef()
    geom.Transform(coordTrans)

    # Get extent of geometry
    ring = geom.GetGeometryRef(0)
    numpoints = ring.GetPointCount()
    pointsX = []; pointsY = []
    for p in range(numpoints):
            lon, lat, z = ring.GetPoint(p)
            pointsX.append(lon)
            pointsY.append(lat)
    xmin = min(pointsX)
    xmax = max(pointsX)
    ymin = min(pointsY)
    ymax = max(pointsY)

    # Specify offset and rows and columns to read
    xoff = int((xmin - xOrigin)/pixelWidth)
    yoff = int((yOrigin - ymax)/pixelWidth)
    xcount = int((xmax - xmin)/pixelWidth)+1
    ycount = int((ymax - ymin)/pixelWidth)+1

    # create memory target raster
    target_ds = gdal.GetDriverByName('MEM').Create('', xcount, ycount, gdal.GDT_Byte)
    target_ds.SetGeoTransform((
        xmin, pixelWidth, 0,
        ymax, 0, pixelHeight,
    ))

    # create for target raster the same projection as for the value raster
    raster_srs = osr.SpatialReference()
    raster_srs.ImportFromWkt(raster.GetProjectionRef())
    target_ds.SetProjection(raster_srs.ExportToWkt())

    # rasterize zone polygon to raster
    gdal.RasterizeLayer(target_ds, [1], lyr, burn_values=[1])

    # read raster as arrays
    banddataraster = raster.GetRasterBand(1)
    dataraster = banddataraster.ReadAsArray(xoff, yoff, xcount, ycount).astype(numpy.float)

    bandmask = target_ds.GetRasterBand(1)
    datamask = bandmask.ReadAsArray(0, 0, xcount, ycount).astype(numpy.float)

    # mask zone of raster
    zoneraster = numpy.ma.masked_array(dataraster,  numpy.logical_not(datamask))

    # calculate mean of zonal raster
    return numpy.mean(zoneraster)

4

PostGIS 2.0 में अपनी शेपफाइल और अपने रैस्टर को लोड करें और करें:

SELECT (ST_SummaryStats(ST_Clip(rast, geom))).*
FROM rastertable, geomtable

4

मुझे नहीं लगता कि GDAL इसके लिए सबसे अच्छा साधन है, लेकिन आप बहुभुज के बाहर के सभी मूल्यों को "स्पष्ट" करने के लिए gdal_rasterize का उपयोग कर सकते हैं।

कुछ इस तरह:

gdal_translate -a_nodata 0 original.tif work.tif
gdal_rasterize -burn 0 -b 1 -i work.tif yourpolygon.shp -l yourpolygon
gdalinfo -stats work.tif
rm work.tif

Gdal_rasterize प्रोग्राम फ़ाइल को संशोधित करता है, इसलिए हम काम करने के लिए एक कॉपी बनाते हैं। हम कुछ विशेष मूल्य (इस मामले में शून्य) को भी नोडता मानते हैं। "-बर्न 0-बी 1" का अर्थ है लक्ष्य फ़ाइल (वर्क.आईफ़) के बैंड 1 में शून्य का मान जलाएं। "-I" का अर्थ है उलटा रेखांकन इसलिए हम अंदर के बजाय बहुभुज के बाहर मूल्यों को जलाते हैं । बैंड के आँकड़ों पर रिपोर्ट्स के साथ gdalinfo कमांड। मेरा मानना ​​है कि यह नोडटा मूल्य (जिसे हमने -a_nodata के साथ पहले चिह्नित किया था) को बाहर कर देगा।


2

Gdal_rasterize द्वारा रैस्टर में शेप फ़ाइल को ट्रांसफ़ॉर्म करें और प्रत्येक बहुभुज के जोनल स्टैटिस्टिक की गणना करने के लिए http://www.spatial-ecology.net/dokuwiki/doku.php?id=wiki:geo_tools में कोड का उपयोग करें । आप अपने किमी स्टैटिस्टिक के साथ टिफ प्राप्त करना चाहते हैं तो आप http://km.fao.org/OFwiki/index.php/Oft-reclass चला सकते हैं । कोड Ciao Giuseppe का आनंद लें


क्या आपके पास उस कोड की एक प्रति होनी चाहिए जिसका आप उल्लेख करते हैं? दुर्भाग्य से पायथन फाइल का लिंक मृत है।
ustroetz

1

GDAL का उपयोग करना संभव नहीं है। आप अन्य मुफ्त साधनों का उपयोग कर सकते हैं, उदाहरण के लिए गाथा जीआईएस:

saga_cmd shapes_grid "Grid Values to Shapes" -GRIDS=grid.sgrd -POLYGONS=in.shp -SHAPES=out.shp-NODATA -TYPE=1

मैं इस दृष्टिकोण के साथ गया था, हालांकि फ़ंक्शन नाम वास्तव में "पॉलीगन्स के लिए ग्रिड सांख्यिकी" है।
केलेफिश

1

तुम भी rasterstats का उपयोग कर सकते हैं thas इस उद्देश्य के लिए डिज़ाइन किया गया एक पायथन मॉड्यूल है:

from rasterstats import zonal_stats
listofzones = zonal_stats("polygons.shp", "elevation.tif",
            stats="mean")

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

तब आप पहले ज़ोन की विशेषता का उपयोग कर सकते हैं:

mean_of_zone1 = listofzones[0]['mean']

-2

आप आर्क गिस में कैलकुलेशन पॉइंट टूल टूल का उपयोग कर सकते हैं और यह टूल http://ianbroad.com/arcgis-toolbox-calculate-point-statistics-polygon-arcpy/ से डाउनलोड किया जा सकता है


2
"कैलकुलेट पॉइंट पॉइंट टूल एक इनपुट पॉलीगॉन और पॉइंट फीचर क्लास लेता है और पॉइंट्स के न्यूनतम, अधिकतम और औसत का पता लगाने के लिए एक चयनित फ़ील्ड का उपयोग करता है और परिणामों को पॉलीगॉन फीचर में जोड़ता है।" लेकिन यह सवाल एक बहुभुज सुविधा वर्ग और एक रेखापुंज के बारे में है, इसलिए यह उपयुक्त होने की संभावना नहीं है।
PolyGeo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.