রাস্টার ফাইলে নাম্পার অ্যারে লেখা


30

আমি জিআইএসে নতুন।

আমার কাছে এমন কিছু কোড রয়েছে যা মার্সের ইনফ্রারেড চিত্রগুলিকে তাপের জড়তা মানচিত্রে রূপান্তর করে, যা পরে 2D নিম্পের অ্যারে হিসাবে সংরক্ষণ করা হয়। আমি এই মানচিত্রগুলি এইচডিএফ 5 ফাইল হিসাবে সংরক্ষণ করছি তবে আমি তাদের সত্যিকারের রাস্টার চিত্র হিসাবে সংরক্ষণ করতে চাই যাতে আমি এগুলি QGIS এ প্রক্রিয়া করতে পারি। এটি কীভাবে করা যায় তা খুঁজে পেতে আমি একাধিক অনুসন্ধানের মধ্য দিয়ে গিয়েছি তবে ভাগ্য নেই। আমি http://www.gis.usu.edu/~chrisg/python/ এ টিউটোরিয়ালের নির্দেশাবলী অনুসরণ করার চেষ্টা করেছি তবে আমি যখন উদাহরণস্বরূপ কোডগুলি QGIS এ আমদানি করি তখন সাধারণ ধূসর বাক্স হিসাবে খোলা ফাইলগুলি। আমি মনে করি যদি কেউ আমি কী করতে চাই তার সরল উদাহরণটিতে সহজতম পদ্ধতিটি প্রস্তাব করতে পারে তবে আমি কিছুটা অগ্রগতি করতে সক্ষম হতে পারি। আমার কিউজিআইএস এবং জিডিএল রয়েছে, আমি অন্য ফ্রেমওয়ার্কগুলি ইনস্টল করে খুব খুশি হব যে কেউ সুপারিশ করতে পারে। আমি ম্যাক ওএস 10.7 ব্যবহার করি।

সুতরাং উদাহরণস্বরূপ যদি আমার কাছে তাপ জড়তার একদম অ্যারে থাকে যা দেখতে লাগে:

TI = ( (0.1, 0.2, 0.3, 0.4),
       (0.2, 0.3, 0.4, 0.5),
       (0.3, 0.4, 0.5, 0.6),
       (0.4, 0.5, 0.6, 0.7) )

এবং প্রতিটি পিক্সেলের জন্য আমার কাছে অক্ষাংশ এবং দ্রাঘিমাংশ রয়েছে:

lat = ( (10.0, 10.0, 10.0, 10.0),
        ( 9.5,  9.5,  9.5,  9.5),
        ( 9.0,  9.0,  9.0,  9.0),
        ( 8.5,  8.5,  8.5,  8.5) )
lon = ( (20.0, 20.5, 21.0, 21.5),
        (20.0, 20.5, 21.0, 21.5),
        (20.0, 20.5, 21.0, 21.5),
        (20.0, 20.5, 21.0, 21.5) ) 

কিউজিআইএস-এ আমি খুলতে পারি এমন লোকেরা এই ডেটাটিকে একটি রাস্টার ফাইলে রূপান্তর করার জন্য কোন পদ্ধতির পরামর্শ দেবে?


টিউটোরিয়ালের কোন স্লাইডটি আপনি উল্লেখ করছেন?
আর কে

উত্তর:


23

আপনার সমস্যার একটি সম্ভাব্য সমাধান: এএসসিআইআই রাস্টার হিসাবে রূপান্তর করুন , যার জন্য এখানে ডকুমেন্টমেন্ট রয়েছে । অজগর দিয়ে এটি করা মোটামুটি সহজ হওয়া উচিত।

সুতরাং উপরের উদাহরণস্বরূপ আপনার উদাহরণ সহ, আপনি একটি .asc ফাইলে নিম্নলিখিতটি শেষ করতে চান:

ncols 4
nrows 4
xllcorner 20
yllcorner 8.5
cellsize 0.5
nodata_value -9999
0.1 0.2 0.3 0.4
0.2 0.3 0.4 0.5
0.3 0.4 0.5 0.6
0.4 0.5 0.6 0.7

এটি কিউজিআইএস এবং আর্কজিআইএস উভয়কে সাফল্যের সাথে যুক্ত করে এবং আর্কজিআইএস-এ এটি স্টাইলাইজড মনে হচ্ছে: উপরের রাস্টার সংস্করণ

