Поиск объектов, получение информации о них, а также их выделение
В разделе представлены примеры поиска, выделения объектов и отображения картографической информации.
Ниже представлен код, реализующий поиск объекта. Сначала инициализируются параметры запроса (границы, пределы масштабов).
void MapWidget::showObjectInfo(QPointF pos){gis_core_request_parameters_t map;gis_core_request_parameters_init( &map );...}
Запрос списка объектов осуществляется с помощью класса GisObjectList
. Класс содержит список объектов, отфильтрованных по заданным классам и границам карты, поэтому необходимо создать вектор класс-кодов.
Передача вектора с единственным значением класс-кода 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 );}
На рисунке ниже представлен пример визуализации полученной информации о выделенном объекте с помощью представленного выше кода.
Найденный объект можно выделить. Сделать это можно с помощью добавления пользовательского объекта. П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);}
На рисунке ниже представлен пример выделения объекта.
Предыдущий раздел: Руководство разработчика