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

ГИС Оператор: сохранение в файл определенного места карты по известным координатам.

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
ГИС Оператор: сохранение в файл определенного места карты по известным координатам.
 
В среде Astra Linux v.1.4 требуется реализовать сохранение области
карты по 4 координатам, определение самого большого города на этом
участке и вывод его текстом на области карты.

Версия ГИС - 11.13.3.

Есть справочник программиста 2005 года. Не могу по нему
реализовать задачу выше. Есть ли обновленный справочник?

С учетом того, что задача, возможно, тривиальна, - прошу написать
алгоритм ее реализации (написать хотя бы порядок функций). Работать вслепую с картами сложно, особенно не
зная последовательности действий.

Судя по ответам функций: карта открывается, системное имя
читается, масштаб меняется. Но на этом - все. Ни выделить область, ни
сохранить рисунок никакими функциями в Linux не выходит. Простые
функции, которые легко бы решили задачу в Windows, - недоступны.

Спасибо.
 
Здравствуйте!

Привожу приблизительный порядок действий для решения задачи:
- получить информацию о паспортных данных карты (в том числе, имена номенклатурных листов карты) можно с помощью функции mapGetMapInfoPro (mapapi.h):
Код
  // Запросить паспортные данные векторной карты
  // Структуры MAPREGISTER и LISTREGISTER описаны в mapcreat.h
  // hmap - идентификатор открытых данных
  // sheetnumber - номер листа карты для
  // которого запрашиваются паспортные данные
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetMapInfoPro(HMAP hmap, long int sheetnumber, MAPREGISTEREX *map, LISTREGISTER *sheet,
                                          SHEETNAMES * sheetnames);
- вывод текста можно реализовать путем создания объектов типа "Подпись" на временной карте. Для создания временной карты используются функции семейства mapCreateTempSite() (mapapi.h) - например, mapCreateAndAppendTempSitePro.
Более подробное создание пользовательских карт описано в разделе 3.8.3 "Открытие и создание пользовательских карт" Руководства программиста (https://gistoolkit.com/download/doc/gisdesigner_prog.pdf);
Код
  // Создать временную пользовательскую карту по открытой карте
  // hmap     - идентификатор открытых данных
  // rscname  - полное имя файла ресурсов, если равно 0 - выбирается
  //            из открытой карты
  // inmemory - признак создания карты в оперативной памяти или 0
  // Файлы карты размещаются в рабочей директории системы
  // и имеют уникальные имена, генерируемые автоматически
  // При закрытии пользовательской карты все файлы данных автоматически удаляются
  // Если параметр inmemory не равен 0, то все данные хранятся только в оперативной памяти
  // и освобождаются при закрытии карты
  // Возвращает идентификатор открытой пользовательской карты
  // При ошибке возвращает ноль
_MAPIMP HSITE _MAPAPI mapCreateAndAppendTempSitePro(HMAP hMap, const WCHAR *rscname, long int inmemory);
- создать объект для вывода текстовой информации можно с помощью функций mapCreateObject(), mapRegisterObject(), mapCommitObjec() (mapapi.h). Более подробно создание и редактирование объектов описано в разделе 3.8.16 "Редактирование объектов" Руководства программиста.
Для создания объекта, вид которого не описан в классификаторе, объект регистрируется как графический с помощью функции mapRegisterDrawObject() (mapapi.h). Более подробно создание и редактирование объектов описано в разделе 3.8.18 "Создание графических объектов на карте" Руководства программиста. Пример создания графического объекта приведен в тестовом приложении myfirst из состава инсталляции ГИС Конструктор.
- формирование выходного изображения области карты производится с помощью семейства функций mapPaintToXImage() (mapapi.h). Более подробно формирование изображения карты описано в разделе 3.8.4 "Управление визуализацией и печатью" Руководства программиста и примере mapview из состава инсталляции ГИС Конструктор.
Код
 // Вывести изображение карты в XImage (массив)
 // Описание структуры XIMAGEDESC в maptype.h
 // hmap - идентификатор открытых данных
 // x,y - координаты левого верхнего угла внутри
 // битовой области XImage для размещения изображения
 // rect - выводимый фрагмент карты
 // При ошибке в параметрах возвращает ноль
_MAPIMP long int _MAPAPI mapPaintToXImage(HMAP hmap, XIMAGEDESC *imagedesc, long int x, long int y, RECT *rect);
- полученный образ изображения карты в формате XImage можно сохранить в файле с помощью класса QImage библиотек Qt. Пример кода:
Код
if (mapPaintToXImage(MapHandle, &xImageDesc, 0, 0, &rectDraw))      
{        
  QImage image((uchar *)BitMap, cw, ch, QImage::Format_RGB32);        
  image.save("/tmp/output.png");
}
Изменено: Александр Савелов - 22.09.2022 11:48:42 (Добавлено сохранение изображения карты в формате XImage в файл)
 
Здравствуйте!

Для сохранения изображения области карты по двум координатам (в метрах) в файл можно воспользоваться следующим примером кода:
Код
#include <QApplication>
#include <QImage>

#include "mapapi.h"
#include "qdmcmp.h"

int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  QDMapView();  // инициализация функций принтерно-растрового вида

  HMAP mapHandle = mapOpenAnyData(WTEXT("/usr/share/gisdesigner/examples/Data/Планы городов/Noginsk/Noginsk.sit"));
  if (!mapHandle)  
    return 1;

  double x1 = 6200000;  // в метрах
  double y1 = 7460000;
  double x2 = 6190000;
  double y2 = 7470000;

  // перевод в пиксели
  mapPlaneToPicture(mapHandle, &x1, &y1);
  mapPlaneToPicture(mapHandle, &x2, &y2);

  int paintWidthInPixels = abs(x2 - x1);
  int paintHeightInPixels = abs(y2 - y1);

  RECT drawRectInPixels;
  drawRectInPixels.left = x1;
  drawRectInPixels.top = y1;
  drawRectInPixels.right = x1 + paintWidthInPixels;
  drawRectInPixels.bottom = y1 + paintHeightInPixels;
  
  int paintDepthInBits = 32;

  char *paintMemory = AllocateTheMemory(paintWidthInPixels * paintHeightInPixels * paintDepthInBits / 8);
  if (paintMemory)
  {
    XIMAGEDESC xImageDesc;
    xImageDesc.Point = paintMemory;
    xImageDesc.Width = paintWidthInPixels;
    xImageDesc.Height = paintHeightInPixels;
    xImageDesc.Depth = paintDepthInBits;
    xImageDesc.CellSize = xImageDesc.Depth / 8;
    xImageDesc.RowSize = paintWidthInPixels * xImageDesc.CellSize;

    if (mapPaintToXImage(mapHandle, &xImageDesc, 0, 0, &drawRectInPixels))
    {
      QImage image((uchar *)paintMemory, paintWidthInPixels, paintHeightInPixels, QImage::Format_RGB32);
      image.save("/tmp/out.png");
    }
  }
  
  FreeTheMemory(paintMemory);

  mapCloseData(mapHandle);
  mapCloseMapAccess();

  return 0;
}
pro-файл:
Код
SOURCES += main.cpp

