আমি জিডিএল ব্যবহার করে অজগরগুলিতে রেস্টারদের পুনরায় প্রজেক্ট করছি। ওপেনস্ট্রিটম্যাপ এবং সম্ভবত গুগল ম্যাপের সাথে একত্রে ওপেনলায়ারগুলিতে পরবর্তীতে এগুলি ব্যবহার করার জন্য, আমি ভৌগলিক ডাব্লুজিএস ৮৪ এর স্থানাঙ্ক থেকে ডাব্লুজিএস 1984 ওয়েব মার্কেটরেটার (সহায়ক গোলক) এর বেশ কয়েকটি টিফস প্রজেক্ট করা দরকার। আমি থেকে পাইথন 2.7.5 এবং GDAL 1.10.1 ব্যবহার করছি এখানে , এবং উপদেশ ব্যবহার থেকে স্থানাঙ্ক রূপান্তর এখানে (আমার কোড নিচে যায়)। সংক্ষেপে, আমি আমদানিকৃত osgeo.osr এবং ব্যবহৃত ImportFromEPSG (কোড) এবং CoordinateTransformation (চাই, থেকে) ।
আমি প্রথমে ইপিএসজি (32629) চেষ্টা করেছি যা ইউটিএম জোন 29, এবং এই অনুমানিত রাস্টার পেয়েছি (আরও বা কম জরিমানা), তাই কোডটি সঠিক বলে মনে হচ্ছে: তারপরে আমি ইপিএসজি (3857) ব্যবহার করেছি কারণ আমি এই এবং এই প্রশ্নগুলি পড়েছি এবং পেয়েছি এটি সঠিক সাম্প্রতিক বৈধ কোড । তবে রাস্টারটি কোনও স্থানিক রেফারেন্স ছাড়াই তৈরি করা হয়েছে। এটি ডাব্লুজিএস ৮৪ ডেটা ফ্রেমে খুব বেশি দূরে রয়েছে (তবে আমি যদি ওয়েব মার্কেটরে ডেটা ফ্রেমটি স্যুইচ করি তবে ঠিক হবে)।
সঙ্গে EPSG (900913) আউটপুট georeferenced কিন্তু উত্তরে 3 রাস্টার কোষ সম্পর্কে স্থানান্তরিত হয়:
আমি যখন আর্কজিআইএস ব্যবহার করে রাস্টারটিকে পুনরায় প্রজেক্ট করি (WGS_1984_Web_Mercator_Auxiliary_Sphere এ রফতানি করি) ফলাফল প্রায় ভাল হয়:
এবং যখন আমি পুরানো কোড 102113 (41001,54004) ব্যবহার করি ফলাফলটি সঠিক:
সমস্ত কোড ব্যবহার করে আমার পরীক্ষার সংক্ষিপ্তসার :
3857: far away up (missing georeference)
3785: far away up (like 3857)
3587: far away right
900913: slightly jumped up
102100: python error
102113: perfect
41001: perfect
54004: perfect
ArcGIS (web merc. aux.): good
সুতরাং আমার প্রশ্নগুলি হ'ল:
- কেন সঠিক ইপিএসজি কোড আমাকে ভুল ফলাফল দেয়?
- এবং কেন পুরানো কোডগুলি সূক্ষ্মভাবে কাজ করে, সেগুলি অবহেলা করা হয় না?
- হতে পারে আমার জিডিএল ভার্সনটি ভাল না বা আমার পাইথন কোডে আমার ত্রুটি আছে?
কোড:
yres = round(lons[1]-lons[0], 4) # pixel size, degrees
xres = round(lats[1]-lats[0], 4)
ysize = len(lats)-1 # number of pixels
xsize = len(lons)-1
ulx = round(lons[0], 4)
uly = round(lats[-1], 4) # last
driver = gdal.GetDriverByName(fileformat)
ds = driver.Create(filename, xsize, ysize, 2, gdal.GDT_Float32) # 2 bands
#--- Geographic ---
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) # Geographic lat/lon WGS 84
ds.SetProjection(srs.ExportToWkt())
gt = [ulx, xres, 0, uly, 0, -yres] # the affine transformation coeffs (ulx, pixel, angle(skew), uly, angle, -pixel)
ds.SetGeoTransform(gt) # coords of top left corner of top left pixel (w-file - center of the pixel!)
outband = ds.GetRasterBand(1)
outband.WriteArray(data)
outband2 = ds.GetRasterBand(2)
outband2.WriteArray(data3)
#--- REPROJECTION ---
utm29 = osr.SpatialReference()
# utm29.ImportFromEPSG(32629) # utm 29
utm29.ImportFromEPSG(900913) # web mercator 3857
wgs84 = osr.SpatialReference()
wgs84.ImportFromEPSG(4326)
tx = osr.CoordinateTransformation(wgs84,utm29)
# Get the Geotransform vector
# Work out the boundaries of the new dataset in the target projection
(ulx29, uly29, ulz29) = tx.TransformPoint(ulx, uly) # corner coords in utm meters
(lrx29, lry29, lrz29) = tx.TransformPoint(ulx + xres*xsize, uly - yres*ysize )
filenameutm = filename[0:-4] + '_web.tif'
dest = driver.Create(filenameutm, xsize, ysize, 2, gdal.GDT_Float32)
xres29 = round((lrx29 - ulx29)/xsize, 2) # pixel size, utm meters
yres29 = abs(round((lry29 - uly29)/ysize, 2))
new_gt = [ulx29, xres29, 0, uly29, 0, -yres29]
dest.SetGeoTransform(new_gt)
dest.SetProjection(utm29.ExportToWkt())
gdal.ReprojectImage(ds, dest, wgs84.ExportToWkt(), utm29.ExportToWkt(), gdal.GRA_Bilinear)
dest.GetRasterBand(1).SetNoDataValue(0.0)
dest.GetRasterBand(2).SetNoDataValue(0.0)
dest = None # Flush the dataset to the disk
ds = None # only after the reprojected!
print 'Image Created'