从地理TIFF图像中计算纬度和经度

我们希望从地理TIFF图像中提取信息来计算每个块的平均纬度和平均经度。已知的数据仅为图像本身,图像可以从以下地址下载:
http://eoimages.gsfc.nasa.gov/images/imagerecords/57000/57752/land_shallow_topo_2048.tif
在这里插入图片描述

我们可以使用以下Python代码打开该图像:

import gdal
geotiff = gdal.Open('land_shallow_topo_2048.tif')
colum_numbers, row_numbers, band_numbers = geotiff.RasterXSize, geotiff.RasterYSize, geotiff.RasterCount
print(colum_numbers, row_numbers, band_numbers)

程序输出结果为:

2048 1024 3

2、解决方案

为了从地理TIFF图像中计算纬度和经度,我们可以按照以下步骤操作:

  1. 首先,我们需要获取图像的地理变换信息。这可以使用以下代码完成:
gt = geotiff.GetGeoTransform()
  1. 使用地理变换信息,我们可以计算出图像的最小经度值(minx)、最大经度值(maxx)、最小纬度值(miny)和最大纬度值(maxy)。计算公式如下:
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5] 
maxx = gt[0] + width*gt[1] + height*gt[2]
maxy = gt[3]
  1. 接下来的我们要计算像素的大小,使用以下公式:
latPxSz = (maxy - miny) / row_numbers
lonPxSz = (maxx - minx) / column_numbers
  1. 接下来,我们需要确定我们要划分的块的大小,这里假设块的大小是50 x 50像素。每个块的中心经纬度坐标可以通过以下公式计算得到:
boxCenterLat = (i + 0.5) * 50 * latPxSz + miny
boxCenterLon = (j + 0.5) * 50 * lonPxSz + minx

其中,i和j分别是块在行和列上的索引。

  1. 最后,我们可以将块的中心经纬度坐标和图像数据结合起来生成一个数据表,然后从表中计算每个块的平均纬度和平均经度。

以下是一个Python代码示例:

import gdal
import numpy as np

# 打开地理TIFF图像
geotiff = gdal.Open('land_shallow_topo_2048.tif')

# 获取图像的地理变换信息
gt = geotiff.GetGeoTransform()

# 计算图像的最小经度值、最大经度值、最小纬度值和最大纬度值
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5] 
maxx = gt[0] + width*gt[1] + height*gt[2]
maxy = gt[3]

# 计算像素的大小
latPxSz = (maxy - miny) / row_numbers
lonPxSz = (maxx - minx) / column_numbers

# 确定要划分的块的大小
block_size = 50

# 计算块的中心经纬度坐标并保存到列表中
block_centers = []
for i in range(row_numbers // block_size):
    for j in range(column_numbers // block_size):
        boxCenterLat = (i + 0.5) * block_size * latPxSz + miny
        boxCenterLon = (j + 0.5) * block_size * lonPxSz + minx
        block_centers.append([boxCenterLat, boxCenterLon])

# 从图像中提取块的数据并保存到列表中
block_data = []
for center in block_centers:
    lat, lon = center
    # 计算块的行列号
    row_start = int((lat - miny) / latPxSz)
    row_end = row_start + block_size
    col_start = int((lon - minx) / lonPxSz)
    col_end = col_start + block_size
    # 提取块的数据
    block = geotiff.ReadAsArray(col_start, row_start, block_size, block_size)
    block_data.append(block)

# 计算每个块的平均纬度和平均经度并保存到列表中
mean_lat_lons = []
for block in block_data:
    mean_lat = np.mean(block[:, :, 0])
    mean_lon = np.mean(block[:, :, 1])
    mean_lat_lons.append([mean_lat, mean_lon])

# 打印每个块的平均纬度和平均经度
for mean_lat_lon in mean_lat_lons:
    print(mean_lat_lon)
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值