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

Содание графа дорог на mapapi

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 След.
RSS
Содание графа дорог на mapapi
 
Здравствуйте, имеется основная карта и слой, подготовленный для создания графа дорог, где присутствуют только нужные объекты, которые нужно выделить и запустить диалог создания графа.
Пытаюсь программно создать граф через встроенный в netapi диалог:
Код
void  MainWindow::makeNetGraph()
{
    //текущий из списка SIT-ов карты
    int siteIdx=ui->lwSites->currentRow();
    if (siteIdx==-1){
        QMessageBox::warning(this,"Внимание","Не выбран слой карты");
        return;
    }

    HSELECT select;
    HSITE site;
    long int res;

    //узнать HSITE по номеру
    site=mapGetSiteIdent(vMap->mapHandle(),siteIdx);
    //контекст поиска на SIT-е
    select = mapCreateSiteSelectContext(vMap->mapHandle(),site);
    //все объекты
    mapSelectLayer(select, -1, 1);
    mapSelectObject(select, -1, 1);

    //искать
    res=mapSetSiteSeekSelect(vMap->mapHandle(),site,select);
    if (res){
        //для контроля, сколько выбрано объектов
        int count=mapSeekSelectObjectCount(vMap->mapHandle(),select);
        QMessageBox::information(this,"Выбор",QString("Выбрано %1 объектов").arg(count));

        if (count) {
            //открыть диалог построения графа дорог
            TASKPARMEX param;
            param.Handle = (HWND)vMap->winId();
            param.Handle = (HWND)winId();

            HSITE gsite=onCreateNetDlg(vMap->mapHandle(),¶m);
        }
    }

    mapDeleteSelectContext(select);
}
Выделяет все 7387 объектов на нужном слое (в Панораме столько же), а вот граф строит по основной карте, огромный такой получается, никчемный.
vMap - это написанное на чистом mapapi отображение карты, аналог MapView.

Кстати, а как подсветить выделенные объекты?
Поскольку отображение карты я делаю сам в paintEvent своей функцией DrawContents и у меня там предусмотренна ссылка на выделенный и мигающий объект, который вызовом mapDrawImageMapObject отображается разными цветами.
Потом весь буфер вывожу через mapViewImageToXImage.
Получается надо все выделенные объекты занести в отдельный список и отобразить аналогично одиночно выделяемому в DrawContents ?
Или есть какая-то функция, которая выставит какой-нибудь флаг для этих объектов и они сами будут отображаться малиновым, как в Панораме?
Изменено: Валерий Парусов - 19.03.2025 06:54:28
 
Здравствуйте!

Функция onCreateNetDlg() использует для построения графа дорог основную карту.
Для построения графа по пользовательской карте можно воспользоваться одним из способов:
- ограничить поиск объектов определенной картой с помощью функции mapSetTotalSeekMapRule() (seekapi.h);
- временно открыть ее как основную и выполнить построение.
Дополнительно с описанием функций работы с графом дорог можно ознакомиться в документации:
https://gistoolkit.com/download/doc/gisdesignerw_prog.pdf#page=132
Код
 // Установить правило обобщенного поиска по картам
 // hMap     - идентификатор открытой карты,
 // number   - номер карты, по которой выполняется поиск,
 // если number == -1, поиск будет выполняться по всем картам
 // (0 - карта местности, 1...n - пользовательские карты)

_MAPIMP void _MAPAPI mapSetTotalSeekMapRule(HMAP hMap, long int number);

Одним из способов реализации рисования выделенных объектов может быть создание контекста поиска HSELECT с необходимым списком объектов и рисование выделения с помощью функции mapDrawImageSelect() (mapapiold.h).
Пример использования можно посмотреть в исходных текстах библиотеки компонентов (/usr/share/gisdesigner/examples/Sdk/qmapcomponents/qdmwina.cpp), поставляемых в составе ГИС Конструктор для Astra Linux.
 
Код
  // Отобразить выделение в буфере карты и образе экрана
  // hScreen  - идентификатор образа экрана
  // hMap     - идентификатор карты,
  // rect     - обновляемый фрагмент карты, задается в пикселах в
  //            системе координат полного изображения карты (PICTURE),
  // position - положение верхнего левого угла фрагмента в клиентской
  //            области окна карты (и образа экрана),
  // select   - идентификатор контекста выделения,
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapDrawImageSelect(HIMAGE image, HMAP hMap, const RECT* rect,
                                            const POINT* position, HSELECT select, COLORREF color, long int);
 
Спасибо, все получилось, граф дорог построил применив mapSetTotalSeekMapRule, в функцию отображения карты добавил mapDrawImageSelect

Есть ли функции, чтобы определить количество созданных отдельных графов (сетей), определить сколько вершин в каждом и т.п.?
Изменено: Валерий Парусов - 19.03.2025 18:37:52
 
Добрый день!

Для реализации получения информации о связных компонентах (сетях) графа дорог можно воспользоваться следующей последовательностью действий:
1. Определить отношение узла графа дорог к определенной сети с помощью анализа семантики "Номер сети".
2. Вычислить необходимую статистическую информацию о сетях на основе входящих в них узлов.

