डेटालाइन के पास विश्व-फैले आउटपुट बनाने वाले गालवडप को कैसे रोकें?


11

मैं डेटलाइन के पास SRTM टाइल्स में हेरफेर करने के लिए gdalwarp का उपयोग कर रहा हूं (यानी 180 °, उर्फ ​​एंटीमारिडियन)। SRTM टाइल्स में बहुत मामूली (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 -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)

क्या यह गदलवारप में एक बग है? यदि नहीं, तो समझदार आउटपुट प्राप्त करने के लिए गालवडप पास करने के लिए सही विकल्प क्या हैं?


यदि आप प्रयोग करना चाहते हैं तो dds.cr.usgs.gov/srtm/version2_1/SRTM3/Australia/S16W180.hgt.zip
गुरुत्वाकर्षण

जोड़ने 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 तर्क का उपयोग, या a_ullr साथ gdal_translate का उपयोग कर पहले विस्तार अप को ठीक मौजूदा अधिलेखित, या -projwin को थोड़ा तुम सीमा के भीतर चाहते बाहर कटौती करने के लिए
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मूल उत्पादन को देखने से (बिना ) PROJ स्ट्रिंग मिला 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. निःशुल्क GGSinfo से WGS84 एक्सटेंशन प्राप्त करें
  2. यदि मूल CRS की तुलना में रूपांतरित ulx और lrx या llx और urx मान फ़्लिप किए जाते हैं, तो परिवर्तित रेखापुंज डेटलाइन को पार कर जाएगा।
  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

GDAL लाइब्रेरी में यह समस्या है। ऐसा प्रतीत होता है कि GDALSuggestedWarpOutput () आउटपुट फ़ाइल की चौड़ाई और ऊंचाई के लिए अजीब आउटपुट दे रहा है।

मुझे इसके आसपास काम करने का कोई तरीका नहीं मिला है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.