Отрисовка окружности, зная радиус, центром которой является объект, Нарисовать окружности на пользовательской карте, используя прилож. на 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;
Метод 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);