জিডাল পাইথন বাইন্ডিং ব্যবহার করে জিডালওয়ার্পের প্রতিরূপ তৈরির ফলাফল


20

আমি জিডিএল অজগর বাইন্ডিংগুলির সাথে পুনঃ-প্রকল্প / পুনরায় নমুনার চেষ্টা করছি, তবে কমান্ড লাইন ইউটিলিটি থেকে তুলনায় কিছুটা ভিন্ন ফলাফল পাচ্ছি gdalwarp

সংক্ষিপ্ত উদাহরণের জন্য নীচে আপডেট দেখুন

এই স্ক্রিপ্টটি পাইথন পদ্ধতির চিত্র তুলে ধরেছে:

from osgeo import osr, gdal
import numpy


def reproject_point(point, srs, target_srs):
    '''
    Reproject a pair of coordinates from one spatial reference system to
    another.
    '''
    transform = osr.CoordinateTransformation(srs, target_srs)
    (x, y, z) = transform.TransformPoint(*point)

    return (x, y)


def reproject_bbox(top_left, bottom_right, srs, dest_srs):
    x_min, y_max = top_left
    x_max, y_min = bottom_right
    corners = [
        (x_min, y_max),
        (x_max, y_max),
        (x_max, y_min),
        (x_min, y_min)]
    projected_corners = [reproject_point(crnr, srs, dest_srs)
                         for crnr in corners]

    dest_top_left = (min([crnr[0] for crnr in projected_corners]),
                     max([crnr[1] for crnr in projected_corners]))
    dest_bottom_right = (max([crnr[0] for crnr in projected_corners]),
                         min([crnr[1] for crnr in projected_corners]))

    return dest_top_left, dest_bottom_right


################################################################################
# Create synthetic data
gtiff_drv = gdal.GetDriverByName('GTiff')
w, h = 512, 512
raster = numpy.zeros((w, h), dtype=numpy.uint8)
raster[::w / 10, :] = 255
raster[:, ::h / 10] = 255
top_left = (-109764, 215677)
pixel_size = 45

src_srs = osr.SpatialReference()
src_srs.ImportFromEPSG(3413)

src_geotran = [top_left[0], pixel_size, 0,
               top_left[1], 0, -pixel_size]

rows, cols = raster.shape
src_ds = gtiff_drv.Create(
    'test_epsg3413.tif',
    cols, rows, 1,
    gdal.GDT_Byte)
src_ds.SetGeoTransform(src_geotran)
src_ds.SetProjection(src_srs.ExportToWkt())
src_ds.GetRasterBand(1).WriteArray(raster)


################################################################################
# Reproject to EPSG: 3573 and upsample to 7m
dest_pixel_size = 7

dest_srs = osr.SpatialReference()
dest_srs.ImportFromEPSG(3573)

# Calculate new bounds by re-projecting old corners
x_min, y_max = top_left
bottom_right = (x_min + cols * pixel_size,
                y_max - rows * pixel_size)
dest_top_left, dest_bottom_right = reproject_bbox(
    top_left, bottom_right,
    src_srs, dest_srs)

# Make dest dataset
x_min, y_max = dest_top_left
x_max, y_min = dest_bottom_right
new_rows = int((x_max - x_min) / float(dest_pixel_size))
new_cols = int((y_max - y_min) / float(dest_pixel_size))
dest_ds = gtiff_drv.Create(
    'test_epsg3573.tif',
    new_rows, new_cols, 1,
    gdal.GDT_Byte)
dest_geotran = (dest_top_left[0], dest_pixel_size, 0,
                dest_top_left[1], 0, -dest_pixel_size)
dest_ds.SetGeoTransform(dest_geotran)
dest_ds.SetProjection(dest_srs.ExportToWkt())

# Perform the projection/resampling
gdal.ReprojectImage(
    src_ds, dest_ds,
    src_srs.ExportToWkt(), dest_srs.ExportToWkt(),
    gdal.GRA_NearestNeighbour)

dest_data = dest_ds.GetRasterBand(1).ReadAsArray()

# Close datasets
src_ds = None
dest_ds = None

এর আউটপুট সঙ্গে তুলনা করুন:

gdalwarp -s_srs EPSG:3413 -t_srs EPSG:3573 -tr 7 7 -r near -of GTiff test_epsg3413.tif test_epsg3573_gdalwarp.tif

এগুলি আকারে (2 সারি এবং 1 কলাম দ্বারা) পাশাপাশি প্রান্তের কাছাকাছি কিছু পৃথক পিক্সেল মানগুলির সাথে পৃথক হয়।

নীচে নীচে টেস্ট_সেপস 3535. ফিফ এবং টেস্ট_পিসজি 3573_gdalwarp.tif এর স্বচ্ছ ওভারলে দেখুন। চিত্রগুলি অভিন্ন হলে কেবল কালো এবং সাদা পিক্সেল থাকবে, ধূসর নয়।

কিউজিআইএস ওভারলে টেস্ট_এপএসজি 3573. ফিফ এবং টেস্ট_পিসজি 3573_gdalwarp.tif

