আমি পাইথন জিডাল গ্রন্থাগারগুলি ব্যবহার করে একটি রাস্টার তৈরি করার চেষ্টা করছি এবং আমি সেই স্থানে পৌঁছেছি যেখানে ডেটা আউটপুট হচ্ছে, তবে আউটপুট ডেটাটি মূল পয়েন্টের এক্স-অক্ষের উপর ফ্লিপ হয়েছে । আমি জানি যে আমি অবশ্যই কিছু উপেক্ষা করব তবে আমি কোথায় ভুল করছি তা বুঝতে পারি না। কোন ধারনা?
রাস্টার তৈরি করার সময় আমি উপরের বামে X / y মানগুলি সেট করেছিলাম এবং অ্যারেটি উপরের-বাম থেকে সূচিকৃত হয় এবং নীচের দিকে ডানদিকে অবিরত থাকে। নীচের কোডে আমি সারিটির মান দিয়ে অ্যারেটি পূরণ করছি।
অ্যারে প্রিন্ট করার সময় এটির মতো দেখাচ্ছে:
[[ 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.]
[ 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.
2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.
2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.
2. 2. 2. 2. 2. 2.]
[ 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.
3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.
3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.
3. 3. 3. 3. 3. 3.]
[ 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4.
4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4.
4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4.
4. 4. 4. 4. 4. 4.]
...
এবং এই তথ্যটি রাস্টার ব্যান্ডকে সাফল্যের সাথে লিখেছে। তবে ম্যাপওয়াইন্ডো জিআইএস- এ যখন দেখা হয় তখন ডেটাটি নীচের-বাম মান হিসাবে প্রদর্শিত মূলত উপরের-বাম মূল উত্সের সাথে বিপরীত দিকে যেতে দেখা যায় ।
অন্য কথায়, ডেটাটি মূল পয়েন্টের এক্স-অক্ষের উপরে উল্টানো হয় ।
import gdal
import osr
import numpy
OUTPUT_FORMAT = "GTiff"
def create_raster(filename="test.tif"):
driver = gdal.GetDriverByName(OUTPUT_FORMAT)
band_type = gdal.GDT_Byte
number_of_bands = 1
x_rotation = 0 # not supported
y_rotation = 0 # not supported
cell_width_meters = 50
cell_height_meters = 50
(min_lon, min_lat, max_lon, max_lat) = _get_point_bounds() # retrieve bounds for point data
srs = osr.SpatialReference()
srs.SetWellKnownGeogCS("WGS84") # Set geographic coordinate system to handle lat/lon
srs.SetUTM( 54, True) # Set projected coordinate system to handle meters
# create transforms for point conversion
wgs84_coordinate_system = srs.CloneGeogCS() # clone only the geographic coordinate system
wgs84_to_utm_transform = osr.CoordinateTransformation(wgs84_coordinate_system, srs)
# convert to UTM
top_left_x, top_left_y, z = wgs84_to_utm_transform.TransformPoint(min_lon, max_lat, 0)
lower_right_x, lower_right_y, z = wgs84_to_utm_transform.TransformPoint(max_lon, min_lat, 0)
cols, rows = _get_raster_size(top_left_x, lower_right_y, lower_right_x, top_left_y, cell_width_meters, cell_height_meters)
dataset = driver.Create(filename, cols, rows, number_of_bands, band_type) #
# GeoTransform parameters
# --> need to know the area that will be covered to define the geo tranform
# top left x, w-e pixel resolution, rotation, top left y, rotation, n-s pixel resolution
geo_transform = [ top_left_x, cell_width_meters, x_rotation, top_left_y, y_rotation, cell_height_meters ]
dataset.SetGeoTransform(geo_transform)
dataset.SetProjection(srs.ExportToWkt())
dataset_band = dataset.GetRasterBand(1)
data = dataset_band.ReadAsArray(0, 0, cols, rows).astype(numpy.float32) # returns empty array
for row in xrange(rows):
for col in xrange(cols):
data[row][ col] = row + 1
dataset_band.WriteArray(data, 0, 0)
dataset_band.SetNoDataValue(0.0)
dataset_band.FlushCache()
dataset = None # Close file
আমি যখন লক্ষ্য করেছি একটি প্রদত্ত লেট / লম্বার জন্য পিক্সেল অবস্থানের গণনা করেছি যখন নেতিবাচক সূচীতে y- মান ফলাফল হয়, যা অ্যারেটি উপরের-বাম থেকে নীচের দিকে ডানদিকে বিবেচনা করে সঠিক মনে হয় ।
inverse_geo_transform = gdal.InvGeoTransform(self.geo_transform)[1] # for mapping lat/lon to pixel
pixel_x, pixel_y = gdal.ApplyGeoTransform(self.inverse_geo_transform, utm_x, utm_y)