Обзор программного комплекса

Обзор программного комплекса поддержки работы с цифровой картографической информацией и общие рекомендации по применению на практике

Работа с движком визуализации
Параметры отображения
Пользовательские объекты
Преобразования и измерения
Запуск и отображение

Программный комплекс позволяет создавать приложения, работающие с электронной картографической информацией (обработка, анализ, визуализация), под управлением ЗОСРВ «Нейтрино».

Разработка картографического приложения включает в себя следующие этапы:

  1. подключение к картографическому сервису
  2. подключение разделяемой области памяти (РОП)
  3. настройка движка визуализации

Рассмотрим нюансы подключения к картографическому сервису. Для начала работы необходимо установить соединение с картографическим сервисом по идентификатору пользователя РОП.

#include <gis/gis.h>
#include <gis/gishelper.h>
gis_core_connection_t connection;
gis_core_link_init( &connection );
int result = gis_core_link_connect( &connection, 777 );
if ( result != EOK && result != EALREADY )
{
printf( "Connection failed\n" );
return result;
}

Существуют следующие возможности управления картографическим сервисом:

Data buffer - РОП, содержащая картографическую информацию во внутреннем формате. Для подключения РОП необходимо после предыдущего примера добавить вызов соответствующей функции:

...
result = gis_core_databuffer_attach( &connection );
if ( result != EOK && result != EALREADY )
{
printf( "Databuffer attach failed\n" );
return result;
}

После подключения РОП необходимо заполнить данными, для чего осуществляется запрос заполнения РОП. Функция gis_core_databuffer_data_request() позволяет запросить данные, удовлетворяющие ограничениям по координатам и масштабу.


Note: Предельный размер РОП задается переменной окружения GIS_CORE_DATABUFFER_SIZE_LIMIT.

...
gis_core_request_parameters_t map; // Параметры запроса (границы, пределы масштабов)
gis_core_request_parameters_init( &map );
bool autosize = true; // Флаг автоматического расширения размера РОП
result = gis_core_databuffer_data_request( &connection, &map, autosize );
if ( result != EOK )
{
if ( result != EOVERFLOW )
{
printf( "GIS Core map draw request failed\n" );
return result;
} else
printf( "GIS Core map draw request EOVERFLOW\n" );
}

Движок визуализации в своей работе использует дескриптор РОП, для получения которого необходимо вызвать соответствующую функцию:

...
result = gis_core_databuffer_descriptor_attach( &connection );
if ( result != EOK && result != EALREADY )
{
printf( "GIS Core draw buffer descriptor attach failed \n" );
return result;
}

Перед началом работы с движком отображения необходимо проинициализировать его контекст:

...
gis_data_engine_context_t data_engine_ctx;
gis_data_engine_alloc( map_widget_width, map_widget_height, GIS_DATA_ENGINE_MODE_SM, GIS_DATA_ENGINE_BPP_32, &data_engine_ctx );

Параметры инициализации map_widget_width, map_widget_height задают размеры области отображения в пикселях (ширина, высота), аргумент GIS_DATA_ENGINE_MODE_SM устанавливает режим отображения Surface Manager, параметр GIS_DATA_ENGINE_BPP_32 устаналивает режим цветности ARGB.

Работа с движком визуализации

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

Параметры отображения

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

...
gis_mdp_t disp_param = gis_data_engine_get_display_parameters( data_engine_ctx );
/* Координаты центра области отображения (широта 40 градусов, долгота 45 градусов): */
double_point_t center = { 45, 40 };
gis_mdp_set_center_point( disp_param, center );
gis_mdp_set_phys_scale( disp_param, real_scale_denom );
/* Установка параметров проекции отображения (проекция Меркатора, эллипсоид WGS84): */
gis_map_projection_t proj_params;
gis_map_projection_init( &proj_params );
proj_params.projection_idx = GIS_PROJECTION_MERC_PSEUDO;
proj_params.ellipsoid_idx = GIS_ELLIPSOID_WGS84;
gis_mdp_set_projection( disp_param, &proj_params );
/* Установка разрешения устройства отображения: */
gis_mdp_set_display_resolution( disp_param, DISPLAY_WIDTH_PX, DISPLAY_HEIGHT_PX );
/* Установка метрических размеров устройства отображения: */
gis_mdp_set_display_size( disp_param, DISPLAY_WIDTH_MM, DISPLAY_HEIGHT_MM);
/* Установка цвета фоновой заливки: */
gis_mdp_set_background_color( disp_param, 0xffffff );
/* Установка яркости и контрастности рендеринга: */
gis_mdp_set_brightness_contrast( disp_param, br, cn );

После того, как был выбран конкретный движок визуализации (аргумент функции gis_data_engine_alloc()), необходимо проинициализировать контекст выбранного движка визуализации, а именно контекст движка «Surface Manager» (SM):

...
/* Контекст движка SM: */
gis_render_sm_context_t surface_manager_ctx;
/* Зона нечувствительности относительно размера поверхности: */
double blit_region_rate = 0.5;
/* Дополнение к размеру offscreen-поверхности: */
uint32_t offscreen_ext_px = 1000;
gis_render_sm_alloc( &surface_manager_ctx, data_engine_ctx, offscreen_ext_px, blit_region_rate, &connection );

