Работа с объектами

Поиск объектов, получение информации о них, а также их выделение

В разделе представлены примеры поиска, выделения объектов и отображения картографической информации.

Ниже представлен код, реализующий поиск объекта. Сначала инициализируются параметры запроса (границы, пределы масштабов).

void MapWidget::showObjectInfo(QPointF pos)
{
gis_core_request_parameters_t map;
gis_core_request_parameters_init( &map );
...
}

Запрос списка объектов осуществляется с помощью класса GisObjectList. Класс содержит список объектов, отфильтрованных по заданным классам и границам карты, поэтому необходимо создать вектор класс-кодов.


Note: Передача вектора с единственным значением класс-кода GIS_CLASS_CODE_UNDEFINED в конструктор GisObjectList::GisObjectList осуществит выбор объектов любого класса.

void MapWidget::showObjectInfo(QPointF pos)
{
gis_core_request_parameters_t map;
gis_core_request_parameters_init( &map );
std::vector<uint32_t> class_list;
class_list.push_back(GIS_CLASS_CODE_UNDEFINED);
GisObjectList list (&map.borders, class_list);
...
}

Идентификация объекта осуществляется с помощью метода GisObjectList::find_nearest_object(), принимающий в качестве аргумента координаты точки. Метод находит ближайший объект к выделенной точке. Алгоритм поиска использует структуру k-мерных деревьев. Метод возвращает индекс объекта в списке.

void MapWidget::showObjectInfo(QPointF pos)
{
...
object_point_t point_pos;
/* Получение координат точки */
...
int idx = list.find_nearest_object(point_pos);
gis_object_t _obj;
gis_object_init( &_obj );
list.get_object(idx, _obj);
...
gis_object_free( &_obj );
}

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

object_info.png
Рисунок 1. Просмотр информации об объекте.

Найденный объект можно выделить. Сделать это можно с помощью добавления пользовательского объекта. Пpимeр создания пользовательского объекта:

void ObjectInfo::addSelectionLine( gis_object_t *obj )
{
uint32_t color = 0xF0FF0000;
uint32_t pen_width = 3;
QVector <double_point_t> points;
/*Заполнение вектора points точками*/
...
selectionLine = gis_render_sm_userdata_add_polyline (_sm_ctx, points.data(), obj->point_count, color, pen_width, 1 );
gis_render_sm_redraw_userobject(_sm_ctx, true);
}

На рисунке ниже представлен пример выделения объекта.

object_selection.png
Рисунок 2. Выделение объекта.




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