INCLUDEPATH += /usr/include/gisdesigner/
LIBS += -lmapcomponents -lqdmapacces
Дополнительно в состав ГИС Конструктор входит набор тестовых примеров, демонстрирующих базовый функционал работы с картами (каталог /usr/share/gisdesigner/examples/).
Например, в примерах myfirst и mapview реализовано отображение карты с помощью готового визуального компонента QDMapView и с помощью функций интерфейса MAPAPI соответственно.
 
Соответственно, чтобы перейти от геодезических координат (задаются в радианах) к метрам в системе координат документа( карт)
есть функции:
Код
// Преобразование из геодезических координат в радианах
 // в метры на местности в соответствии с проекцией карты (поддерживается не для всех карт)
 // hmap - идентификатор открытых данных
 // Bx,Ly  - преобразуемые координаты
 // на входе радианы, на выходе - метры
 // При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapGeoToPlane(HMAP hmap, double *Bx, double *Ly);

// Преобразование из геодезических координат в радианах (общеземной эллипсоид WGS84)
 // в метры на местности в проекции карты (поддерживается не для всех карт)
 // hmap  - идентификатор открытых данных
 // Bx,Ly - преобразуемые координаты, на входе радианы, на выходе - метры
 // H     - НОРМАЛЬНАЯ высота в точке (метры), не пересчитывается
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGeoWGS84ToPlane3D(HMAP hmap, double *Bx, double *Ly, double *H);
и другие.
 
Цитата
Александр Савелов написал:
Здравствуйте!

