На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Дмитрий Шабаков (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Дмитрий Шабаков
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 34 След.
Чтение информации из TIFF, Возможно ли узнать систему координат tiff файла?
 
И ещё, в функцию mapGetRstProjectionData в качестве второго параметра подаете номер растра в цепочке.
В вашем случае открытый растр имеет номер 1 в цепочке растров.
Чтение информации из TIFF, Возможно ли узнать систему координат tiff файла?
 
[QUOTE][URL=https://gisweb.ru/forum/user/21797/]Andrey Prohorov[/URL] написал:
Добрый день, благодарю за помощь, но в процессе возник вопрос: При использовании функции mapGetRstProjectionDataPro, ей необходимо передать адрес структуры, но в итоге выдается ошибка о несовместимости типов данных (Код отправлю ниже). Имеется ощущения что я делаю что то неправильно
[/QUOTE]

Для паскаля структура TMAPREGISTEREX описана в файле maptype.pas из состава GTK. И это описание :расходится с вашим.
c:\Program Files (x86)\Panorama\GisTool14_5_8_3\Common\maptype.pas:[CODE]TMAPREGISTEREX = packed record
  Length    : integer;      // Размер данной структуры  
  Name      : array[0..31] of AnsiChar;    // Имя района
  Scale,                     // Знаменатель масштаба
  EPSGCode,                  // Код EPSG системы координат    
  EllipsoideKind,            // Вид эллипсоида
  HeightSystem,              // Система высот
  MaterialProjection,        // Проекция исх. материала
  CoordinateSystem,          // Система координат
  PlaneUnit,                 // Единица измерения в плане
  HeightUnit,                // Единица измерения по высоте
  FrameKind,                 // Вид рамки
  MapType,                   // Обобщенный тип карты
  DeviceCapability,          // Разрешающая способность прибора
                                    // Обычно равна 20 000
                                    // Для карт повышенной точности:
                                    // -1 - максимальная точность
                                    // -2 - хранить координаты в сантиметрах
                                    // -3 - хранить координаты в миллиметрах
                                    // -7 - хранить координаты в радианах    
  DataProjection,            // Наличие данных о проекции (0/1)
  OrderViewSheetFlag,        // ZoneIdent; // Идентификатор района (для МСК 63: A-X или 0)      
  FlagRealPlace,             // Вид карты: 0:MAP (многолистовая с рамками),
                             // 1:SIT (безразмерный лист), 2:SITX (один файл), -1:SIT c рамкой, -2:SITX с рамкой
  ZoneNumber   : integer;    // Заполняется системой при запросе  
                             // формуляра - номер зоны топокарты в радианах
  FirstMainParallel,         // Первая главная параллель  StandardParallel1
  SecondMainParallel,        // Вторая главная параллель  StandardParallel2
  AxisMeridian,              // Осевой меридиан   (Долгота полюса проекции) CentralMeridian
  MainPointParallel,         // Параллель главной точки (Широта полюса проекции) LatitudeOfOrigin
  PoleLatitude,              // Широта полюса проекции  (Latitude of false origin, etc)
  PoleLongitude,             // Долгота полюса проекции (Longitude of false origin, etc)
  FalseEasting,              // Смещение координат по оси Y
  FalseNorthing,             // Смещение координат по оси X
  ScaleFactor,               // Масштабный коэффициент на осевом меридиане (1.0 +\- ...)
  TurnAngle:  double;        // Угол разворота осей для локальных систем (МСК)
  Reserv2 : array[0..3] of double; // Резерв = 0
 end;
  PMAPREGISTEREX = ^TMAPREGISTEREX;
[/CODE]
Чтение информации из TIFF, Возможно ли узнать систему координат tiff файла?
 
[QUOTE][URL=https://gisweb.ru/forum/user/21797/]Andrey Prohorov[/URL] написал:
День добрый, возможно ли узнать систему координат TIFF с помощью Gis ToolKit? И можно ли сделать это в консольном приложении?  [/QUOTE]
Добрый день!

Для консольного приложения применяем API-функции библиотек ядра GTK.
Алгоритм такой:
1. Открываем файл TIFF вызовом функции [CODE]mapOpenAnyDataPro (mapapi.h). [/CODE] На выходе получаем HMAP - идентификатор открытого документа.
2. Проверяем корректность открытия растра следующими функциями из rstapi.h:[CODE] mapIsOpenRst(HMAP hMap, int number);
  mapRstIsAccessTiff(HMAP hMap, long int number);[/CODE] В функции подаем идентификатор открытого документа HMAP, полученный в п.1.
  В качестве номера растра в цепочке number подаем 1.
3. Запрашиваем параметры проекции и системы координат вызовом функции [CODE]mapGetRstProjectionDataPro.[/CODE]4. Закрываем документ созданного растра вызовом функции [CODE]mapCloseData (mapapi.h)[/CODE]5. Удаляем с диска вспомогательные файлы *.taf, *.rsw
Алгоритм сжатия не поддерживается - LZW в picexLoadTiffToRstAndCompress
 
[CODE]babahplayer написал:
Вот вызов:

  HMESSAGE handle = 0;
  double * meterInPixelX = 0;
  double * meterInPixelY = 0;
  DOUBLEPOINT *point = 0;
  int compression = 0;
  long int flagMessage=0;
  long int flagWorkLog=1;
  QString nameTif = qApp->applicationDirPath() + QDir::separator() + "o350381.tif";
  QString nameRsw = qApp->applicationDirPath() + QDir::separator() + "o350381.rsw";

  picexInitGdal();
  int res = picexLoadGdalFileToRswUn(handle,
                                       0,
                                       nameTif.utf16(),
                                       nameRsw.utf16(),
                                       meterInPixelX,
                                       meterInPixelY,
                                       point,
                                       compression,
                                       flagMessage,
                                       flagWorkLog
                                       );
  if (res == 0) QMessageBox::critical(this, "Error", "The convertation ended with error");
  picexCloseGdal();
[/CODE]
В данном случае функция picexLoadGdalFileToRswUn не отрабатывает из-за некорректных входных параметров meterInPixelX и meterInPixelY.
[CODE]meterInElementX - размер в метрах элемента растра (пикселя) по X
meterInElementY - размер в метрах элемента растра (пикселя) по Y[/CODE]
Необходимо подать в функцию адреса заполненных параметров meterInPixelX и meterInPixelY.
Параметры meterInPixelX и meterInPixelY необходимо проинициализировать корректным значением.
Если до момента импорта растра такой информации о размере элемента растра нет, то meterInPixelX и meterInPixelY можно проинициализировать значением 1.
Это означает, что пиксель (элемент) растра покрывает на местности квадрат со стороной 1 метр.
Уточнить после импорта размер элемента растра RSW и его привязку можно функциями, объявленными в rstapi.h

Если в исходном файле TIFF хранится информация о геопространственном позиционировании изображения растра,
то функция picexLoadGdalFileToRswUn автоматически спозиционирует растр и установит ему полученные параметры (привязку и размеры пикселя на местности).
конвертация .bmp в rsw
 
[QUOTE]Здравствуйте. Возник вопрос: как загрузить изображение (.bmp, .jpg) произвольного размера и привязать его к карте (подложка либо просто картинка на карте) , указав рамку вставки( верхний левый и правый нижний угол, например)?
Нужно использовать picexLoadBmpToRstAndCompress? или что-то другое?
Подскажите пожалуйста, в какой сторону хоть копать.
Использую gis designer + Qt под Astra Linux[/QUOTE]

Здравствуйте!
Функции импорта растровых изображений описаны в файле mappicex.h

Функция picexLoadBmpToRstAndCompress предназначена для импорта файлов BMP.
Соответственно функция picexLoadJpegToRswAndCompressJPEG - для импорта файлов JPEG.
На выходе функций получаете файл растровой карты формата RSW (*.rsw).

Открываете растр RSW в отдельный документ вызовом функции mapOpenAnyData (mapapi.h).
_MAPIMP HMAP _MAPAPI mapOpenAnyDataPro(const WCHAR *name, long int mode, long int *error,
                                      const WCHAR *password, long int size);
Получаете идентификатор документа HMAP.

Затем для привязки растра или редактирования его параметров применяете функции, описанные в файле rstapi.h.
На вход функций из rstapi.h необходимо подавать идентификатор документа HMAP и номер растра в цепочке.
В документе HMAP растры хранятся в цепочке растров (некий список).
Чтобы узнать номер растра в цепочке документа применяйте функцию
_MAPIMP long int _MAPAPI mapGetRstNumberByName(HMAP hMap, const char *name);
_MAPIMP long int _MAPAPI mapGetRstNumberByNameUn(HMAP hMap, const WCHAR* name);

Точка привязки растра - это координаты нижнего левого угла юго-западного пикселя растра.
Например, для позиционирования растра в районе работ или привязки к местности необходимо
изменить точку привязки растра вызовом функции mapSetRstLocation:

 // Установить привязку растра в районе работ(в метрах)
 // hMap       - идентификатор открытых данных
 // number     - номер файла в цепочке
 // location   - координаты юго-западного угла растра(в метрах)
 // При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapSetRstLocation(HMAP hMap, long int number, DOUBLEPOINT *location);

Часто задаваемые вопросы:
Как подвинуть растр на отрезок (Dx,Dy)?
   Запросите привязку растра - mapGetRstLocation(...)
   Измените точку привязки на отрезок (Dx,Dy)
   Установите новую точку привязки - mapSetRstLocation(...)
   Перерисуйте окно.

Как подвинуть растр с изменением масштаба ?
   Запросите привязку растра - mapGetRstLocation(...)
   Запросите знаменатель масштаба растра - mapGetRstScale(...)
   Измените точку привязки и рассчитайте знаменатель масштаба
   Установите новую точку привязки - mapSetRstLocation(...)
   Установите новый знаменатель масштаба - mapSetRstScale(...)
   Перерисуйте окно.

Для позиционирования и поворота растров описан ряд функций в mappicex:

// Привязка растра с масштабированием по двум точкам
// Внимание: Возможна установка отличных друг от друга размеров пикселя по X и по Y
// hmap        - идентификатор открытых данных
// rswName     - имя файла растра
// pointMet1   - Координаты первой точки  в метрах
// pointmetnew1  - желаемые координаты первой точки в метрах
// pointMet2   - Координаты второй точки  в метрах
// pointmetnew2  - желаемые координаты второй точки в метрах
// message     - флаг на выдачу сообщений (0\1)
// При ошибке возвращает ноль

_PICIMP long int _PICAPI AttachRswWithScaling(HMAP hmap, const char* rswName,
                                            DOUBLEPOINT *pointMet1, DOUBLEPOINT *pointMetNew1,
                                            DOUBLEPOINT *pointMet2, DOUBLEPOINT *pointMetNew2,
                                            long int message);

_PICIMP long int _PICAPI AttachRswWithScalingUn(HMAP hmap, const WCHAR * rswName,
                                            DOUBLEPOINT *pointMet1, DOUBLEPOINT *pointMetNew1,
                                            DOUBLEPOINT *pointMet2, DOUBLEPOINT *pointMetNew2,
                                            long int message);

Там же описаны функции привязки растров по 2-м точкам с поворотом.
Проблема с чтением растра
 
[QUOTE][URL=https://www.gisweb.ru/forum/user/17491/]BBV[/URL] написал:
Попробуйте прочитать не линию, а полностью залитый фрагмент растра.[/QUOTE]
Приведенный тестовый пример читает и отображает [B]прямоугольную область [/B]растра.

Вызовом функции mapGetRstFrame запрашивается прямоугольная (в данном случае квадратная) область раста.
Ширина и высота области 1024 пиксель растра.
[CODE] int width = 1024;
 // Установить ширину кратно байту
 width = (width + 7) & ~7;

 int height = 1024;
[/CODE]В функции TForm1::PiantFrame выполняется по пиксельная отрисовка прямоугольной области растра из буфера.
Прямоугольная область растра в буфере представляет собой двумерный массив ноликов и единичек.
В одном бите содержится нолик или единичка для одного пикселя растра.
[QUOTE]содержимое буфера отображается на форме Test. Пиксели растра со значение 0 отображаются красным цветом, единички - синим.
[/QUOTE]
При выполнении теста на форме корректно отобразилось содержимое растра (1024x1024) - диагональная линия.
В буфере диагональная линия описана единичками, а фон изображения - нулями.
[CODE]Схематичное содержимое буфера:
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
[/CODE]Если нарисуем в исходном растре звездочку, то тест на форме отобразит звезду.

В вашем случае сначала растр чистится нулями, затем вызывается функция mapGetRstFrame.
Вместо отображения растра предлагаю пробежаться по буферу и поискать в нем единички, которых быть не должно.
Как перебирать содержимое буфера можно глянуть в функции TForm1::PiantFrame теста.
Если найдете единичку, выдавайте сообщение MessageBox.
Таким образом, мы выясним, есть ли в буфере грязь.
Проблема с чтением растра
 
[QUOTE][URL=https://www.gisweb.ru/forum/user/17491/]BBV[/URL] написал:
Не могу сказать что помогли, скорее напрягли.
Вашу версию как она есть проверить не могу Embarcadero не используем.
Несколько раз написал, что делал полную заливку растра цветом, не линию рисовал, на линии точек не видно.
Появлялись точки при чтении mapGetRstFrame в массив, далее этот массив уже с точками вернул в растр mapPutRstFrame.
К mapPutRstFrame претензий нет т. к. первоначальную заливку делал этой функцией, точек не было.
[/QUOTE]
В моем примере отображение данных из буфера, запрошенных вызовом функции mapGetRstFrame, реализовано в виде элементарных циклов по строкам и столбцам изображения.
Отображение данных буфера в функции TForm1::PiantFrame.
В примере намеренно не применялись посторонние функции, чтобы исключить возможных ошибок.
Функция mapGetRstFrame отработала нормально, мусор не добавляется.
Проверьте работу с памятью. Достаточный ли размер памяти для буфера выделяете.
Проблема с чтением растра
 
[QUOTE][URL=https://www.gisweb.ru/forum/user/17491/]BBV[/URL] написал:

Добрый день!

Пишу на C#

Проблема с функцией mapGetRstFrame.

Написал автоматизированную обработку растровых изображения и заметил что местами появляются точки которых не должно быть. Залил с помощью mapPutRstFrame весь растр. Набросал тестовый код:

int bwidth = (int)Math.Round(bframe.width / 8.0);   // ширина фрейма в байтах

int left = 8 * (int)(bframe.left / 8.0);    // выравнивание на границу байта

IntPtr bits = Marshal.AllocHGlobal(bcount);

long n = FMapAPI.mapGetRstFrame(hMap, msrc, bits, left, bframe.top, bframe.width, bframe.height, bwidth);

Marshal.Copy(bits, bsrc, 0, bcount);

//Marshal.FreeHGlobal(bits);

// отправляем в pictureBox

gur.DraweFrom1bitArray(picBox, bsrc, bframe.width, bframe.height, Color.Blue, Color.White);

//bits = Marshal.AllocHGlobal(bsrc.Length);

//Marshal.Copy(bsrc, 0, bits, bsrc.Length);

FMapAPI.mapPutRstFrame(hMap, msrc, bits, left, bframe.top, bframe.width, bframe.height, 1, bwidth);

FMapAPI.mapUpdateRstDuplicates(hMap, msrc);

FMapAPI.mapSaveRst(hMap, msrc);

Marshal.FreeHGlobal(bits);

mvMap.Repaint();

Для проверки отправляем считанное изображение в pictureBox (на картинке слева синяя). Растр 1 бит на элемент.

По изображению идут точки. Что не так?[/QUOTE]

Добрый день!

Алгоритм проверки функции mapGetRstFrame:

1. Создано тестовое приложение на С++ для платформы x64 в XE5.

Исходные тексты приложения в архиве Source_Test.zip.

[CODE]//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner), HMap()
{
Bits = 0;
SizeOfBits = 0;
FlagPaint = 0;
FlagGetFrame = 0;
}

//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
 DELETE_ARR(Bits);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button_OpenFileClick(TObject *Sender)
{
 if (OpenDialog1->Execute())
 {
  InputName = OpenDialog1->FileName;
  Edit1->Text = InputName;
 }

 HMap = mapOpenDataUn(InputName.c_str());
 if (!HMap)
  {
   mapErrorMessageUn(IDS_OPEN, InputName.c_str());
  }

 FlagGetFrame = 0;
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button_GetFtameClick(TObject *Sender)
{
 if (InputName.IsEmpty())
 {
  mapErrorMessageUn(IDS_OPEN, L"*.RSW");
  return;
 }

 if (!HMap)
   {
    mapErrorMessageUn(IDS_OPEN, InputName.c_str());
    return;
   }

 // Размеры отображаемой части тестового растра
 int width = 1024;
 // Установить ширину кратно байту
 width = (width + 7) & ~7;

 int height = 1024;
 int widthInByte = (width * 1) >> 3;
 SizeOfBits = widthInByte*height;

 DELETE_ARR(Bits);
 NEW_ARR(Bits, char, SizeOfBits);
 if (Bits == 0)
  {
   mapErrorMessageUn(IDS_MEMORY, InputName.c_str());
   return;
  }

 int left = 0;
 int top = 0;

 // Чтение прямоугольного участка растра
 //  hMap       - идентификатор открытой векторной карты
 //  number     - номер файла в цепочке
 //  bits    - указатель на начало изображения битовой области
 //  left    - смещение слева в элементах (выравнено на границу байта)
 //  top     - смещение сверху в элементах
 //  width   - ширина в элементах (выравнено на границу байта)
 //  height  - высота в элементах
 //  widthinbyte    - ширину прямоугольного участка растра в байтах
 // Принцип выравнивания:
 //  при ElementSize() == 1 (бит) - left,width кратны 8,
 //                    == 4 (бит) - left,width кратны 2
 // При ошибке возвращает 0

 int ret = mapGetRstFrame(HMap, 1, Bits, left, top, width, height);
 if (ret == 0)
  {
   mapErrorMessageUn(IDS_READ, InputName.c_str());
   return;
  }

 PaintImage(width, height, Bits, SizeOfBits);
}
//---------------------------------------------------------------------------

int __fastcall TForm1::PaintImage(int width, int height, char* bits, int sizeOfBits)
{
 if (width == 0 || height == 0 || bits == 0 || sizeOfBits == 0)
    return 0;

 // Очистить область рисования
 TRect rect;
 rect.Left   = 0;
 rect.Top    = 0;
 rect.Right  = Image1->Width;
 rect.Bottom = Image1->Height;
 Image1->Canvas->FillRect(rect);

 PiantFrame(width, height, bits, sizeOfBits);
 return 1;
}

//---------------------------------------------------------------------------
int __fastcall TForm1::PiantFrame(int width, int height, char* bits, int sizeOfBits)
{
 if (FlagPaint)
    return 0;

 if (width == 0 || height == 0 || bits == 0 || sizeOfBits == 0)
    return 0;

 int widthInByte = (width * 1) >> 3;

 TColor redColor = TColor(RGB(255, 0, 0));
 TColor blueColor = TColor(RGB(0, 0, 255));
 TColor currentColor;

 for (int j = 0; j < min(Image1->Height, height); j++)
    {
     char* str = (bits + widthInByte*j);
     for (int i = 0; i < min(Image1->Width, width); i++)
        {
         char* pix = str;
         int offset = i;
         pix += offset>>3;

         int value = (unsigned char)(*pix >> (7-offset%8)) & 0x01L;
         if (value == 0)
            currentColor = redColor;
           else
            currentColor = blueColor;
         Image1->Canvas->Pixels[i][j] = currentColor;
        }
    }

 return 1;
}
[/CODE]

2. Для выполнения приложения библиотеки GTK x64 изъяты из дистрибутива

"Инструментарий разработчика ГИС-приложений GIS ToolKit (версия 14.5.2.0, для платформ "x32" и "x64")", размещенного на страничке "Скачать" нашего сайта.

[URL=https://www.gisinfo.ru/products/gistool_win.htm]https://www.gisinfo.ru/products/gistool_win.htm[/URL]

Версия библиотек GTK x64 на скриншоте "Свойства: gis64acces.dll".

3. В редакторе Paint создан одноцветный (1 бит на пиксель) файл BMP Line_1024х1024.bmp размером 1024 на 1024 пикселей. По диагонали проведена черная линия.

4. Средствами ГИС Панорама файл Line_1024х1024.bmp конвертирован в растровую карту Line_1024х1024.rsw. Растр размещен в архиве Line_1024х1024.zip.

5. В тестовом приложении открыт файл Line_1024х1024.rsw и по нажатию на кнопку "GetFrame" выполнена функция mapGetRstFrame, далее содержимое буфера отображается на форме Test. Пиксели растра со значение 0 отображаются красным цветом, единички - синим. Отображение содержимого буфера реализовано в функции TForm1::PiantFrame().

При отображении на форме содержимого буфера, полученного вызовом функции mapGetRstFrame, изображение полностью соответствует исходному растру RSW.

Функция mapGetRstFrame работает корректно.

ошибки и пожелания
 
[QUOTE][URL=https://www.gisweb.ru/forum/user/20480/]Вадим[/URL] написал:
Здравствуйте. У меня вопрос : Имеется эхолот серии GARMIN STRIKE PLUS с подключением через последовательный порт (RS232) очень хотелось бы выводить информацию через ПО с возможностью создания  карт глубин и подводного рельефа дна  . На данный момент софта для выгрузки информации из него, почти нет за исключением DNR GARMIN (устарел вывод формата GPX v.1.0 и разработчик прекратил поддержку ПО) , я списывался с некоторыми разработчиками иностранных ПО , но ни кто не смог мне дать уверенный ответ . Только частично , что поддерживается часть протокола . Сам Вопрос : Имеется ли поддержка  Гарминовского протокола (L000, L001 , ASCII protocol ) ?  
Спасибо .[/QUOTE]

Здравствуйте!

В состав ГИС Панорама входит модуль [URL=https://help14.gisserver.ru/russian/gpstest/index.html?idn_gpstest.html]GPS\ГЛОНАСС Монитор[/URL], который предназначен для взаимодействия с GPS\ГЛОНАСС приемником, подключенным к компьютеру.
Внешние GPS\ГЛОНАСС устройства могут подключаться к компьютеру через последовательный (COM1:, COM2:) или USB порт компьютера.

При подключении приемника к COM-порту компьютера взаимодействие осуществляется по текстовому протоколу NMEA0183.
При подключении приемника к USB-порту применяется двоичный протокол обмена формата GARMIN, реализованный в соответствии с документацией производителя  "Garmin Device Interface Specification" редакции 19 мая 2006г.
Реализованы физический протокол, протокол связи и протоколы приложения (L001, A010, A100, D110, A201, D202, D110, D210, A301, D312, D302, A400, D110, A700, D700, A800, D800).
Взаимодействие ГИС Панорама с приемниками тестировалось на USB-устройствах: Garmin GpsMap 60, Garmin GpsMap 60 Cx.

Попробуйте в настройках GARMIN STRIKE PLUS изменить формат выдачи сообщений на NMEA0183.
ошибки и пожелания
 
После импорта растра с галочкой "Не копировать изображение в RSW" настройте отображаемые каналы.
Для этого в контекстном меню диалога "Список растров" укажите пункт "Каналы мультиспектрального снимка".
Далее в диалоге "Настройка отображаемых каналов" кликните по радиокнопке "Вегетационный индекс".

Получаем такое изображение:
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 34 След.



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности