.HGT 파일에서 고도를 추출 하시겠습니까?


20

SRTM3 데이터 파일의 고도에 대한지도에서 특정 긴 / lat 위치를 지정하고 싶지만 특정 값을 찾는 방법을 모릅니다. 그래서 N50E14.hgt에서 50 ° 24'58.888 "N, 14 ° 55'11.377"E까지 어떻게 찾을 수 있는지 몇 가지 예를 원합니다.


1
어떤 소프트웨어를 사용하고 있습니까? SRTM 문서.hgt파일 형식에 대한 참고 사항이 있지만 구체적인 단계별 답변은 사용 가능한 소프트웨어에 따라 다릅니다.
초에 anoved

1
나는 소프트웨어가 없다. 나는 C # 프로그래머이고 내 자신의 응용 프로그램을 작성하고있다. 모든 픽셀에 long / lat을 지정할 수 있으며 이제 각 지점까지의 고도를 검색하려고합니다. 최상의 데이터 형식은 CSV 파일과 같아야합니다. 한 행에서 경도, 위도, 고도를 찾을 수 있습니다. SRTM 설명서를 검색했지만 여전히 파일에서 데이터 마이닝을 제공하는 방법을 상상할 수 없습니다.
MartinS

답변:


30

데이터 형식

데이터 리더를 프로그래밍하는 방법에 대해 약간의 연습으로 다루겠습니다. 설명서를 살펴보십시오 .

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 파일을 읽을 수있는 프로그램을 사용할 수도 있습니다. 그러나 그것은 지루하다.


나에게 이길 수 있고, 더 자세하게 부팅 할 수 있습니다!
ovd

좋은 설명, 당신을 사랑합니다. 당신의 도움을 주셔서 감사합니다. 다들 다들
MartinS

1
+1 예. 행은 북쪽에서 남쪽으로 정렬됩니다. 파일 중 하나를 매핑하자마자 명확합니다. 또한 위치를 둘러싼 4 개의 셀 중심 사이에서 이중선 보간을 통해 높이를 얻는 것을 고려하십시오.
whuber

이 포괄적 인 정보에 감사드립니다! 한 가지 질문이 있습니다. 50 ° 24'58.888에 대한 고도 데이터를 찾을 때 행이 북쪽에서 남쪽으로 정렬 될 때 아래쪽 모서리에서 행 번호 500을 빼는 이유는 무엇입니까? 감사!
Georg

내가 실수하지 않으면, 나는 (j-1)이 단지 j 일 것이라고 믿는다. 값 j의 범위는 0에서 1200까지이므로 1을 뺄 필요가 없습니다.
Malipivo

6

GDAL은 SRTMHGT 드라이버를 사용하여 이러한 래스터 형식을 읽고 쓸 수 있습니다 . 즉, QGIS, ArcGIS로 래스터를 보거나 gdallocationinfo 와 같은 GDAL 유틸리티를 사용 하여 포인트에서 값을 가져올 수 있습니다.

DMS를 DD로 변환 :

  • 위도 : 50 ° 24'58.888 "N = 50 + (24/60) + (58.888 / 3600) = 50.4163577778
  • 긴 : 14 ° 55'11.377 "E = 14 + (55/60) + (11.377 / 3600) = 14.9198269444

그런 다음 쉘에서 다음을 사용하십시오 gdallocationinfo file.hgt -wgs84 long lat.

$ gdallocationinfo N50E14.hgt -wgs84 14.9198269444 50.4163577778
Report:
  Location: (1104P,700L)
  Band 1:
    Value: 216

고도는 216m입니다.


1
남쪽이나 서쪽의 위치는 어떻습니까?
Muhammet Ali Asan

2

QGIS를 사용하는 경우 Python 플러그인 "Point Sampling Tool"이 설치되어 있는지 확인하십시오. -> Enhancements (Python)-> Analyse에서 찾을 수 있습니다.

필요한 위치의 포인트 레이어를 선택한 다음 PST를 시작하고 hgt (또는 래스터 / 폴리곤 파일)를 선택한 다음 출력 할 새 포인트 모양을 선택하십시오.

그게 다야 :-)

  Chris

0

Chris의 대답은 QGIS의 레이어에서 점을 샘플링하는 것이 간단하다는 것을 나타냅니다.

그러나 내 의견에 대한 답변은 .hgt파일 에서 표고 값을 읽기 위해 자신의 프로그램을 작성하고 있음을 분명히 나타내 므로 SRTM 문서 의 빠른 시작 PDF 를 다시 살펴보십시오 . 고도 데이터가 저장되는 방법을 설명합니다. 요약:

  • SRTM3 파일에는 일련의 빅 엔디안 정수 값이 포함됩니다.
  • 각 정수 값은 "WGS84 / EGM96 지오이드를 참조하는 미터 단위의 고도"를 나타냅니다. -32768 데이터가없는 픽셀을 나타내는의 를 나타냅니다.
  • 1201 개 샘플의 1201 행이 있으므로 1442401 개의 정수 값이 있어야합니다.

당신은 lon / lat 좌표와 픽셀 사이를 변환 할 수 있다고 말하므로, 표고를 얻는 것은 파일의 적절한 오프셋에서 정수 값을 읽는 것입니다. 픽셀 좌표 xy장면의 왼쪽 위 모서리를 기준으로하면 기본적으로 offset = (y * 1201) + x입니다. 픽셀 0,0은 파일에서 첫 번째 정수이고 픽셀 1200,1200은 파일 에서 마지막 정수입니다.


1
이것은 정확하지만 좌표가 셀 중심 과 관련되어 있음을 포함하여 bhell의 답변에서 제공하는 몇 가지 중요한 세부 사항이 누락되었습니다 . 따라서 예를 들어 N50E014.hgt의 왼쪽 상단 모서리는 실제로 경도 13.99958 E, 위도 51.00042 N에 있습니다.
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.