জিডিএল সহ পাইথন-এ ডাব্লুজিএস 1984 ওয়েব মার্কেটর (ইপিএসজি: 3857) পুনরায় প্রজেক্ট করা হচ্ছে


17

আমি জিডিএল ব্যবহার করে অজগরগুলিতে রেস্টারদের পুনরায় প্রজেক্ট করছি। ওপেনস্ট্রিটম্যাপ এবং সম্ভবত গুগল ম্যাপের সাথে একত্রে ওপেনলায়ারগুলিতে পরবর্তীতে এগুলি ব্যবহার করার জন্য, আমি ভৌগলিক ডাব্লুজিএস ৮৪ এর স্থানাঙ্ক থেকে ডাব্লুজিএস 1984 ওয়েব মার্কেটরেটার (সহায়ক গোলক) এর বেশ কয়েকটি টিফস প্রজেক্ট করা দরকার। আমি থেকে পাইথন 2.7.5 এবং GDAL 1.10.1 ব্যবহার করছি এখানে , এবং উপদেশ ব্যবহার থেকে স্থানাঙ্ক রূপান্তর এখানে (আমার কোড নিচে যায়)। সংক্ষেপে, আমি আমদানিকৃত osgeo.osr এবং ব্যবহৃত ImportFromEPSG (কোড) এবং CoordinateTransformation (চাই, থেকে)

আমি প্রথমে ইপিএসজি (32629) চেষ্টা করেছি যা ইউটিএম জোন 29, এবং এই অনুমানিত রাস্টার পেয়েছি (আরও বা কম জরিমানা), তাই কোডটি সঠিক বলে মনে হচ্ছে: UTM তারপরে আমি ইপিএসজি (3857) ব্যবহার করেছি কারণ আমি এই এবং এই প্রশ্নগুলি পড়েছি এবং পেয়েছি এটি সঠিক সাম্প্রতিক বৈধ কোড । তবে রাস্টারটি কোনও স্থানিক রেফারেন্স ছাড়াই তৈরি করা হয়েছে। এটি ডাব্লুজিএস ৮৪ ডেটা ফ্রেমে খুব বেশি দূরে রয়েছে (তবে আমি যদি ওয়েব মার্কেটরে ডেটা ফ্রেমটি স্যুইচ করি তবে ঠিক হবে)। 3857

সঙ্গে EPSG (900913) আউটপুট georeferenced কিন্তু উত্তরে 3 রাস্টার কোষ সম্পর্কে স্থানান্তরিত হয়: 900913

আমি যখন আর্কজিআইএস ব্যবহার করে রাস্টারটিকে পুনরায় প্রজেক্ট করি (WGS_1984_Web_Mercator_Auxiliary_Sphere এ রফতানি করি) ফলাফল প্রায় ভাল হয়: arcgis

এবং যখন আমি পুরানো কোড 102113 (41001,54004) ব্যবহার করি ফলাফলটি সঠিক: 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'

এটি আমি যা বলতে চাই তাতে সহায়তা করতে পারে, আমি ইপিএসজি: 3042 থেকে গুগল মার্কেটর একজনের কাছে পুনরায় প্রজেক্ট করছি, আমি নীতিগতভাবে 3857 বলে মনে করেছি, তবে যখন আমি চেষ্টা করব: gdal_translate -a_srs EPSG: 3857 ইনপুট.ফিট আউটপুট.টিফ, আউটপুটটি খুব দূরে (জিডিএল 1.11.2) রয়েছে, সৌভাগ্যক্রমে যখন তাদের আর্জিজিআইএস 10.2 এবং ডাব্লুজিএস_1984_ ওয়েবে_মেকেরেটর_অ্যাক্সিলারি_স্পিয়ার (ডাব্লুকিআইডি: 3857 কর্তৃপক্ষ: ইপিএসজি) ব্যবহার করে রাস্টার চিত্রগুলি সঠিক জায়গায় রয়েছে। সুতরাং, আমি বিশ্বাস করি যে জিপিএল এর সর্বশেষ সংস্করণগুলিতে ইপিএসজি: 3857 সঠিকভাবে পরিচালিত হচ্ছে না।
ওয়েব-জিআইএস উদ্যোক্তা

3
প্রত্যাখ্যানের পরে, রাস্টারটিকে আর একটি আয়তক্ষেত্র হতে হবে না। সুতরাং কোণার স্থানাঙ্কগুলি পুনরায় প্রবর্তন করা ভুল সমাধান হতে পারে। আপনি কি কমান্ড লাইনে gdalwarp চেষ্টা করেছেন? বিটিডাব্লু আপনি জিসিন্টারাল থেকে সর্বশেষতম জিডিএল সংস্করণটি পেতে পারেন।
আন্দ্রেজে

উত্তর:


5

আমি ফাইলগুলি পুনরায় প্র্রোজেক্ট করব gdalwarp

আমি ইপিএসজিতে ফাইলগুলির জন্য একই করেছি: 3763 যা আমি ইপিএসজি: 3857 এ রূপান্তর করতে চাই। আমি কিউজিআইএস এবং জিওসরবার ব্যবহার করে ফলাফলগুলি তুলনা করেছি এবং উত্পন্ন চিত্রগুলি ভাল ছিল। যেহেতু চিত্রগুলিতে একটি ছোট ঘোরানো প্রয়োগ করা হয়েছে, তাই আপনি সীমান্তে কিছু কালো রেখা পেতে পারেন (তবে এই লাইনগুলি পরে স্বচ্ছ করা যেতে পারে)।

আপনার বেশ কয়েকটি tifচিত্র রয়েছে বলে আপনি এই জাতীয় স্ক্রিপ্ট ব্যবহার করতে পারেন যা কোনও বিদ্যমান ফাইল পরিবর্তন করে না এবং উত্পন্ন ফাইলগুলি 3857 নামক ফোল্ডারে রাখে:

#!/bin/bash
mkdir 3857
for file in $(ls *.tif); do
    gdalwarp -s_srs EPSG:3763 -t_srs EPSG:3857 $file 3857/$file;
    listgeo -tfw 3857/$file;
done

আপনি যদি .twfফাইলগুলি তৈরি করতে চান তবে আমি যুক্ত করেছি listgeo

এই স্ক্রিপ্টটি লিনাক্সের জন্য তবে আপনি উইন্ডোজের জন্য অনুরূপ কিছু লিখতে পারেন।


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