Размер результирующей поверхности вычисляется по следующей формуле:

Size = (map_widget_width + offscreen_ext_px * 2) x (map_widget_height + offscreen_ext_px * 2);
Size = (640 + 1000 * 2) x (480 + 1000 * 2) = 2640 x 2480 px;

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

offscreen-surface.png
Рисунок 1. Зона нечувствительности и область буферизации.

Для отображения различных типов картографической информации существуют различные типы слоев движка SM:

GIS_RENDER_SM_LAYER_TYPE_DISABLED
отключение слоя;
GIS_RENDER_SM_LAYER_TYPE_MTW
слой растровых карт;
GIS_RENDER_SM_LAYER_TYPE_2DMAP
слой векторных карт;
GIS_RENDER_SM_LAYER_TYPE_USROBJ
слой пользовательских объектов.


Note: Полный перечень типов слоев соответствует типу данных gis_render_sm_layer_type_t.

Движок SM поддерживает различные режимы работы:

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

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

void MapWidget::paintEvent( QPaintEvent * event )
{
/* Вызов перерисовки со смещениями dx и dy: */
int res;
if ( (res = gis_render_sm_move( surface_manager_ctx, dx, dy )) != EOK )
{
if ( res == EAGAIN )
printf( "Attempt to move during full render\n" );
}
dx = 0;
dy = 0;
/* Получение указателя на поверхность и приведение к типу QPixmap: */
QPixmap pixmap = *(QPixmap *)gis_render_sm_get_view_pixmap( surface_manager_ctx );
QPainter painter( this );
painter.drawPixmap( 0, 0, pixmap );
}
void MapWidget::slotIncreaseScale()
{
if ( g_new_scales )
{
...
/* Установка табличного значения знаменателя масштаба: */
real_scale_denom = scale_values[idx_scale];
} else {
...
/* Установка специфичного значения знаменателя масштаба: */
real_scale_denom *= (1.0 - CUSTOM_SCALE_RATE);
}
/* Вызов перерисовки с новым установленным масштабом: */
gis_render_sm_rescale( surface_manager_ctx, real_scale_denom );
}

В том случае, когда требуется работать с растровыми картами, необходимо включить соответствующий слой движка SM и настроить параметры отображения MTW. Пользователь может выбрать как дискретную заливку, так и градиентную, а также может предустановить диапазон высот, которые буду корректно отображены, установить цвет, которым будут отображаться высоты, выходящие за пределы, установленные пользователем. Кроме того, если у пользователя нет необходимости ограничивать диапазон отображения, то он может установить режим автоматического изменения граничных высот.

/* Инициализация слоя растровых карт: */
gis_render_sm_set_layer_type( surface_manager_ctx, 0, GIS_RENDER_SM_LAYER_TYPE_MTW );
/* Установка цветовой палитры, предельных высот отображения, типа рисования: */
gis_mdp_set_raster_palette( disp_param, colorMap.data(), colorMap.size(), invalid_height_color, max_height, min_height, discretePaletteFlag );
/* Установка автоматического изменения граничных высот: */
gis_mdp_set_raster_height_mode( disp_param, autolimit_flag );

Пользовательские объекты

Комплекс предоставляет пользователю возможность работать с пользовательскими объектами, такими как полилиния, полигон, изображение. Есть возможность изменить цвет объекта и/или его границы, а также изменить вектор градусных точек, описывающих объект.

usrobj1.jpeg
Рисунок 2. Возможности работы с пользовательскими объектами.
/* Добавление объекта типа полигон: */
userobject obj;
obj = gis_render_sm_userdata_add_polygon( surface_manager_ctx, vector.data(), vector.size(), fill_color, border_color );
/* Изменение цвета заливки полигона и цвета его границы: */
gis_render_sm_userdata_edit_object_color( surface_manager_ctx, obj, new_color, new_border_color );
/* Вызов рисования поверхности, содержащей пользовательские объекты: */
gis_render_sm_redraw_userobject( surface_manager_ctx, true );

Преобразования и измерения

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


Note: Полигон должен быть выпуклым.

/* Преобразование пиксельных координат в метрические: */
double_point_t meter_pnt;
int32_point_t px_pos = { 0, 0 };
gis_render_sm_convert_px2meters( surface_manager_ctx, px_pos, &meter_pnt );
/* Измерение длины линии, проложенной по градусным точкам: */
double distance = 0;
gis_render_sm_calculate_distance( surface_manager_ctx, degree_point_vector.data(), degree_point_vector.size(), &distance );
distance_meter1.jpeg
Рисунок 3. Измерение расстояний.

Запуск и отображение

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

/* Подключение драйверов SXF и MTW с локальным источником данных: */ gis-core -d sxf-local, -d mtw-local

При запуске программного комплекса выполняется следующая последовательность действий:

cart_service1.jpeg
Рисунок 4. Запуск картографического сервиса.

Команда запуска средства просмотра включает в себя название приложения, широту и долготу центра отображения.

gis-map-viewer -x45 -y40

demo1.jpeg
Рисунок 5. Средство просмотра.




Предыдущий раздел: Руководство разработчика