Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227

Как создать GeoTiff

19.09.2025, 00:02. Показов 3344. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не знаю куда писать, пусть сюда.

Есть bmp файлы (карта) которую генерит прога, и известны географические координаты например 4-х углов,
как из этого создать файл GeoTiff наиболее простым способом и желательно встроить в программу на Buildere ?

Я так понимаю есть два способа :
1) использовать сторонние библиотеки (GDAL ? ) (как их прикрутить к проекту неясно )
2) вручную прописать все директории в файле Tiff (так и не нашел внятного описания где там что прописывать)

Может кто сталкивался покажет дорогу ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2025, 00:02
Ответы с готовыми решениями:

Создать файл GeoTiFF на C++
Добрый день! Может пишу не в той ветке, так что не судить строго. Но суть вопроса следующая: мне...

GeoTiff - примеры ее использования на языке c , желательно на русском языке
Добрый вечер. Дана курсовая с использованием библиотеки GeoTiff. Подскажите где можно прочитать про...

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите,...

47
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6323 / 3049 / 1054
Регистрация: 01.06.2021
Сообщений: 11,656
21.09.2025, 19:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от whale2 Посмотреть сообщение
использовать сторонние библиотеки (GDAL ? ) (как их прикрутить к проекту неясно )
если не получается или слишком сложно, то зачем вообще выбирать С++?

на python есть вот библиотека, которая работает с этим форматом без использования GDAL: https://pypi.org/project/geotiff/

Но однозначно советую использовать готовую библиотеку, а не писать свой велосипед. Формат сложный, можно много чего корявого написать.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
22.09.2025, 01:45  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
а не писать свой велосипед
Я уже написал практически, ничего там сложного нет во всяком случае в моем применении,
могу в рукопашную создать любой tif файл, даже с сжатием если надо,
а С++ просто исторически сложилось,
был асм, бейсик, ада, фортран и си, на этом решил остановиться.
Осталось добавить в директорию три поля с параметрами координат и все считай,
никаких сторонних библиотек, питонов и прочих ужасов.
Единственно посчитать угол поворота в данных и тип проекции но тут надо на другой форум спрашивать.

Добавлено через 5 часов 29 минут
Вот он, полностью рукопашный tiff файл !
Я почти уверен что ни у кого не получиться сделать не сжатое tiff серое изображение 256х256 точек в размере файла <=64,1Кб
Вложения
Тип файла: rar test.rar (64.2 Кб, 6 просмотров)
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
27.09.2025, 00:00  [ТС]
Процесс создания GeoTiff идет ,
вопрос как из
uint64_t hex (где лежит double)
вычленит все байты,
идеально занести их последовательно в массив byte D[] например,
те нужно double внести в массив побайтно да еще в обратной последовательности.
Сдвигать побайтно в цикле ?
Бошка с этого geotifa уже разбухла.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
27.09.2025, 06:41
Цитата Сообщение от whale2 Посмотреть сообщение
Бошка с этого geotifa уже разбухла.
Кто бы сомневался)

Цитата Сообщение от whale2 Посмотреть сообщение
Сдвигать побайтно в цикле ?
Можно и так.
Цитата Сообщение от whale2 Посмотреть сообщение
да еще в обратной последовательности
Обратное, не обратное, это всё такие условности.
Ну если знаешь порядок, где у тебя там начало и конец, то можешь и в обратном )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <iomanip>
#include <cstdint>
#include <cstring>
void memcpy_rev(char* dst, const char* src, size_t count){
   src += count;
   while(count--)
      *dst++ = *--src;
}
void print_hex(const char* src, size_t count){
   std::ios_base::fmtflags ff{std::cout.flags()};
   std::cout << std::hex << std::noshowbase ;
   while(count--)
      std::cout << std::setw(sizeof(char)*2) << std::setfill('0') << (int)((unsigned char)(*src++)) << ' ';
   std::cout << std::endl;
   std::cout.flags(ff);
}
int main(){
    std::uint64_t h = 0xFF112233445566FF;
    const unsigned size = sizeof(h);
    print_hex((char*)&h, size);
    
    using byte = unsigned char;
    byte a[16]{};
    
    //copy as is
    memcpy(&a, &h, size);
    print_hex((char*)&a, sizeof(a));       
    
    // copy backward
    memcpy_rev((char*)&a, (char*)&h, size);
    print_hex((char*)&a, sizeof(a));    
    
}
Добавлено через 1 час 39 минут
Цитата Сообщение от whale2 Посмотреть сообщение
те нужно double внести в массив побайтно
Можно сразу double:
C++
1
2
3
    double h{}; // double
    uint64_t p = 0xFF112233445566FF; // для теста
    memcpy(&h, &p, sizeof(double));  // заполняем double данными из p