Спасибо за предоставленную информацию.
В присланных данных содержится функция и скриншоты полученных результатов. Для корректного воспроизведения проблемы, пожалуйста, уточните следующую информацию (как описано в сообщении выше):
- исходный код прикладной задачи в случае разработки для ГИС Оператор SE (для подключения ее в состав ГИС Оператор SE и воспроизведения проблемы);
- исходный код ГИС-приложения в случае разработки с использованием ГИС Конструктор (для сборки ГИС-приложения и воспроизведения проблемы);
- тестовые данные (файлы карт, которые необходимо использовать при тестировании).
Добрый день. Не понимаю запроса.
- исходный код прикладной задачи в случае разработки для ГИС Оператор SE ---- я прислал на почту файл CPP с кодом сохранения карты в файл рисуночный;
- исходный код ГИС-приложения в случае разработки с использованием ГИС Конструктор --- это не код среды разработки "ГИС", а код среды Qt v.5.3;
- тестовые данные, на которых воспроизводится данная проблема --- пересылать не могу секретные карты (именно поэтому обезличил все рисунки карт на почте).
 
Здравствуйте!

В дополнение к приведенному ранее примеру разработки автономного ГИС-приложения на базе ГИС Конструктор привожу исходный код того же примера в формате прикладной задачи для ГИС Оператор SE:
Код
#include <QImage>

#include "mapapi.h"

int SaveMapRegionToFileFunction(HMAP mapHandle, TASKPARMEX * taskParmEx)
{
  if (!mapHandle || !taskParmEx)
    return 0;

  double x1 = 6200000;  // в метрах
  double y1 = 7460000;
  double x2 = 6190000;
  double y2 = 7470000;

  // перевод в пиксели
  mapPlaneToPicture(mapHandle, &x1, &y1);
  mapPlaneToPicture(mapHandle, &x2, &y2);

  int paintWidthInPixels = abs(x2 - x1);
  int paintHeightInPixels = abs(y2 - y1);

  RECT drawRectInPixels;
  drawRectInPixels.left = x1;
  drawRectInPixels.top = y1;
  drawRectInPixels.right = x1 + paintWidthInPixels;
  drawRectInPixels.bottom = y1 + paintHeightInPixels;

  const int paintDepthInBits = 32;

  char *paintMemory = AllocateTheMemory(paintWidthInPixels * paintHeightInPixels * paintDepthInBits / 8);
  if (paintMemory)
  {
    XIMAGEDESC xImageDesc;
    xImageDesc.Point = paintMemory;
    xImageDesc.Width = paintWidthInPixels;
    xImageDesc.Height = paintHeightInPixels;
    xImageDesc.Depth = paintDepthInBits;
    xImageDesc.CellSize = xImageDesc.Depth / 8;
    xImageDesc.RowSize = paintWidthInPixels * xImageDesc.CellSize;

    if (mapPaintToXImage(mapHandle, &xImageDesc, 0, 0, &drawRectInPixels))
    {
      QImage image((uchar *)paintMemory, paintWidthInPixels, paintHeightInPixels, QImage::Format_RGB32);
      image.save("/tmp/out.png");
    }
  }

  FreeTheMemory(paintMemory);

  return 1;
}

extern "C"
{
  long int _export WINAPI GetInterfaceVersion() { return 0; }

  long int _export WINAPI CallGisFunctionEx(HMAP mapHandle, TASKPARMEX *taskParmEx)
  {
    return SaveMapRegionToFileFunction(mapHandle, taskParmEx);
  }
}
pro-файл:
Код
TEMPLATE = lib
CONFIG += shared plugin

INCLUDEPATH += /tmp/SDK/include/

SOURCES += \
    task.cpp