সংযোজন: যদিও আপনি এটিকে QGIS এ উল্লিখিত হিসাবে যুক্ত করতে পারেন, যদি আপনি চেষ্টা করে এর জন্য সম্পত্তিগুলিতে যান (এটি স্টাইলাইজ করার জন্য), কিউজিআইএস ১.৮.০ হ্যাং হয়ে থাকে। আমি বাগ হিসাবে রিপোর্ট করতে চলেছি। যদি এটিও আপনার হয়ে থাকে, তবে সেখানে প্রচুর অন্যান্য ফ্রি জিআইএস রয়েছে।


ধন্যবাদ, দুর্দান্ত এবং আমি কল্পনা করেছিলাম যে আমার অ্যারে ascii ফাইল হিসাবে লিখে আমি প্রাক-লিখিত রূপান্তর ফাংশনটি ব্যবহার করে এটি বাইনারি বিন্যাসে রূপান্তর করতে পারি।
এডি দ্যবি

এফওয়াইআই, কিউজিআইএস-এর সাথে আমার ঝুলন্ত সমস্যা নেই, আমারও সংস্করণ 1.8.0 রয়েছে।
এডিডেবি

31

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

আপনার ব্যাখ্যা থেকে, মনে হচ্ছে আপনি কোনও বৈধ ফাইল লেখার ক্ষেত্রে সফল হতে পেরেছেন, তবে আপনাকে কেবল QGIS এ এটি প্রতীকী করা দরকার। যদি আমি সঠিকভাবে মনে রাখি, আপনি যখন প্রথম প্রথম কোনও রাস্টার যুক্ত করেন, আপনার যদি প্রাক-বিদ্যমান রঙের মানচিত্র না থাকে তবে প্রায়শই এটি সমস্ত রঙ দেখায়।

import numpy, sys
from osgeo import gdal
from osgeo.gdalconst import *


# register all of the GDAL drivers
gdal.AllRegister()

# open the image
inDs = gdal.Open("c:/workshop/examples/raster_reclass/data/cropland_40.tif")
if inDs is None:
  print 'Could not open image file'
  sys.exit(1)

# read in the crop data and get info about it
band1 = inDs.GetRasterBand(1)
rows = inDs.RasterYSize
cols = inDs.RasterXSize

cropData = band1.ReadAsArray(0,0,cols,rows)

listAg = [1,5,6,22,23,24,41,42,28,37]
listNotAg = [111,195,141,181,121,122,190,62]

# create the output image
driver = inDs.GetDriver()
#print driver
outDs = driver.Create("c:/workshop/examples/raster_reclass/output/reclass_40.tif", cols, rows, 1, GDT_Int32)
if outDs is None:
    print 'Could not create reclass_40.tif'
    sys.exit(1)

outBand = outDs.GetRasterBand(1)
outData = numpy.zeros((rows,cols), numpy.int16)


for i in range(0, rows):
    for j in range(0, cols):

    if cropData[i,j] in listAg:
        outData[i,j] = 100
    elif cropData[i,j] in listNotAg:
        outData[i,j] = -100
    else:
        outData[i,j] = 0


# write the data
outBand.WriteArray(outData, 0, 0)

# flush data to disk, set the NoData value and calculate stats
outBand.FlushCache()
outBand.SetNoDataValue(-99)

# georeference the image and set the projection
outDs.SetGeoTransform(inDs.GetGeoTransform())
outDs.SetProjection(inDs.GetProjection())

del outData

1
ফ্ল্যাশিংয়ের জন্য +1 - দেয়ালের বিরুদ্ধে মাথা ঘুরিয়ে দিয়েছিল কীভাবে জিনিসটি 'সংরক্ষণ' করতে পারে তা বোঝার চেষ্টা করছে!
ব্যাগলেগি

outDs = Noneএটি সংরক্ষণ করতে আমাকে যোগ করতে হয়েছিল
জাকএল

23

