Сохранение карты в TIF-файле

Предложения и пожелания по дальнейшему развитию ГИС Аксиома
Аватара пользователя
bgnik
Пользователь
Сообщения: 79
Зарегистрирован: 25 окт 2021, 08:40

Re: Сохранение карты в TIF-файле

Сообщение bgnik » 24 апр 2024, 10:26

Опять торможу... В функцию save_image_to_mono_geotiff мне нужно передать Qg.QImage, а у меня подготовленный Image из модуля PIL. Как выполнить преобразование? Как мне в этом поможет np.asarray? Ну получаю я np.array, а нужен QByteArray. Дальше у меня ступор...
Аватара пользователя
Александр
Администратор
Сообщения: 621
Зарегистрирован: 18 апр 2019, 11:21

Re: Сохранение карты в TIF-файле

Сообщение Александр » 24 апр 2024, 14:24

Ниже пример.

Code: Select all

from pathlib import Path

from PIL import Image
import numpy as np
from osgeo import gdal


def save_pil_image_to_mono_geotiff(img: Image, filename: Path, dpi: float) -> None:
driver: gdal.Driver = gdal.GetDriverByName("GTiff")

np_data = np.asarray(img)
np_data = 1 - np.min(np_data, 2) // 255
try:
ds: gdal.Dataset = driver.Create(
str(filename),
np_data.shape[1],
np_data.shape[0],
1,
gdal.GDT_Byte,
options=['COMPRESS=CCITTFAX4', 'NBITS=1', 'PHOTOMETRIC=MINISWHITE']
)
ds.SetMetadata({'TIFFTAG_XRESOLUTION': dpi, 'TIFFTAG_YRESOLUTION': dpi})

ds.WriteArray(np_data)
ds.FlushCache()
finally:
ds = None # noqa


# Пример использования.
img = Image.open(r"c:\tmp\img.tif")
save_pil_image_to_mono_geotiff(img, Path(r'c:\tmp\img1.tif'), 96)
print("Completed.")
Вложения
img.tif
было
(186.39 КБ) 996 скачиваний
img1.tif
стало
(15.63 КБ) 884 скачивания
Аватара пользователя
bgnik
Пользователь
Сообщения: 79
Зарегистрирован: 25 окт 2021, 08:40

Re: Сохранение карты в TIF-файле

Сообщение bgnik » 25 апр 2024, 15:15

Пришлось несколько изменить код, поскольку функция не работает с монохромным растром (а это именно мой случай).
Вот мой вариант:

Код: Выделить всё

def save_pil_image_to_mono_geotiff(img: Image, filename: Path, dpi: float) -> None:
    driver: gdal.Driver = gdal.GetDriverByName("GTiff")

    np_data = np.asarray(img)
    np_data =(np_data==0).astype("int8")
    try:
        ds: gdal.Dataset = driver.Create(
                str(filename),
                np_data.shape[1], #width
                np_data.shape[0], #height
                1,
                gdal.GDT_Byte,
                options=['COMPRESS=CCITTFAX4', 'NBITS=1', 'PHOTOMETRIC=MINISWHITE']
        )
        ds.SetMetadata({'TIFFTAG_XRESOLUTION': dpi, 'TIFFTAG_YRESOLUTION': dpi})

        ds.WriteArray(np_data)
        ds.FlushCache()
    finally:
        ds = None # noqa
Теперь все ОК.
Вот, что интересно: мне потребовалось для получения исходного изображения использовать PIL, т.к. нужно было наложить друг на друга два растра с использованием маски. А можно ли проделать это при помощи Numpy? Подозреваю, что выполнялось бы быстрее, да и не было бы необходимости использовать внешнюю библиотеку. Вот, только разобраться с обработкой массивов сложнее, мозги съезжают. :o
Аватара пользователя
bgnik
Пользователь
Сообщения: 79
Зарегистрирован: 25 окт 2021, 08:40

Re: Сохранение карты в TIF-файле

Сообщение bgnik » 03 фев 2025, 09:02

Здравствуйте! Работавший в Аксиоме 5.2 описанный выше модуль в Аксиоме 6.1 стал выдавать сообщение:

C:\Program Files\Axioma v6\bin\python\Lib\site-packages\osgeo\gdal.py:312: FutureWarning: Neither gdal.UseExceptions() nor gdal.DontUseExceptions() has been explicitly called. In GDAL 4.0, exceptions will be enabled by default.
warnings.warn(

Посоветуйте, пожалуйста, что сделать?
Аватара пользователя
Александр
Администратор
Сообщения: 621
Зарегистрирован: 18 апр 2019, 11:21

Re: Сохранение карты в TIF-файле

Сообщение Александр » 03 фев 2025, 10:45

Это предупреждение связано с изменением в GDAL 4.0: исключения будут включены по умолчанию. Чтобы избежать проблем:

1. Включить исключения (рекомендуется для совместимости):

Code: Select all

from osgeo import gdal
gdal.UseExceptions()
2. Отключить исключения (если нужно текущее поведение):

Code: Select all

from osgeo import gdal
gdal.DontUseExceptions()
Выберите подходящий вариант, чтобы код работал корректно после обновления GDAL.
Аватара пользователя
bgnik
Пользователь
Сообщения: 79
Зарегистрирован: 25 окт 2021, 08:40

Re: Сохранение карты в TIF-файле

Сообщение bgnik » 04 фев 2025, 06:14

Получилось, спасибо!
Ответить