1
3138 / 1739 / 274
Регистрация: 19.02.2010
Сообщений: 4,537
27.09.2025, 11:33
Цитата Сообщение от whale2 Посмотреть сообщение
вопрос как из
uint64_t hex (где лежит double)
вычленит все байты,
идеально занести их последовательно в массив byte D[] например
Никак не надо вычленять и куда-то заносить.
Надо просто все нужные типы держать в одном месте друг поверх друга.
Используй Силу, Люк объединения (union-типы).
C++
1
2
3
4
5
union {
    double dval;
    uint64_t hex;
    byte D[8];
}
1
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
28.09.2025, 19:22  [ТС]
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Используй Силу, Люк объединения (union-типы).
Гениально, сила работает !
А нельзя еще с помощью силы поменять местами байты в D[8] или только цикл спасет ?
Так чтобы сначала шел младший байт итд
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.09.2025, 19:58
Цитата Сообщение от whale2 Посмотреть сообщение
Так чтобы сначала шел младший байт итд
Так сначала и идут менее значащие байты, от младшего к старшему (LE-little endian).
Хоть бы запустил бы мой пример)

Добавлено через 3 минуты
Цитата Сообщение от whale2 Посмотреть сообщение
А нельзя еще с помощью силы поменять местами байты в D[8] или только цикл спасет ?
И на этот вопрос, нет, нельзя.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
28.09.2025, 20:27  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Хоть бы запустил бы мой пример)
Мне с объединением понравился больше )
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.09.2025, 20:33
В с++ 23 есть std::byteswap
Под окнами можна заюзать _swab.
Или ещё htons/htons/htonll + ntohs/ntohl/ntohll из winsock2.h

Добавлено через 38 секунд
Цитата Сообщение от whale2 Посмотреть сообщение
Мне с объединением понравился больше )
Я понимаю. Как хочешь. Ты просто увидел бы порядок байт. А то кажется что путаешься.

Добавлено через 1 минуту
Вот тебе ленивому : https://onlinegdb.com/gbbIDQVvz )
1
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
28.09.2025, 20:45  [ТС]
Короче сделал так все работает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static union {
    double      d;
    byte        Hex_data[8];
} Converter;
 
void ConverterH(double val)
{
 byte x;
 char i2=7;
 Converter.d = val;
 
 for(i=0;i< 4;i++)
 {
  x = Converter.Hex_data[i];
  Converter.Hex_data[i]= Converter.Hex_data[i2];
  Converter.Hex_data[i2]= x;
  i2--;
 
 } 
}

Точно напутал, не нужно переставлять байты ,они уже в нужном порядке

Вроде все прописал как надо а не хочет собака geotif принимать, понапридумываются всякой фигни а ты сиди разбирайся )
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
28.09.2025, 23:34  [ТС]
Едрена матрена, неужели что то получается, может кто нить проверить рукопашный файл geo ?
Серый растр 1600х3200 с координатами.
Global Mapper вроде его жрет.
Вложения
Тип файла: rar test.rar (2.9 Кб, 4 просмотров)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
29.09.2025, 01:37
Цитата Сообщение от whale2 Посмотреть сообщение
может кто нить проверить рукопашный файл geo ?
На что его проверять?
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
gdalinfo c:\tmp\tmp\test\test.tif
Driver: GTiff/GeoTIFF
Warning 1: PROJ: proj_create_from_database: Cannot find proj.db
Files: c:\tmp\tmp\test\test.tif
Size is 1600, 3200
GCP Projection =
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1,
                ID["EPSG",9001]]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433,
            ID["EPSG",9122]]],
    CS[ellipsoidal,2],
        AXIS["latitude",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433,
                ID["EPSG",9122]]],
        AXIS["longitude",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433,
                ID["EPSG",9122]]]]
Data axis to CRS axis mapping: 2,1
GCP[  0]: Id=1, Info=
          (0,0) -> (44.53521,48.66748,0)
GCP[  1]: Id=2, Info=
          (0,3200) -> (44.53387,48.6676,0)
GCP[  2]: Id=3, Info=
          (1600,3200) -> (44.53251,48.66497,0)
