Обзор программного комплекса поддержки работы с цифровой картографической информацией и общие рекомендации по применению на практике
Программный комплекс позволяет создавать приложения, работающие с электронной картографической информацией (обработка, анализ, визуализация), под управлением ЗОСРВ «Нейтрино».
Разработка картографического приложения включает в себя следующие этапы:
Рассмотрим нюансы подключения к картографическому сервису. Для начала работы необходимо установить соединение с картографическим сервисом по идентификатору пользователя РОП.
#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() позволяет запросить данные, удовлетворяющие ограничениям по координатам и масштабу.
Предельный размер РОП задается переменной окружения 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;} elseprintf( "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. Как только область окна отображения выходит за границы этой зоны, вызывается перерисовка поверхности.
Для отображения различных типов картографической информации существуют различные типы слоев движка SM:
Движок 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 );
Комплекс предоставляет пользователю возможность работать с пользовательскими объектами, такими как полилиния, полигон, изображение. Есть возможность изменить цвет объекта и/или его границы, а также изменить вектор градусных точек, описывающих объект.
/* Добавление объекта типа полигон: */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 );
Комплекс позволяет преобразовать градусные координаты выбранной точки в метрические и обратно, экранные координаты в градусные и обратно. Кроме того, пользователь может измерять длину полилинии, описываемой градусными точками, на эллипсоиде, измерять площадь и периметр полигонов.
Полигон должен быть выпуклым. |
/* Преобразование пиксельных координат в метрические: */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 );
Команда запуска картографического сервиса включает в себя название сервиса, а также список драйверов для определенных типов данных, которые необходимо подключить (работа с пользовательскими объектами включена по умолчанию).
/* Подключение драйверов SXF и MTW с локальным источником данных: */ gis-core -d sxf-local, -d mtw-local
При запуске программного комплекса выполняется следующая последовательность действий:
Команда запуска средства просмотра включает в себя название приложения, широту и долготу центра отображения.
gis-map-viewer -x45 -y40
Предыдущий раздел: Руководство разработчика