SRTM3 데이터 파일의 고도에 대한지도에서 특정 긴 / lat 위치를 지정하고 싶지만 특정 값을 찾는 방법을 모릅니다. 그래서 N50E14.hgt에서 50 ° 24'58.888 "N, 14 ° 55'11.377"E까지 어떻게 찾을 수 있는지 몇 가지 예를 원합니다.
SRTM3 데이터 파일의 고도에 대한지도에서 특정 긴 / lat 위치를 지정하고 싶지만 특정 값을 찾는 방법을 모릅니다. 그래서 N50E14.hgt에서 50 ° 24'58.888 "N, 14 ° 55'11.377"E까지 어떻게 찾을 수 있는지 몇 가지 예를 원합니다.
답변:
데이터 리더를 프로그래밍하는 방법에 대해 약간의 연습으로 다루겠습니다. 설명서를 살펴보십시오 .
SRTM 데이터는 위도와 경도로 1 초 간격으로 샘플링 된 SRTM1 (미국 및 해당 지역 및 소유의 경우)과 3 초로 샘플링 된 SRTM3 (세계 용)의 두 가지 수준으로 배포됩니다.
데이터는 "지리적"투영법에서 1도 위도 및 경도 타일로 나뉩니다. 즉, 조작 및 모자이크가 쉽지만 투영없이 동일한 위도 및 경도 간격으로 래스터 프리젠 테이션을 말합니다.
파일 이름은 타일 왼쪽 하단의 위도와 경도를 나타냅니다. 예를 들어 N37W105의 왼쪽 위도는 북쪽 위도 37도, 서쪽 경도 105 도입니다. 보다 정확하게 말하면,이 좌표는 왼쪽 아래 픽셀의 기하학적 중심을 나타내며, SRTM3 데이터의 경우 약 90 미터 정도입니다.
높이 파일의 확장자는 .HGT이며 2 바이트 정수로 서명됩니다. 바이트는 Motorola "big-endian"순서이며 가장 중요한 바이트부터 먼저 Power SPARC 프로세서를 사용하는 Sun SPARC, Silicon Graphics 및 Macintosh 컴퓨터와 같은 시스템에서 직접 읽을 수 있습니다. DEC Alpha, 2006 년 이후에 구축 된 대부분의 PC 및 Macintosh 컴퓨터는 Intel ( "little-endian") 순서를 사용하므로 일부 바이트 스왑이 필요할 수 있습니다. 높이는 WGS84 / EGM96 지오이드를 기준으로 미터 단위입니다. 데이터 보이드에는 값 -32768이 할당됩니다.
현재 위치 50 ° 24'58.888 "N 14 ° 55'11.377"E, 올바른 타일 N50E14.hgt를 이미 찾았습니다. 관심있는 픽셀을 찾으십시오. 첫 번째 위도, 50 ° 24'58.888 "N :
24'58.888" = (24 * 60)" + 58.888" = 1498.888"
아크 초. 3으로 나누고 가장 가까운 정수로 반올림하면 그리드 행이 500이됩니다. 경도에 대한 동일한 계산으로 그리드 열 1104가됩니다.
빠른 시작 설명서에는 파일에서 행과 열을 구성하는 방법에 대한 정보가 없지만 전체 설명서 에는 다음과 같이 명시되어 있습니다.
데이터는 행 주요 순서로 저장됩니다 (행 1에 대한 모든 데이터 다음에 행 2에 대한 모든 데이터 등).
파일의 첫 번째 행은 가장 북쪽에있을 가능성이 큽니다. 즉 , 하단 500 에서 행 500에 관심이 있다면 실제로 행을 봐야합니다
1201 - 500 = 701
파일의 경우 처음부터 . 그리드 셀은 숫자입니다
(1201 * 700) + 1104 = 841804
파일의 시작부터 (즉, 700 행을 건너 뛰고 701 일에 샘플 1104를 취함) 샘플 당 2 바이트는 파일에서 처음 1683606 바이트를 건너 뛰고 그리드 셀을 얻기 위해 2 바이트를 읽어야한다는 것을 의미합니다. 데이터는 빅 엔디안이므로 인텔 플랫폼과 같이 2 바이트를 교체해야합니다.
올바른 데이터를 검색하는 간단한 Python 프로그램은 다음과 같습니다 ( struct 모듈 사용에 대한 문서 참조 ).
import struct
def get_sample(filename, n, e):
i = 1201 - int(round(n / 3, 0))
j = int(round(e / 3, 0))
with open(filename, "rb") as f:
f.seek(((i - 1) * 1201 + (j - 1)) * 2) # go to the right spot,
buf = f.read(2) # read two bytes and convert them:
val = struct.unpack('>h', buf) # ">h" is a signed two byte integer
if not val == -32768: # the not-a-valid-sample value
return val
else:
return None
if __name__ == "__main__":
n = 24 * 60 + 58.888
e = 55 * 60 + 11.377
tile = "N50E14.hgt" # Or some magic to figure it out from position
print get_sample(tile, n, e)
효율적인 데이터 검색은 좀 더 정교 해 보일 것입니다 (예 : 각 샘플마다 파일을 열지 않음).
상자에서 .hgt 파일을 읽을 수있는 프로그램을 사용할 수도 있습니다. 그러나 그것은 지루하다.
GDAL은 SRTMHGT 드라이버를 사용하여 이러한 래스터 형식을 읽고 쓸 수 있습니다 . 즉, QGIS, ArcGIS로 래스터를 보거나 gdallocationinfo 와 같은 GDAL 유틸리티를 사용 하여 포인트에서 값을 가져올 수 있습니다.
DMS를 DD로 변환 :
그런 다음 쉘에서 다음을 사용하십시오 gdallocationinfo file.hgt -wgs84 long lat
.
$ gdallocationinfo N50E14.hgt -wgs84 14.9198269444 50.4163577778
Report:
Location: (1104P,700L)
Band 1:
Value: 216
고도는 216m입니다.
Chris의 대답은 QGIS의 레이어에서 점을 샘플링하는 것이 간단하다는 것을 나타냅니다.
그러나 내 의견에 대한 답변은 .hgt
파일 에서 표고 값을 읽기 위해 자신의 프로그램을 작성하고 있음을 분명히 나타내 므로 SRTM 문서 의 빠른 시작 PDF 를 다시 살펴보십시오 . 고도 데이터가 저장되는 방법을 설명합니다. 요약:
-32768
데이터가없는 픽셀을 나타내는의 를 나타냅니다.당신은 lon / lat 좌표와 픽셀 사이를 변환 할 수 있다고 말하므로, 표고를 얻는 것은 파일의 적절한 오프셋에서 정수 값을 읽는 것입니다. 픽셀 좌표 x
와 y
장면의 왼쪽 위 모서리를 기준으로하면 기본적으로 offset = (y * 1201) + x
입니다. 픽셀 0,0
은 파일에서 첫 번째 정수이고 픽셀 1200,1200
은 파일 에서 마지막 정수입니다.
.hgt
파일 형식에 대한 참고 사항이 있지만 구체적인 단계별 답변은 사용 가능한 소프트웨어에 따라 다릅니다.