Định dạng dữ liệu
Tôi sẽ xem nó như một bài tập nhỏ trong cách lập trình trình đọc dữ liệu. Có một cái nhìn vào các tài liệu :
Dữ liệu SRTM được phân phối theo hai cấp độ: SRTM1 (đối với Hoa Kỳ và các lãnh thổ và sở hữu của nó) với dữ liệu được lấy mẫu ở các khoảng thời gian một giây cung theo vĩ độ và kinh độ và SRTM3 (đối với thế giới) được lấy mẫu ở ba giây.
Dữ liệu được chia thành từng ô một độ vĩ độ và kinh độ trong phép chiếu "địa lý", nghĩa là một bản trình bày raster với các khoảng vĩ độ và kinh độ bằng nhau không có phép chiếu nào cả nhưng dễ thao tác và khảm.
Tên tệp đề cập đến vĩ độ và kinh độ của góc dưới bên trái của ô - ví dụ: N37W105 có góc dưới bên trái của nó ở 37 độ vĩ bắc và 105 độ kinh tây. Nói chính xác hơn, các tọa độ này đề cập đến trung tâm hình học của pixel phía dưới bên trái, trong trường hợp dữ liệu SRTM3 sẽ có phạm vi khoảng 90 mét.
Các tệp chiều cao có phần mở rộng .HGT và được ký hai số nguyên byte. Các byte theo thứ tự "big endian" của Motorola với byte đáng kể đầu tiên, có thể đọc trực tiếp bởi các hệ thống như Sun SPARC, Đồ họa Silicon và máy tính Macintosh sử dụng bộ xử lý Power PC. DEC Alpha, hầu hết các máy tính PC và Macintosh được xây dựng sau năm 2006 đều sử dụng thứ tự Intel ("little endian") để có thể cần một số hoán đổi byte. Độ cao được tính bằng mét được tham chiếu đến Geoid WGS84 / EGM96. Khoảng trống dữ liệu được gán giá trị -32768.
Làm thế nào để tiến hành
Đối với vị trí của bạn, 50 ° 24'58.888 "N 14 ° 55'11.377" E, bạn đã tìm thấy ô chính xác, N50E14.hgt. Hãy tìm hiểu xem pixel nào bạn quan tâm. Vĩ độ đầu tiên, 50 ° 24'58.888 "N:
24'58.888" = (24 * 60)" + 58.888" = 1498.888"
giây cung. Chia cho ba và làm tròn đến số nguyên gần nhất cho một hàng lưới 500. Tính toán tương tự cho kết quả kinh độ trong cột lưới 1104.
Tài liệu khởi động nhanh thiếu thông tin về cách tổ chức các hàng và cột trong tệp, nhưng trong tài liệu đầy đủ có ghi rằng
Dữ liệu được lưu trữ theo thứ tự chính hàng (tất cả dữ liệu cho hàng 1, tiếp theo là tất cả dữ liệu cho hàng 2, v.v.)
Hàng đầu tiên trong tệp rất có thể là hàng cực bắc, tức là nếu chúng ta quan tâm đến hàng 500 từ cạnh dưới , chúng ta thực sự phải xem hàng
1201 - 500 = 701
từ đầu nếu tập tin . Ô lưới của chúng tôi là số
(1201 * 700) + 1104 = 841804
từ đầu tệp (tức là bỏ qua 700 hàng và trong lần thứ 701, hãy lấy mẫu 1104). Hai byte cho mỗi mẫu có nghĩa là chúng ta phải bỏ qua 1683606 byte đầu tiên trong tệp và sau đó đọc hai byte để có được ô lưới của chúng ta. Dữ liệu là cuối lớn, có nghĩa là bạn cần trao đổi hai byte trên các nền tảng của Intel.
Chương trình mẫu
Một chương trình Python đơn giản để lấy đúng dữ liệu sẽ trông như thế này (xem các tài liệu để sử dụng mô-đun 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)
Lưu ý rằng việc truy xuất dữ liệu hiệu quả sẽ phải trông phức tạp hơn một chút (ví dụ: không mở tệp cho từng mẫu).
Lựa chọn thay thế
Bạn cũng có thể sử dụng một chương trình có thể đọc các tệp .hgt ra khỏi hộp. Nhưng đó là nhàm chán.
.hgt
định dạng tệp trong tài liệu SRTM , nhưng câu trả lời từng bước cụ thể tùy thuộc vào phần mềm bạn có sẵn.