Перечень объектов и семантик классификаторов навигационных карт приведен в документе, доступном для скачивания на нашем сайте (https://gisinfo.ru/classifiers/classifiers.htm#navmaps).
Описание режима "Контроль графа дорог" с контролем связности из состава ГИС Панорама приведено в п. 8 "Контроль графа дорог" документа "Прикладные задачи. Граф дорог" (https://gistoolkit.com/download/doc/graphofroad.pdf).
 
Да я вобщем уже так и сделал.
 
Приложение у меня кросс-платформенное.
Непонятная работа mapDrawImageSelect в Windows и Astra.
Создаю контекст mapCreateSiteSelectContext и заполняю его объектами   mapSelectSampleByKey, потом контекст передаю в класс отображения карты.

В отображении карты есть такой код, который по таймеру мигает объектами:
Код
if (hSelect){
        POINT tempPoint;
        tempPoint.x = 0;
        tempPoint.y = 0;
        RECT r;
        r.left=VarHorzPos;
        r.right=VarHorzPos+cw;
        r.top=VarVertPos;
        r.bottom=VarVertPos+ch;

        if (colorState)
            mapDrawImageSelect(hScreen,hMap,&r,&tempPoint,hSelect,selColor1,1);
        else
            mapDrawImageSelect(hScreen,hMap,&r,&tempPoint,hSelect,selColor2,1);
    }
В Windows объекты мигают, а вот в Астре - нет.
Причем другой код, для списка HOBJ, мигает и там и там
Код
if (selObj.count()){
        //Подветить
        IMGLINE objectImage;
        memset(&objectImage, 0, sizeof(objectImage));

        PAINTPARM objectView;
        memset(&objectView, 0, sizeof(objectView));

        if (colorState)
            objectImage.Color = selColor1;
        else
            objectImage.Color = selColor2;

        objectImage.Thick = PIX2MKM(5);
        objectView.Parm = (char*) &objectImage;
        objectView.Mode = R2_COPYPEN;

        //Выделенный объект в буфер экрана
        for (int i=0; i<selObj.count(); i++){
            if (mapObjectLocal(selObj.at(i))!=LOCAL_LINE) objectView.Image = IMG_OBJECT;
            else objectView.Image = IMG_LINE;
            mapDrawImageMapObject(hScreen, hMap, &objectView, selObj.at(i));
        }
    }
Изменено: Валерий Парусов - 26.03.2025 09:05:18
 
Здравствуйте!

Для уточнения причины возникшей проблемы пришлите, пожалуйста, для анализа диагностический журнал работы приложения.
Для этого необходимо выполнить следующие действия:
- включить ведение журнала диагностики c помощью функции mapOpenDiagnostics() (mapapi.h);
- выполнить действие, приводящее к проблеме;
- отключить ведение журнала диагностики c помощью функции mapCloseDiagnostics() .
Сформированный файл пришлите, пожалуйста, нам на почту.

Код
  // Открыть запись в диагностический протокол
  // logname - путь к протоколу диагностической печати, если равен нулю,
  // то запись идет в \ProgramData\mapdiagnostics.log или /var/Panorama/
  // hideinfo - признак отключения выдачи информационных сообщений (MT_INFO)
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapOpenDiagnosticsEx(const WCHAR* logname, long int hideinfo);
_MAPIMP long int _MAPAPI mapOpenDiagnostics(const WCHAR* logname);

  // Закрыть запись в диагностический протокол
_MAPIMP void _MAPAPI mapCloseDiagnostics();

 
Мигает (список HOBJ) https://disk.yandex.ru/d/DAI5Amq5rQb5Og
Не мигает (hSelect)  https://disk.yandex.ru/d/rY2NkkRt6o5ivA
Изменено: Валерий Парусов - 26.03.2025 12:58:50
 
Добрый день!

Спасибо за предоставленную информацию! Проблему воспроизвели - выполним обновление ГИС Конструктор и сообщим о выходе новой версии в данной ветке форума.
 
и еще одна проблема выяснилась при преобразовании координат.
Создаю QDMapPoint:
Код
ppGeoToPicture = new QDMapPoint(this);
ppGeoToPicture->SetMapView(map);
ppGeoToPicture->SetPlaceIn(PP_GEO);
ppGeoToPicture->SetPlaceOut(PP_PICTURE);
Затем по факту приема GPS координат хочу отобразить кружок на этом месте, для чего перевожу координаты в пикселы:
Код
ppGeoToPicture->SetPoint(geoPosition.X,geoPosition.Y);
ppGeoToPicture->GetPoint(&x,&y);
Но вместо координат в пикселах возвращаются координаты в метрах.
проверил с помощью mapapi:
Код
double x=geoPosition.X;
double y=geoPosition.Y;

mapGeoToPlane(map->GetMapHandle(),&x,&y);
mapPlaneToPicture(map->GetMapHandle(),&x,&y);
Результат такой
Цитата
исходные координаты в GEO
0.9826908976268744
0.6664119909716875

--- mapapi ---
PLANE
7619181.2486137515
4250466.976860186

PICTURE
689424.0712353019
270448.22831044346

--- QDMapPoint ---
PP_GEO -> PP_PICTURE
7751696.205186002
3912660.749297778
То есть мало того, что в метрах возвращаются координаты, они еще и с mapapi не совпадают.
А почему?
В RadStudio XE10 аналогичное преобразование с TMapPoint адекватно проходит
Изменено: Валерий Парусов - 30.03.2025 07:16:41
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



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

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