রাস্টার ডেটা অ্যারের আউটপুট পাইথন / জিডিএল ব্যবহার করে এক্স-অক্ষে ফ্লিপ হয়েছে?


9

আমি পাইথন জিডাল গ্রন্থাগারগুলি ব্যবহার করে একটি রাস্টার তৈরি করার চেষ্টা করছি এবং আমি সেই স্থানে পৌঁছেছি যেখানে ডেটা আউটপুট হচ্ছে, তবে আউটপুট ডেটাটি মূল পয়েন্টের এক্স-অক্ষের উপর ফ্লিপ হয়েছে । আমি জানি যে আমি অবশ্যই কিছু উপেক্ষা করব তবে আমি কোথায় ভুল করছি তা বুঝতে পারি না। কোন ধারনা?

রাস্টার তৈরি করার সময় আমি উপরের বামে 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)

উত্তর:


10

আমি সমস্যাটি পেয়েছি ...

ভূ-ট্রান্সফর্মটি সংজ্ঞায়নে সমস্যা is আমার নিম্নলিখিত ছিল:

x_rotation = 0 
y_rotation = 0 
cell_width_meters = 50
cell_height_meters = 50

geo_transform = [ top_left_x, cell_width_meters, x_rotation, top_left_y, y_rotation, cell_height_meters ]
dataset.SetGeoTransform(geo_transform)

এই মানগুলি কী তা সম্পর্কে জিডিএল ডকুমেন্টেশন প্রকৃত পরিষ্কার নয়। ( সেটজিও ট্রান্সফর্ম দেখুন ) ইন্টারনেটগুলির আশেপাশে অনুসন্ধান করা আমি প্রাপ্তি পেয়েছি যে উত্তীর্ণ হওয়া মানগুলি (ক্রম) হওয়া উচিত:

  • top_left_x
  • cell_width_meters
  • x_rotation
  • top_left_y
  • y_rotation
  • cell_height_meters

যা সঠিক মনে হয়, কিন্তু পুনরায় পর্যালোচনা করার GDAL এপিআই টিউটোরিয়াল আমি লক্ষ্য করেছি যে গত মান, cell_height_metersএকটি দেওয়া হচ্ছে দেখানো হয়েছিল নেতিবাচক মান। মনে হয় প্রত্যাশিত অরিয়েন্টেশনে ডেটা সঠিকভাবে আউটপুট করার জন্য এটিই ছিল।

সুতরাং এখন আমি ভূ - ট্রান্সফর্ম সংজ্ঞা রেখাকে এতে পরিবর্তন করেছি :

(যোগ করা "-" লক্ষ্য করুন)

geo_transform = [ top_left_x, cell_width_meters, x_rotation, top_left_y, y_rotation, -cell_height_meters ]

এটি বাম দিকের বামদিকে উত্সের মতো চিত্রের জগতগুলি এবং নীচে বাম ব্যবহারের ভূগোলের পদ্ধতিগুলির সাথে আচরণ করার theতিহ্যগত উপায়।
ইয়ান Turton

আপনি জানার পরে এটি অর্থবোধ করে, তবে কোড উদাহরণগুলি থেকে সমস্যাটির কাছে আসা যুক্তি বাছাই করা শক্ত। আমি খুঁজে পেয়েছি যে আর্কজিআইএস ডকুমেন্টেশনে রাস্টারদের
মনকুট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.