পাইথন 2.7.8, জিডিএল 1.11.1, নম্পি 1.9.1 দিয়ে পরীক্ষিত

আপডেট :

এখানে একটি আরও ছোট উদাহরণ। এটি আপসাম্পলিংয়ের কারণে ঘটেনি বলে মনে হয় কারণ নিম্নলিখিতগুলিও এর সাথে অসঙ্গতিযুক্ত ফলাফল উত্পন্ন করেgdalwarp

from osgeo import osr, gdal
import numpy


# Create synthetic data
gtiff_drv = gdal.GetDriverByName('GTiff')
w, h = 512, 512
raster = numpy.zeros((w, h), dtype=numpy.uint8)
raster[::w / 10, :] = 255
raster[:, ::h / 10] = 255
top_left = (-109764, 215677)
pixel_size = 45

src_srs = osr.SpatialReference()
src_srs.ImportFromEPSG(3413)

src_geotran = [top_left[0], pixel_size, 0,
               top_left[1], 0, -pixel_size]

rows, cols = raster.shape
src_ds = gtiff_drv.Create(
    'test_epsg3413.tif',
    cols, rows, 1,
    gdal.GDT_Byte)
src_ds.SetGeoTransform(src_geotran)
src_ds.SetProjection(src_srs.ExportToWkt())
src_ds.GetRasterBand(1).WriteArray(raster)

# Reproject to EPSG: 3573
dest_srs = osr.SpatialReference()
dest_srs.ImportFromEPSG(3573)

int_ds = gdal.AutoCreateWarpedVRT(src_ds, src_srs.ExportToWkt(), dest_srs.ExportToWkt())

# Make dest dataset
dest_ds = gtiff_drv.Create(
    'test_epsg3573_avrt.tif',
    int_ds.RasterXSize, int_ds.RasterYSize, 1,
    gdal.GDT_Byte)
dest_ds.SetGeoTransform(int_ds.GetGeoTransform())
dest_ds.SetProjection(int_ds.GetProjection())
dest_ds.GetRasterBand(1).WriteArray(int_ds.GetRasterBand(1).ReadAsArray())

# Close datasets
src_ds = None
dest_ds = None

এবং এটি জিডিওয়াল্প কল যা আমি একই রকম প্রত্যাশা করি, তবুও তা নয়:

gdalwarp -s_srs EPSG:3413 -t_srs EPSG:3573 -of GTiff test_epsg3413.tif test_epsg3573_gdalwarp.tif

নীচের চিত্রটি 50% স্বচ্ছতার সাথে ওভারলাইড হওয়া প্রতিটি ফলাফলের বাইনারি চিত্র দেখায়। হালকা ধূসর পিক্সেল দুটি ফলাফলের মধ্যে অসঙ্গতি।

কিউজিআইএস-এ অসঙ্গতি চিত্রিত


1
আপনি চেষ্টা করেছেন gdal.AutoCreateWarpedVRT(source_file, source_srs_wkt, dest_srs_wkt)?
ব্যবহারকারী2856

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

উত্তর:


16

যেমন আমি একই ফলাফল পেতে gdalwarpথেকে gdal.AutoCreateWarpedVRTযদি আমি ডিফল্ট (-et) এ মেলে 0,125 ত্রুটির থ্রেশহোল্ড সেট gdalwarp । বিকল্পভাবে, আপনি ডিফল্ট সাথে মেলে -et 0.0আপনার কলটিতে সেট করতে পারেন ।gdalwarpgdal.AutoCreateWarpedVRT

উদাহরণ

এর সাথে তুলনা করার জন্য একটি রেফারেন্স তৈরি করুন:

gdalwarp -t_srs EPSG:4326 byte.tif warp_ref.tif

পাইথনে প্রজেকশনটি চালান (জিডিএল অটোটেস্ট স্যুটে "ওয়ারপ_27 () ফাংশনের কোডের ভিত্তিতে ):

# Open source dataset
src_ds = gdal.Open('byte.tif')

# Define target SRS
dst_srs = osr.SpatialReference()
dst_srs.ImportFromEPSG(4326)
dst_wkt = dst_srs.ExportToWkt()

error_threshold = 0.125  # error threshold --> use same value as in gdalwarp
resampling = gdal.GRA_NearestNeighbour

# Call AutoCreateWarpedVRT() to fetch default values for target raster dimensions and geotransform
tmp_ds = gdal.AutoCreateWarpedVRT( src_ds,
                                   None, # src_wkt : left to default value --> will use the one from source
                                   dst_wkt,
                                   resampling,
                                   error_threshold )

# Create the final warped raster
dst_ds = gdal.GetDriverByName('GTiff').CreateCopy('warp_test.tif', tmp_ds)
dst_ds = None

# Check that we have the same result as produced by 'gdalwarp -rb -t_srs EPSG:4326 ....'

ref_ds = gdal.Open('warp_ref.tif')
ref_cs = ref_ds.GetRasterBand(1).Checksum()

ds = gdal.Open('warp_test.tif')
cs = ds1.GetRasterBand(1).Checksum()

if cs == ref_cs:
    print 'success, they match'
else:
    print "fail, they don't match" 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.