Metadata:
  TIFFTAG_XRESOLUTION=0.61543423
  TIFFTAG_YRESOLUTION=0.61543423
  TIFFTAG_RESOLUTIONUNIT=3 (pixels/cm)
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=BAND
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0, 3200.0)
Upper Right ( 1600.0,    0.0)
Lower Right ( 1600.0, 3200.0)
Center      (  800.0, 1600.0)
Band 1 Block=1600x5 Type=Byte, ColorInterp=Gray
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
29.09.2025, 10:34  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
На что его проверять?
Надо что то еще делать или уже в пойдет ?
По моему уже нормальный.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
29.09.2025, 21:17  [ТС]
Пошла руда
правда в Global mapper грузиться а в Google Earth нет.
Миниатюры
Как создать GeoTiff  
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
08.10.2025, 03:05  [ТС]
Возникла жопа с RGB tiff файлами, с обычными 8 битными норма, с RGB жопа, не хочет собака открываться,
вроде все по описанию делаю что раз проверил.
пытался создать tiff в адобе смотрел но там куча каких то ненужных файлов в описании они не нужны, так и не понял где тупик ,
может кто нить чего нить подскажет ?
Файл прилагаю (квадрат 100х100)
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
08.10.2025, 03:06  [ТС]
файл
Вложения
Тип файла: 7z 100x100.7z (275 байт, 4 просмотров)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.10.2025, 04:14
gdalinfo.exe
ERROR 1: 100x100.tiff: TIFFReadDirectory:IO error during reading of "BitsPerSample"
gdalinfo failed - unable to open 'c:\tmp\tmp\100x100.tiff'
Скачай пакет бинарников gdal и мордуй его.
А лучше готовую либу и юзай msvc.
https://www.gisinternals.com/release.php
GUI - это последнее дело.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
08.10.2025, 11:57  [ТС]
Я сделал точно такой же файл в адобе и потихоньку удаляю из него байты ручками и пытаюсь понять где собака зарыта,
пока однозначно неясно.
Все директории в нем такие же как у меня один в один кроме 4-х где описаны дата, кто создавал и тд короче текстовая инфа, по мануалу она не обязательна.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.10.2025, 12:11
whale2, похоже, что где то формат не выдержан и смещение поехало совсем.
И вот уже почти месяц ковыряешься...
Оно того стоит?
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
08.10.2025, 13:59  [ТС]
8 битные серые я освоил все работает, для красоты нужны цветные,
тут явно осталось немного, чувствую себя Мегрэ байт за байтом подбираясь к разгадке.

Добавлено через 1 час 30 минут
Ура !
Кажись получилось
В шапку надо вставить нигде не описанных и не подчиняющиеся мануалу блок байтов
(это директории описания даты, программы и прочего бреда, причем реальные данные размещать не обязательно, за ними еще загадочную строчку байт 08 00 08 00 08 00 )

Code
1
2
3
4
5
6
7
31 01 02 00 14 00 00 00 08 01 00 00 
32 01 02 00 14 00 00 00 1C 01 00 00 
BC 02 01 00 29 12 00 00 30 01 00 00 
49 86 01 00 C6 08 00 00 5A 13 00 00 
69 87 04 00 01 00 00 00 50 91 00 00 
00 00 00 00 
08 00 08 00 08 00
без них не работает, возможно у меня ревизия мануала tiff 98 года устарела ?
Короче осталось прикрутить сжатие хотя оно не сильно поможет.
Вот он цветной рукопашный tiff (15мб)
https://cloud.mail.ru/public/SHsH/5HmDHQbYQ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2025, 13:59

Как создать класс кот может создать general purpose counting objects
Как создать класс (CounterType) кот может создать general purpose counting objects. Этот объект...

Подскажите, нужно перегрузить оператор или создать метод(если создать то не понимаю как) записи в файл
вот как я хотел сделать запись в файл перегрузкой #pragma once #include &quot;iostream&quot; #include...

Создать класс vector3d, задаваемый тройкой координат. Создать конструктор. Перегрузить операции как методы класса:
Создать класс vector3d, задаваемый тройкой координат. Создать конструктор. Перегрузить операции как...

Создание кода программы с нуля!! создание кода C++
ВОТ УСЛОВИЕ : Для данного вещественного x,a,b,c найти значение следующей функции f,принимающей...

Создать программу, в которой можно создать папку
Всем привет, Подскажите плиз как можно осуществить такое: 1. Есть форма1. 2. В ней мы можем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru