ডেটলাইনের কাছাকাছি বিশ্বজুড়ে আউটপুট তৈরি করা কীভাবে জিডালওয়ার্প বন্ধ করবেন?


11

আমি ডেটলাইনের নিকটে এসআরটিএম টাইলগুলি (যেমন 180 °, অ্যান্টিমারিডিয়ান ওরফে) হেরফের করতে জিডিওয়াল্প ব্যবহার করছি। এসআরটিএম টাইলসের মেরিডিয়ান সাথে খুব সামান্য (1/2 পিক্সেল) ওভারল্যাপ রয়েছে। আপনি gdalinfo ব্যবহার করে এটি দেখতে পারেন:

gdalinfo S16W180.hgt
Driver: SRTMHGT/SRTMHGT File Format
Files: S16W180.hgt
Size is 1201, 1201
[...]
Lower Left  (-180.0004167, -16.0004167) (180d 0' 1.50"W, 16d 0' 1.50"S)
Upper Right (-178.9995833, -14.9995833) (178d59'58.50"W, 14d59'58.50"S)
[...]

সুতরাং উত্সটি একটি অল্প পরিমাণে ডেটলাইনটি ছড়িয়ে দেয়।

এটি gdalwarp নিয়ে সমস্যা সৃষ্টি করে, যা শেষ করে বিশাল গ্লোব-স্প্যানিং আউটপুট তৈরি করে।

gdalwarp -t_srs "epsg:900913" S16W180.hgt test.tif
gdalinfo test.tif
Driver: GTiff/GeoTIFF
Files: test.tif
Size is 1703, 5
[...]
Lower Left  (-20037508.330,-1806798.473) (180d 0' 0.00"W, 16d 7'13.00"S)
Upper Right (20032839.451,-1689152.120) (179d57'29.01"E, 15d 5'45.84"S)

দ্রাঘিমাংশের স্প্যানটি (প্রায়) পুরো পৃথিবীটি নোট করুন, এবং রেখার সংখ্যা অপ্রত্যাশিতভাবে ছোট (5)

এই gdalwarp একটি বাগ? যদি তা না হয় তবে একটি বুদ্ধিমান আউটপুট পেতে gdalwarp এ যাওয়ার সঠিক বিকল্পগুলি কী কী?



যোগ SOURCE_EXTRA প্যারামিটার দেখুন code.google.com/p/maptiler/issues/detail?id=6 - চেষ্টা gdalwarp -t_srs epsg: 900913 -wo SOURCE_EXTRA = 120 S16W180.hgt test.tif
Mapperz

"টার্গেট এক্সটেন্টস" এর জন্য -te আর্গুমেন্টটি ব্যবহার করুন, বা বিদ্যমান ওভাররাইট করতে প্রথমে gdal_translate ব্যবহার করে এক্সটেন্টস ঠিক করুন, বা -প্রজুইন আপনার সীমানার মধ্যে থাকা বিটটি কেটে ফেলতে পারেন
mdsumner

উত্তর:


2

একটি সহজ কাজ হতে পারে হ'ল সমন্বিত সিস্টেমটি "ম্যানুয়ালি" একটি PROJ স্ট্রিং হিসাবে নির্দিষ্ট করা। এটি আপনাকে +overঅ্যান্টিমারিডিয়ান মোড়কে অক্ষম করে এমন সুইচটি ব্যবহার করতে দেয় :

gdalwarp -t_srs \
    "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0 \
        +over +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null \
        +wktext +lon_wrap=-180 +no_defs" \
    S16W180.hgt test.tif

আমি যখন এটি করি এবং তারপরে gdalinfoফলাফলটি করি তখন আমি এটি পাই:

Corner Coordinates:
Upper Left  (-20037554.726,-1689152.120) (179d59'58.50"E, 14d59'58.50"S)
Lower Left  (-20037554.726,-1804766.925) (179d59'58.50"E, 16d 0' 1.37"S)
Upper Right (-19926099.407,-1689152.120) (178d59'57.11"W, 14d59'58.50"S)
Lower Right (-19926099.407,-1804766.925) (178d59'57.11"W, 16d 0' 1.37"S)
Center      (-19981827.066,-1746959.523) (179d29'59.30"W, 15d30' 2.12"S)

+overএর মূল আউটপুটটি দেখে আমি প্রজ স্ট্রিংটি (ছাড়াই ) পেয়েছি gdalinfo। এটি EXTENSION[...]সমন্বিত সিস্টেমের একটি ব্লকের অন্তর্ভুক্ত ছিল ।


1

এটি দুটি ধাপে কাজ করে:

gdalwarp -te -180 -16 -179 -15 s16W180.hgt test.tif
gdalwarp -t_srs "epsg:3857" test.tif out.tif

প্রথম কমান্ডটি 180 ° মেরিডিয়ান এর ভুল দিকে অতিরিক্ত অর্ধ পিক্সেলটি কিক করে। আপনি একটি আউটপুট ফাইল পাবেন যা 1178P x 1222L।

বিকল্পভাবে, gdal_translate সহ:

gdal_translate -a_ullr -180 -15 -179 -16 S16W180.hgt test2.tif
gdalwarp -t_srs "epsg:3857" test2.tif out2.tif

1179P x 1223L এর একটি আউটপুট ফাইল তৈরি করা হচ্ছে।


1

আমি একই সমস্যার মুখোমুখি হওয়ায়, আমি একটি ছোট শেল স্ক্রিপ্ট লিখেছিলাম যা রাস্টার ফাইলটি ডেটলাইনটি অতিক্রম করে কিনা তা খুঁজে বের করে। যদি সত্য হয় তবে নিম্নলিখিত বিকল্পটি gdalwarp এ যুক্ত করা হবে:

--config CENTER_LONG 180

স্ক্রিপ্টটি এভাবে ধাপে ধাপে কাজ করে:

  1. Gdalinfo থেকে WGS84 এক্সেটেন্টস পান
  2. মূল সিআরএসের তুলনায় যদি রূপান্তরিত অ্যালেক্স এবং এলআরএক্স এলএলএক্স এবং ইউআরএক্স মানগুলি উল্টানো হয় তবে রূপান্তরিত রাস্টার ডেটলাইনটি অতিক্রম করবে।
  3. ডেটলাইনটি অতিক্রম করা হলে, --config CENTER_LONG 180 কে gdalwarp এ যুক্ত করা হবে।

স্ক্রিপ্টটির সর্বোত্তম সংস্করণ আপডেট করুন , GDAL 2.0+ এবং পাইথন প্রয়োজন: নীচের পুরানো সংস্করণ।

#!/bin/bash
#
# Small Script to check if input raster will
# cross dateline when converting to EPSG:4326
# 
# USAGE: ./crosses_dateline.sh infile [outfile]
# 
# if no outfile is given, the script returns "true" or "false"
# if an outfile is given, gdalwarp is executed
# 
# Needs gdal 2.0+ and Python
# 


if [ -z "${1}" ]; then
    echo -e "Error: No input rasterfile given.\n> USAGE: ./crosses_dateline.sh infile [outfile]"
    exit
fi

# Get information, save it to variable as we need it several times
gdalinfo=$(gdalinfo "${1}" -json)

# If -json switch is not available exit!
if [ ! -z $(echo $gdalinfo | grep "^Usage:") ]; then
    echo -e "Error: GDAL command failed, Version 2.0+ is needed"
    exit
fi

function jsonq {
    echo "${1}" | python -c "import json,sys; jdata = sys.stdin.read(); data = json.loads(jdata); print(data${2});"
}

ulx=$(jsonq "$gdalinfo" "['wgs84Extent']['coordinates'][0][0][0]")
llx=$(jsonq "$gdalinfo" "['wgs84Extent']['coordinates'][0][1][0]")
lrx=$(jsonq "$gdalinfo" "['wgs84Extent']['coordinates'][0][3][0]")
urx=$(jsonq "$gdalinfo" "['wgs84Extent']['coordinates'][0][2][0]")

crossing_dateline=false
test $(echo "${ulx}>${lrx}" | bc) -eq 1 && crossing_dateline=true
test $(echo "${llx}>${urx}" | bc) -eq 1 && crossing_dateline=true

if [ -z "$2" ]; then
    echo "${crossing_dateline}"
elif [ "${crossing_dateline}" == "true" ]; then
    gdalwarp -t_srs "EPSG:4326" --config CENTER_LONG 180 "${1}" "${2}"
else
    gdalwarp -t_srs "EPSG:4326" "${1}" "${2}"
fi

#!/bin/bash
#
# Check if input raster crosses dateline when converting to EPSG:4326
# 
# if no outfile is given, the script returns "true" or "false"
# if an outfile is given, gdalwarp is executed
# 

if [ -z "${1}" ]; then
    echo -e "Error: No input rasterfile given.\n> USAGE: ./crosses_dateline.sh infile [outfile]"
    exit
fi

# Get information, save it to variable as we need it several times
gdalinfo=$(gdalinfo "${1}")
# Read Source CRS
s_srs="EPSG:"$(echo "${gdalinfo}" | grep -Eo "^\s{4}AUTHORITY\[.*\]" | grep -Eo "[0-9]+")

# Transform corners to Target SRS and test if crossing dateline
t_srs="EPSG:4326"
crossing_dateline=false

if [ "${s_srs}" == "${t_srs}" ]; then
    xmin=$(echo "${gdalinfo}" | grep "Upper Left" | grep -Eo "[-0-9\.]+, +[-0-9\.]+" | grep -Eo "^[-0-9\.]*")
    xmax=$(echo "${gdalinfo}" | grep "Lower Right" | grep -Eo "[-0-9\.]+, +[-0-9\.]+" | grep -Eo "^[-0-9\.]*")
    test $(echo "(${xmax}-(${xmin})) / 1" | bc) -gt 180 && crossing_dateline=true
else
    # We need to check both diagonal lines for intersection with the dateline
    xmin=$(echo "${gdalinfo}" | grep "Upper Left" | grep -Eo "[-0-9\.]+, +[-0-9\.]+" | gdaltransform -s_srs "${s_srs}" -t_srs "${t_srs}" -output_xy | grep -Eo "^[-0-9\.]*")
    xmax=$(echo "${gdalinfo}" | grep "Lower Right" | grep -Eo "[-0-9\.]+, +[-0-9\.]+" | gdaltransform -s_srs "${s_srs}" -t_srs "${t_srs}" -output_xy | grep -Eo "^[-0-9\.]*")
    test $(echo "${xmin}>${xmax}" | bc) -eq 1 && crossing_dateline=true

    xmin=$(echo "${gdalinfo}" | grep "Lower Left" | grep -Eo "[-0-9\.]+, +[-0-9\.]+" | gdaltransform -s_srs "${s_srs}" -t_srs "${t_srs}" -output_xy | grep -Eo "^[-0-9\.]*")
    xmax=$(echo "${gdalinfo}" | grep "Upper Right" | grep -Eo "[-0-9\.]+, +[-0-9\.]+" | gdaltransform -s_srs "${s_srs}" -t_srs "${t_srs}" -output_xy | grep -Eo "^[-0-9\.]*")
    test $(echo "${xmin}>${xmax}" | bc) -eq 1 && crossing_dateline=true
fi


if [ -z "$2" ]; then
    echo "${crossing_dateline}"
elif [ "${crossing_dateline}" == "true" ]; then
    gdalwarp -t_srs "${t_srs}" --config CENTER_LONG 180 "${1}" "${2}"
else
    gdalwarp -t_srs "${t_srs}" "${1}" "${2}"
fi

-1

জিডিএল লাইব্রেরিতে এটি সমস্যা। এটি প্রদর্শিত হয় যে GDALSuggestedWarpOutput () আউটপুট ফাইলের প্রস্থ এবং উচ্চতার জন্য অদ্ভুত আউটপুট দিচ্ছে।

আমি এখনও এটিকে ঘিরে কাজ করার কোনও উপায় খুঁজে পাইনি।

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