날짜 표시 줄 근처에서 세계적 결과를 생성하는 gdalwarp를 중지하는 방법은 무엇입니까?


11

gdalwarp를 사용하여 날짜 표시 줄 근처에서 SRTM 타일을 조작하고 있습니다 (예 : 반 자오선). 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에 문제를 일으켜 거대한 지구 스패닝 출력을 생성합니다.

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

당신이 범위 내에서 원하는 비트 잘라 기존을 덮어 쓰거나 -projwin하는 어쩌면 "대상 범위"에 대한 -TE 인수를 사용하거나 a_ullr와 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의 원래 출력을보고 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

같은 문제에 직면했을 때 래스터 파일이 날짜 표시 줄을지나는지 확인하는 작은 셸 스크립트를 작성했습니다. true이면 gdalwarp에 다음 옵션이 추가됩니다.

--config CENTER_LONG 180

다음은 스크립트가 단계별로 작동하는 방법입니다.

  1. gdalinfo에서 WGS84 익스텐트 가져 오기
  2. IF로 변환 ULXLRX OR LLXURX 값은 원래 CRS 비교 뒤집, 래스터 변환은 데이트 라인을 통과한다.
  3. 날짜 표시 줄이 교차되면 --config CENTER_LONG 180gdalwarp 에 추가됩니다.

스크립트의 더 나은 버전을 업데이트 하려면 GDAL 2.0 이상 및 Python : 이전 버전이 필요합니다.

#!/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 ()이 출력 파일의 너비와 높이에 대해 이상한 출력을 제공하는 것으로 보입니다.

아직이 문제를 해결할 수있는 방법을 찾지 못했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.