5 votos

Cómo hacer un mosaico de imágenes con diferentes CRS con rasterio

Estoy haciendo un mosaico de 14 imágenes rasterizadas (formato .img) para cubrir completamente una provincia. image ). La operación de mosqueo se ha completado, pero 4 baldosas se han mosqueado en una ubicación espacial incorrecta, mientras que las otras 10 baldosas se han mosqueado con precisión ( see image ). Cuando abro archivos separados, todos los archivos se abren en su ubicación espacial original. Estoy utilizando este código para el mosaico de 14 imágenes rasterizadas.

import rasterio
from rasterio.merge import merge
from rasterio.plot import show
import glob
import os

dirpath = r"path"
outpath = r"outpath\Mosiac.tif"

search_criteria = "*.img"

q = os.path.join(dirpath, search_criteria)
print (q)
img_fps = glob.glob(q)
img_fps

src_files_to_mosiac = []

for sim in img_fps:
src = rasterio.open(sim)
src_files_to_mosiac.append(src)

src_files_to_mosiac

mos, out_trans = merge(src_files_to_mosiac)

show(mos, cmap='terrain')

with rasterio.open(outpath,"w", driver ='Gtiff',count=3,
            height= mos.shape[1],
            width= mos.shape[2],
            transform= out_trans,
            crs= src.crs,
            dtype= src.dtypes[0]) as dest:
dest.write(mos)

4voto

JArrington1 Puntos 16

Tengo una solución. Convertir todos los archivos en lat long wgs84 CRS. Usando el código dado abajo-

import numpy as np
import rasterio
from rasterio.warp import calculate_default_transform, reproject, Resampling

dst_crs = 'EPSG:4326'

with rasterio.open('path/test.tif') as src:
    transform, width, height = calculate_default_transform(
        src.crs, dst_crs, src.width, src.height, *src.bounds)
    kwargs = src.meta.copy()
    kwargs.update({
        'crs': dst_crs,
        'transform': transform,
        'width': width,
        'height': height
    })

    with rasterio.open('path/test_wgs84.tif', 'w', **kwargs) as dst:
        for i in range(1, src.count + 1):
            reproject(
                source=rasterio.band(src, i),
                destination=rasterio.band(dst, i),
                src_transform=src.transform,
                src_crs=src.crs,
                dst_transform=transform,
                dst_crs=dst_crs,
                resampling=Resampling.nearest)

Esto eliminó la barrera de las diferentes zonas UTM y luego usando el código dado en mi pregunta, se generó la imagen de mosaico. En realidad, este es un enfoque bastante obvio, pero yo estaba tratando de realizar de una manera automatizada. Convirtiendo el código mencionado anteriormente en una función, aplicando la función en todas las imágenes a través de un bucle y consiguiendo el éxito.

Gracias a todos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X