শেফফাইল এবং রাস্টারকে ওভারলে কিভাবে করবেন?


18

বহুভুজ সহ আমার একটি আকার রয়েছে ile এবং আমার কাছে একটি গ্লোবাল রাস্টার ফাইল রয়েছে। আমি শেস্টারফিলের বহুভুজকে রাস্টার গ্রিডে ওভারলে করতে এবং প্রতিটি বহুভুজের জন্য গড় রাস্টার মান গণনা করতে চাই।

জিডিএল ব্যবহার করে কীভাবে এটি করতে পারি, শেফফাইলে ফলাফল লিখে?


4
আপনি ব্যবহার করতে চান জিডিএল কি একমাত্র সরঞ্জাম?
সিম্বামাঙ্গু

@ সিম্বামাঙ্গু না, মূলত কিছু ঠিক আছে, এবং পাইথনে থাকলে তা দুর্দান্ত হবে
এন্ড্রেস

উত্তর:


9

আর এ আপনি করতে পারেন

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

ই প্রতিটি বহুভুজের জন্য রাস্টার কোষের মানগুলির গড় সহ একটি ভেক্টর।


প্রশ্নে জিজ্ঞাসা করা এই
জিএম

6

অনুসরণ করছেন পরামর্শ আমি gdal-dev মেইল তালিকা পেয়েছিলাম, আমি ব্যবহার StarSpan :

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

ফলাফলগুলি CSV ফর্ম্যাটে সংরক্ষিত হয়েছে। এই সময়ে, এটি আমার জন্য ইতিমধ্যে যথেষ্ট ছিল, তবে কোনওভাবেই সেই তথ্য থেকে কোনও শেফিল তৈরি করা সম্ভব হয়েছিল।


স্টারস্প্যান মনে হয় গিটহাবে চলে গেছে। এটি এখানে পাবেন
রিচার্ড

5

নিম্নলিখিত স্ক্রিপ্ট আপনাকে জিডিএল দিয়ে টাস্কটি করতে দেয়: 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_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

এটি জিডিএল ব্যবহার করা সম্ভব নয়। তবে আপনি অন্যান্য নিখরচায় সরঞ্জামগুলি ব্যবহার করতে পারেন, যেমন: সাগা গিস:

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

আমি এই পদ্ধতির সাথে গিয়েছিলাম, যদিও ফাংশনটির নামটি আসলে "বহুভুজগুলির জন্য গ্রিড পরিসংখ্যান"।
কলাফিশ

1

আপনি রাস্টেরস্ট্যাটস থসও ব্যবহার করতে পারেন এই উদ্দেশ্যে ডিজাইন করা পাইথন মডিউল:

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
"গণনা পয়েন্ট পরিসংখ্যান সরঞ্জাম একটি ইনপুট বহুভুজ এবং পয়েন্ট বৈশিষ্ট্য শ্রেণি নেয় এবং সর্বনিম্ন, সর্বাধিক এবং পয়েন্টের গড় সন্ধান করার জন্য একটি নির্বাচিত ক্ষেত্র ব্যবহার করে এবং বহুভুজ বৈশিষ্ট্যে ফলাফল যুক্ত করে।" তবে এই প্রশ্নটি একটি বহুভুজ বৈশিষ্ট্য শ্রেণি এবং একটি রাস্টার সম্পর্কে তাই এটি উপযুক্ত বলে মনে হয় না।
পলিজিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.