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

Отрисовка окружности, зная радиус, центром которой является объект

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Отрисовка окружности, зная радиус, центром которой является объект, Нарисовать окружности на пользовательской карте, используя прилож. на GisToolKit Active 14
 
Доброго времени суток!
Стоит задача: во время отрисовки объектов из xml файла, объекты с определенным кодом классификатора нужно дополнять окружностью/окружностями с определенным радиусом, центром окружности будет объект.
Суть проблемы - функция mapAppendPointPlane отдает 0.
Если я чего-то не понимаю - прошу досконально пояснить, спасибо!
Компоненты и MAPAPI-вызовы в одной программе использую. Библиотека ocx в реестре есть.
Версия GTK Active - v.14.0.6.0 , версия библиотеки gis64acces.dll  - 14.3.3.1. Приложение .Net. Язык с++/cli.
Код
      [DllImport("gis32acces.dll", EntryPoint = "mapAppendPointPlane", CharSet = CharSet::Ansi, ExactSpelling = true, CallingConvention = CallingConvention::StdCall)]
      static long int mapAppendPointPlane(HOBJ info, double x, double y, long int subject);

                [DllImport("gis32acces.dll", EntryPoint = "mapObjectKey", CharSet = CharSet::Ansi, ExactSpelling = true, CallingConvention = CallingConvention::StdCall)]
      static long int mapObjectKey(HOBJ info);

      [DllImport("gis32acces.dll", EntryPoint = "mapCommitObject", CharSet = CharSet::Ansi, ExactSpelling = true, CallingConvention = CallingConvention::StdCall)]
      static long int mapCommitObject(HOBJ info);
//сигнатуры функций


                MapObj->Commit();
      MapObj->Repaint();//еще работа с другим объектом
      if (subStr2 == "2245")
      {
         long int centerObjectKey;
         centerObjectKey = MapObj->Key;
         long int radius = 7500;
         long int hCircle;
         hCircle  = MapObj->CreateObjectByExcode(1,//
            (int)axGisToolKit::TxMetricType::IDFLOAT2,//IDFLOAT2,
            Convert::ToInt64("2245"),//
            Convert::ToInt32("0"));
         //MapPoint->PlaceInp = axGisToolKit::TxPPLACE::PP_GEOWGS84;
      //   MapObj->Commit();
      //   MapObj->Repaint();
         for (int i = 0; i != 37; i++)
             {
               double k = System::Math::PI*i/36;
               mapAppendPointPlane(hCircle, mypoint->X + radius*System::Math::Sin(k), mypoint->Y + radius*System::Math::Cos(k), centerObjectKey);
             }
         long int KeyObject;
         KeyObject = mapObjectKey(hCircle);
         long int resCommit;
         resCommit = mapCommitObject(hCircle);
            // mapFreeObject(obj);
         long int mObjKey;
         mObjKey = MapObj->Key;

Изменено: Алесь Побожный - 08.09.2022 11:23:55
 
Метод axMapObj->CreateObjectByExcode возвращает значение типа int, то есть 4 байта.
В приложениях x32 идентификатор созданного в памяти объекта (Handle) тоже 4 байта, а вот в приложениях x64 он будет равен размеру указателя, то есть 8 байт.
Поэтому возвращаемое int-значение лучше не использовать в качестве идентификатора объекта, а запросить его отдельно из свойства axMapObj->ObjHandle.
Тип данных для hCircle также должен быть платформо-зависимым (в x32 - 4 байта, в x64 - 8 байт).
Описание прототипов API функций также должны использовать платформо-зависимые типы данных для HMAP, HSITE, HOBJ и прочих "хэндлов"  (в x32 - 4 байта, в x64 - 8 байт).

Не понятна вот эта строчка
Convert::ToInt64("2245")
все параметры CreateObjectByExcode - integer (то есть 4 байта), зачем преобразование в Int64?

По тексту не ясно, что за объект mypoint. Значение X и Y на выход должны отдаваться в метрах на местности, так как именно метры принимает функция mapAppendPointPlane.

У вас есть путаница при использовании компонентов и MAPAPI.
Если Вы создаете объект в компоненте, то и сохранять его лучше в методом компонента, так как компонент не всегда узнает, что Вы выполнили с объектом на который он настроен, минуя его - вызовами MAPAPI в ГИС-ядре.

Уникальный номер нового объекта будет ненулевым только после его сохранения на карту (mapObjectKey).


Вот грубый пример нанесения окружности с центром в точке Center и радиусом radius
Желательно добавить проверку кодов возврата...

Код
    DOUBLEPOINT point1;
    // так как это круг - берем просто вертикально вниз до радиуса
    point1.x = Center.X - radius;
    point1.y = Center.Y;

    HOBJ obj = mapCreateObject(hTempSite);
    mapRegisterObject(obj, arcCode, LOCAL_SQUARE);

    mapCreateArc(hTempSite, obj, &point1, &Center, &point1, radius);
    mapCommitObject(obj);
Страницы: 1
Читают тему (гостей: 1)



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

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