गाल्डपैप बाइंडिंग के उपयोग से गाल्डपर्प का दोहराव परिणाम


20

मैं GDAL पायथन बाइंडिंग के साथ पुन: प्रोजेक्ट / पुनः प्रयास करने का प्रयास कर रहा हूं, लेकिन कमांड लाइन उपयोगिता से उन लोगों की तुलना में थोड़ा अलग परिणाम प्राप्त कर रहा हूं 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 स्तंभ) के साथ-साथ किनारों के पास कुछ अलग पिक्सेल मूल्यों के साथ।

नीचे test_epsg3573.tif और test_epsg3573_gdalwarp.tif के पारदर्शी ओवरले देखें। यदि चित्र समान थे तो केवल काले और सफेद पिक्सेल होंगे, कोई ग्रे नहीं।

QGIS का उपरिशायी test_epsg3573.tif और test_epsg3573_gdalwarp.tif

पायथन 2.7.8, GDAL 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% पारदर्शिता पर ओवरले दिखाती है। हल्के भूरे रंग के पिक्सेल दो परिणामों के बीच विसंगतियां हैं।

QGIS में असंगतता


1
क्या आपने कोशिश की है gdal.AutoCreateWarpedVRT(source_file, source_srs_wkt, dest_srs_wkt)?
user2856

धन्यवाद ल्यूक, इस समारोह को नहीं जानता था। अभी-अभी कोशिश की है, लेकिन कुछ पिक्सेल अभी भी दोनों के बीच भिन्न हैं। यानी, चूहों के भू-रूपांतरण और आकार समान हैं (जब अप-नमूना नहीं किया गया है), लेकिन कुछ पिक्सेल अलग-अलग तरह से बदल दिए गए लगते हैं। यह कम से कम इस मुद्दे को प्रदर्शित करता है, तब भी मौजूद है जब तक कि नमूना-अप नहीं होता है।
ब्रूस वालिन

जवाबों:


16

के रूप में मैं एक ही परिणाम प्राप्त gdalwarpसे gdal.AutoCreateWarpedVRTअगर मैं डिफ़ॉल्ट (-et) में मैच के लिए 0.125 करने के लिए त्रुटि सीमा निर्धारित gdalwarp । वैकल्पिक रूप से, आप डिफ़ॉल्ट को मैच -et 0.0करने के gdalwarpलिए अपने कॉल में सेट कर सकते हैं gdal.AutoCreateWarpedVRT

उदाहरण

इसकी तुलना करने के लिए एक संदर्भ बनाएँ:

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

पायथन में प्रक्षेपण चलाएँ (GDAL ऑटोटेस्ट सूट में "warp_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" 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.