LIBS += -L/usr/Operator14 -lmapacces
Здесь /tmp/SDK - путь к распакованному архиву со средствами разработки для ГИС Оператор SE 14 (https://gisinfo.ru/download/download_linux.htm#13).
В состав SDK также входит пример прикладной задачи example_pantask.
Более подробно описание создания прикладных задач приведено в разделе 7. "Разработки прикладных задач в ГИС" документа "Прикладные задачи. Разработка новых модулей." (https://gistoolkit.com/download/doc/mapapi.pdf).

Реализация собственного функционала возможна одним из двух способов:
- написание автономного ГИС-приложения на базе ГИС Конструктор (https://gisinfo.ru/download/download_linux.htm#5). Пример такого приложения на основе Ваших требований приведен в сообщении выше (https://gisweb.ru/forum/messages/forum7/topic12270/message92604/12270-gis-operator_-sokhranenie-v-fa...).
При таком подходе используются заголовочные файлы и библиотеки из состава ГИС Конструктор (для актуальной версии ГИС Конструктор 14 заголовочные файлы расположены в каталоге /usr/include/gisdesigner/, библиотеки - /usr/lib, пример библиотеки - libqdmapacces.so).
Созданное на базе ГИС Конструктор ГИС-приложение является автономным исполняемым файлом с библиотеками и не требует для запуска других программ.

- написание прикладной задачи для ГИС Оператор SE или ГИС Панорама для Linux (https://gisinfo.ru/download/download_linux.htm#9). Пример такой прикладной задачи приведен в данном сообщении.
При таком подходе используются заголовочные файлы из состава SDK (для актуальной версии ГИС Оператор SE 14: https://gisinfo.ru/download/download_linux.htm#13) и библиотеки из состава ГИС Оператор SE или ГИС Панорама для Linux (для актуальной версии ГИС Оператор SE 14 каталоги /usr/Operator14 и /usr/Panorama14, пример библиотеки - libmapacces.so).
Созданная прикладная задача представляет собой библиотеку, которая запускается с помощью режима "Запуск приложений" из состава программы ГИС Оператор SE или ГИС Панорама для Linux (более подробно описано в разделе 4.5.5 "Запуск приложений" Руководства оператора: https://gistoolkit.com/download/doc/panmanuallin.pdf).

Для правильного ответа на возникшие у Вас вопросы, пожалуйста, уточните:
- какой из двух подходов при разработке собственного функционала Вы используете;
- какой продукт используется при разработке и его версия (из состава какого изделия Вы используете библиотеки при разработке);
- если Вы разрабатываете прикладную задачу для ГИС Оператор SE или ГИС Панорама, уточните, пожалуйста, откуда был взят комплект SDK.

Спасибо!
 
Как я вам отвечу на это - если вопросы написаны некорректно? Я не пишу никакого ГИС-приложения. Версия Оператора описана еще в первом сообщении: 11.13.3. Откуда я знаю, откуда был взят комплект, если специалисты, устанавливающие его, - уже давно уволены. И зачем вам это знать: я написал максимум информации - необходимой и достаточной.
 
Цитата
Сергей написал:
Как я вам отвечу на это - если вопросы написаны некорректно?
Я не пишу никакого ГИС-приложения. Версия Оператора описана еще в первом сообщении: 11.13.3.
Откуда я знаю, откуда был взят комплект, если специалисты, устанавливающие его, - уже давно уволены.
И зачем вам это знать: я написал максимум информации - необходимой и достаточной.
Код
Реализация собственного функционала возможна одним из двух способов:

- написание автономного ГИС-приложения на базе ГИС Конструктор (https://gisinfo.ru/download/download_linux.htm#5). 
Пример такого приложения на основе Ваших требований приведен в сообщении выше 
(https://gisweb.ru/forum/messages/forum7/topic12270/message92604/12270-gis-operator_-sokhranenie-v-fa...).
При таком подходе используются заголовочные файлы и библиотеки из состава ГИС Конструктор (для актуальной версии ГИС Конструктор 14 заголовочные файлы расположены в каталоге /usr/include/gisdesigner/, 
библиотеки - /usr/lib, пример библиотеки - libqdmapacces.so).
Созданное на базе ГИС Конструктор ГИС-приложение является автономным исполняемым файлом с библиотеками и не требует для запуска других программ.

- написание прикладной задачи для ГИС Оператор SE или ГИС Панорама для Linux (https://gisinfo.ru/download/download_linux.htm#9). 
Пример такой прикладной задачи приведен в данном сообщении.
При таком подходе используются заголовочные файлы из состава SDK (для актуальной версии ГИС Оператор SE 14: https://gisinfo.ru/download/download_linux.htm#13) и библиотеки из состава 
ГИС Оператор SE или ГИС Панорама для Linux (для актуальной версии ГИС Оператор SE 14 каталоги /usr/Operator14 и /usr/Panorama14, пример библиотеки - libmapacces.so).
Созданная прикладная задача представляет собой библиотеку, которая запускается с помощью режима "Запуск приложений" из состава программы ГИС Оператор SE или ГИС Панорама для Linux 
(более подробно описано в разделе 4.5.5 "Запуск приложений" Руководства оператора: https://gistoolkit.com/download/doc/panmanuallin.pdf).

Есть 2 варианта написания программ, использующих ГИС-библиотеки.
Автономное приложение. Это там, где есть функция main().
Для него нужно использовать ГИС Конструктор. Библиотеки ГИС Оператор нельзя использовать. Совсем. Нужно много действий по их инициализации вне ГИС Оператор.

Есть приложение, вызываемое из меню Задачи\Запуск приложений как динамическая библиотека. Там нет функции main(). Совсем. Это будет файл с расширением .so.
В проекте должен быть cpp, в котором должна быть функция со стандартным названием.
Вот такая -
Код
long int _export WINAPI CallGisFunctionEx(HMAP mapHandle, TASKPARMEX *taskParmEx)

И из нее можно вызывать функции MAPAPI-интерфейса.

В ГИС Оператор можно открыть любые данные и вызвать из меню Задачи\Запуск приложений новую библиотеку.
Идентификатор открытых данных (HMAP) уже будет передан в эту функцию первым параметром.

И когда приложение будет организовано подобным образом, можно рассмотреть его работоспособность.
 
Не вижу смысла эту тему развивать дальше. Вы отредактировали мое последнее сообщение, в котором было высказано не только мнение о продукте, но и конкретный баг вашего примера - цензура просто потрясающая.

А ведь есть еще баги. Для нормальной отрисовки карты в рисунке в примере - должны быть жестко выполнены условия: X1>X2, Y1<Y2. В противном случае отрисовывает абсолютно не тот участок. И никаких комментариев в примере об этом нет - обо все это приходится спотыкаться.
 
Цитата
Сергей написал:

Для нормальной отрисовки карты в рисунке в примере - должны быть жестко выполнены условия: X1>X2, Y1<Y2. В противном случае отрисовывает абсолютно не тот участок. И никаких комментариев в примере об этом нет - обо все это приходится спотыкаться.

В примере приведено:

Код
double x1 = 6200000;  // в метрах   
double y1 = 7460000;
double x2 = 6190000;
double y2 = 7470000; 

Координаты в пикселах в картинке идут от верхнего левого угла вправо и вниз.

Координаты в метрах на местности идут: ось X снизу (от экватора) вверх на полюс, ось Y слева (с осевого меридиана)  на восток.

Это нужно учитывать при переходе от системы координат карты к системе координат изображения.

Пример - это не учебник. Тут все не опишешь. Есть вопросы - задавайте в корректной форме. Объясним.

Цитата

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

Система координат документа при открытии данных устанавливается в систему координат тех данных, что открыты в документе первыми. Остальные данные трансформируются на лету в процессе отображения. Но при открытии в составе документа геопортала система координат документа автоматически устанавливается в систему координат геопортала с возможностью дальнейшего изменения системы координат документа.

Координаты в различных данных могут храниться в метрах, радианах или градусах. Метры могут быть в плоской прямоугольной системе координат (в проекции отображаемой карты) или в геоцентрической системе на заданном эллипсоиде. В интерфейсе MAPAPI для плоских прямоугольных координат ось X (первая координата) всегда направлена снизу вверх, ось Y (вторая координата) всегда направлена слева направо. В картографическом изображении координаты измеряются от верхнего левого угла начала отсчета. Ось X всегда направлена слева направо, а ось Y - сверху вниз. Поэтому для получения габаритов фрагмента изображения в пикселах нужно брать координаты верхней левой точки и нижней правой точки в метрах и пересчитывать их соответствующей функцией (например, mapPlaneToPicture). В результате значение X из метров на местности для направления снизу вверх автоматически заменится на значение в пикселах на оси слева направо, а для оси Y - с направления слева направо на направление сверху вниз.

Геодезические координаты (широта, долгота) могут быть в градусах или радианах на заданном эллипсоиде. В интерфейсе MAPAPI координата X всегда соответствует широте (углу, измеряемому от экватора к полюсу по меридиану), а координата Y - долготе (углу, измеряемому от нулевого меридиана к заданной точке по параллели). При пересчете соответствующей функцией в метры или пикселы значения координат автоматически преобразуются с учетом направления осей координат.

Функции MAPAPI-интерфейса позволяют запрашивать для любого источника данных или для документа в целом плоские прямоугольные координаты в метрах, прямоугольные геоцентрические координаты в метрах и геодезические координаты в радианах не зависимо от способа их хранения в конкретных данных. Между всеми видами координат поддерживается пересчет. Геоцентрические и геодезические координаты доступны, только если для данных установлены полные параметры системы координат, включая датум и эллипсоид.

Датум задается в виде 7 параметров преобразования Гельмерта для геоцентрической системы (3 линейных сдвига, 3 поворота и масштабирование) относительно эллипсоида WGS-84 или в виде 3 параметров преобразования Молоденского (3 линейных сдвига).

Отображение документа может выполняться в проекции открытых данных или в произвольной проекции и системе координат. Для изменения системы координат изображения необходимо установить параметры проекции и системы координат документа.

Параметры проекции и системы координат могут быть заданы совокупностью трех структур – MAPREGISTEREX, DATUM и ELLIPSOIDPARAM.

Страницы: 1
Читают тему (гостей: 1)



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

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