অবশেষে আমি এই সমাধানটি পেয়েছি, যা আমি এই আলোচনা থেকে পেয়েছি ( http://osgeo-org.1560.n6.nabble.com/gdal-dev-numpy-array-to-raster-td4354924.html )। আমি এটি পছন্দ করি কারণ আমি একদম নমির অ্যারে থেকে একটি টিফ রাস্টার ফাইলে সরাসরি যেতে পারি। সমাধানের উন্নতি করতে পারে এমন মন্তব্যের জন্য আমি খুব কৃতজ্ঞ থাকব। অন্য কেউ যদি অনুরূপ উত্তরের সন্ধান করে তবে আমি এটি এখানে পোস্ট করব।

import numpy as np
from osgeo import gdal
from osgeo import gdal_array
from osgeo import osr
import matplotlib.pylab as plt

array = np.array(( (0.1, 0.2, 0.3, 0.4),
                   (0.2, 0.3, 0.4, 0.5),
                   (0.3, 0.4, 0.5, 0.6),
                   (0.4, 0.5, 0.6, 0.7),
                   (0.5, 0.6, 0.7, 0.8) ))
# My image array      
lat = np.array(( (10.0, 10.0, 10.0, 10.0),
                 ( 9.5,  9.5,  9.5,  9.5),
                 ( 9.0,  9.0,  9.0,  9.0),
                 ( 8.5,  8.5,  8.5,  8.5),
                 ( 8.0,  8.0,  8.0,  8.0) ))
lon = np.array(( (20.0, 20.5, 21.0, 21.5),
                 (20.0, 20.5, 21.0, 21.5),
                 (20.0, 20.5, 21.0, 21.5),
                 (20.0, 20.5, 21.0, 21.5),
                 (20.0, 20.5, 21.0, 21.5) ))
# For each pixel I know it's latitude and longitude.
# As you'll see below you only really need the coordinates of
# one corner, and the resolution of the file.

xmin,ymin,xmax,ymax = [lon.min(),lat.min(),lon.max(),lat.max()]
nrows,ncols = np.shape(array)
xres = (xmax-xmin)/float(ncols)
yres = (ymax-ymin)/float(nrows)
geotransform=(xmin,xres,0,ymax,0, -yres)   
# That's (top left x, w-e pixel resolution, rotation (0 if North is up), 
#         top left y, rotation (0 if North is up), n-s pixel resolution)
# I don't know why rotation is in twice???

output_raster = gdal.GetDriverByName('GTiff').Create('myraster.tif',ncols, nrows, 1 ,gdal.GDT_Float32)  # Open the file
output_raster.SetGeoTransform(geotransform)  # Specify its coordinates
srs = osr.SpatialReference()                 # Establish its coordinate encoding
srs.ImportFromEPSG(4326)                     # This one specifies WGS84 lat long.
                                             # Anyone know how to specify the 
                                             # IAU2000:49900 Mars encoding?
output_raster.SetProjection( srs.ExportToWkt() )   # Exports the coordinate system 
                                                   # to the file
output_raster.GetRasterBand(1).WriteArray(array)   # Writes my array to the raster

output_raster.FlushCache()

3
X এ y এর ঘোরানো বিট এবং y এর উপর x এর ঘোরানো বিটের প্রভাবের জন্য অ্যাকাউন্টে "আবর্তন দ্বিগুণ হয়"। দেখুন lists.osgeo.org/pipermail/gdal-dev/2011-July/029449.html যেটি "ঘূর্ণন" পরামিতি পারস্পরিক সম্পর্কটি ব্যাখ্যা করার চেষ্টা করে।
ডেভ এক্স

এই পোস্টটি সত্যিই দরকারী, ধন্যবাদ। আমার ক্ষেত্রে যাইহোক, আমি একটি টিআইএফ ফাইল পাচ্ছি যা পুরোপুরি কালো I আমার স্থানিক উল্লেখটি হ'ল ব্রিটিশ ন্যাশনাল গ্রিড (EPSG = 27700), এবং ইউনিটগুলি মিটার।
ফ্যাকফি

আমি এখানে একটি প্রশ্ন পোস্ট করেছি: gis.stackex
بدل.

আইএইউ 2000: 49900 মঙ্গল এনকোডিং কীভাবে সেট করবেন তা আপনি খুঁজে পেয়েছেন?
কে.-মাইকেল আয়ে

4

পাইথনের অফিসিয়াল জিডিএল / ওজিআর কুকবুকেও একটি দুর্দান্ত সমাধান রয়েছে।

এই রেসিপিটি একটি অ্যারে থেকে একটি রাস্টার তৈরি করে

import gdal, ogr, os, osr
import numpy as np


def array2raster(newRasterfn,rasterOrigin,pixelWidth,pixelHeight,array):

    cols = array.shape[1]
    rows = array.shape[0]
    originX = rasterOrigin[0]
    originY = rasterOrigin[1]

    driver = gdal.GetDriverByName('GTiff')
    outRaster = driver.Create(newRasterfn, cols, rows, 1, gdal.GDT_Byte)
    outRaster.SetGeoTransform((originX, pixelWidth, 0, originY, 0, pixelHeight))
    outband = outRaster.GetRasterBand(1)
    outband.WriteArray(array)
    outRasterSRS = osr.SpatialReference()
    outRasterSRS.ImportFromEPSG(4326)
    outRaster.SetProjection(outRasterSRS.ExportToWkt())
    outband.FlushCache()


def main(newRasterfn,rasterOrigin,pixelWidth,pixelHeight,array):
    reversed_arr = array[::-1] # reverse array so the tif looks like the array
    array2raster(newRasterfn,rasterOrigin,pixelWidth,pixelHeight,reversed_arr) # convert array to raster


if __name__ == "__main__":
    rasterOrigin = (-123.25745,45.43013)
    pixelWidth = 10
    pixelHeight = 10
    newRasterfn = 'test.tif'
    array = np.array([[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                      [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                      [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1],
                      [ 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1],
                      [ 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1],
                      [ 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1],
                      [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1],
                      [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                      [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                      [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])


    main(newRasterfn,rasterOrigin,pixelWidth,pixelHeight,array)

এই রেসিপিটি ভাল তবে চূড়ান্ত টিফ ফাইলটি নিয়ে একটি সমস্যা রয়েছে। পিক্সেলের ল্যাট-লেন মানগুলি যথাযথ নয়।
শুভ_জিও

আপনি সম্ভবত ইএসআরআই ডব্লিউটিটি
অ্যাডাম এরিকসন

একটি জিনিস আমি মুখোমুখি হ'ল, আপনার দ্বারা উল্লিখিত উপায়টি অবশ্যই সহজেই সহজলভ্যভাবে অ্যাস্টিকে একজন রাস্টারে পরিণত করবে। তবে gdal_translate ব্যবহার করে উপরের বাম এবং নীচে ডানদিকে সমন্বিত হয়ে আমাদের এই রাস্টারটিকে জিওরিফারেন্স করতে হবে। এটি করার একটি উপায় দুটি পদক্ষেপ অনুসরণ করছে: 1) প্রথমে উপরের বাম এবং নীচে ডান ল্যাট-লান মানগুলি জিডালিনফো দিয়ে সন্ধান করুন 2) তারপরে, gdal_translate এর মাধ্যমে জিওটিফ ব্যবহার করুন (অ্যারেটিকে রাস্টার হিসাবে রূপান্তর করার উপরে উল্লিখিত পদ্ধতির সাহায্যে উত্পন্ন) এটিকে উপরের-বাম এবং নীচে ডান ল্যাট-লোন স্থানাঙ্কগুলির সাথে জিওরিফারেন্স করতে।
শুভম_জিও

0

অন্যান্য উত্তরে প্রস্তাবিত পদ্ধতির বিকল্প হ'ল rasterioপ্যাকেজটি ব্যবহার করা । এগুলি ব্যবহার করে আমার উত্পন্ন সমস্যা ছিল gdalএবং এই সাইটটি দরকারী বলে মনে হয়েছিল।

ধরে নিই যে আপনার কাছে আরও একটি টিআইফ ফাইল ( other_file.tif) এবং একটি নম্পি অ্যারে ( numpy_array) রয়েছে যা এই ফাইলটির মতোই রেজোলিউশন এবং ব্যাপ্তি রয়েছে, এটি আমার পক্ষে কাজ করেছে:

import rasterio as rio    

with rio.open('other_file.tif') as src:
    ras_data = src.read()
    ras_meta = src.profile

# make any necessary changes to raster properties, e.g.:
ras_meta['dtype'] = "int32"
ras_meta['nodata'] = -99

with rio.open('outname.tif', 'w', **ras_meta) as dst:
    dst.write(numpy_array, 1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.