Сохранение карты в TIF-файле
Re: Сохранение карты в TIF-файле
Опять торможу... В функцию save_image_to_mono_geotiff мне нужно передать Qg.QImage, а у меня подготовленный Image из модуля PIL. Как выполнить преобразование? Как мне в этом поможет np.asarray? Ну получаю я np.array, а нужен QByteArray. Дальше у меня ступор...
Re: Сохранение карты в TIF-файле
Ниже пример.
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.")
Re: Сохранение карты в TIF-файле
Пришлось несколько изменить код, поскольку функция не работает с монохромным растром (а это именно мой случай).
Вот мой вариант:
Теперь все ОК.
Вот, что интересно: мне потребовалось для получения исходного изображения использовать PIL, т.к. нужно было наложить друг на друга два растра с использованием маски. А можно ли проделать это при помощи Numpy? Подозреваю, что выполнялось бы быстрее, да и не было бы необходимости использовать внешнюю библиотеку. Вот, только разобраться с обработкой массивов сложнее, мозги съезжают.
Вот мой вариант:
Код: Выделить всё
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? Подозреваю, что выполнялось бы быстрее, да и не было бы необходимости использовать внешнюю библиотеку. Вот, только разобраться с обработкой массивов сложнее, мозги съезжают.

Re: Сохранение карты в TIF-файле
Здравствуйте! Работавший в Аксиоме 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(
Посоветуйте, пожалуйста, что сделать?
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(
Посоветуйте, пожалуйста, что сделать?
Re: Сохранение карты в TIF-файле
Это предупреждение связано с изменением в GDAL 4.0: исключения будут включены по умолчанию. Чтобы избежать проблем:
1. Включить исключения (рекомендуется для совместимости):
2. Отключить исключения (если нужно текущее поведение):
Выберите подходящий вариант, чтобы код работал корректно после обновления GDAL.
1. Включить исключения (рекомендуется для совместимости):
Code: Select all
from osgeo import gdal
gdal.UseExceptions()
Code: Select all
from osgeo import gdal
gdal.DontUseExceptions()
Re: Сохранение карты в TIF-файле
Получилось, спасибо!