А есть ли возможность добавить к объекту подпись (на пользовательских слоях)? В виде отдельного объекта или семантики.
Я сейчас умею создавать объекты типа подпись на пользовательской карте, но чтоб использовать данные объекты как подпись к другим объектам, понадобится вычислять координаты точки, куда эту подпись помещать, и при изменении масштаба подпись будет уезжать (наверное, я не пробовал ещё). А хотелось бы иметь возможность добавить подпись (над или под объектом, с смещением, скажем, в 5 пикселей) с привязкой к объекту, и чтобы подпись при изменении масштаба была привязана к объекту (к рамке объекта, например). То как я сейчас рисую текст с помощью подписей на пользовательских картах:
Код
HMAP hmap = panorama::mapOpenWMS(MAP_PATH);
if (hmap == 0){
std::cerr << "can not open map" << MAP_PATH;
return 1;
}
HSITE site = panorama::mapCreateAndAppendTempSite(hmap, RSC_PATH);
if (site == 0){
std::cerr << "can not create temp sit" << std::endl;
return 1;
}
DFRAME mapFrame;
rc = panorama::mapGetTotalBorder(hmap, &mapFrame, panorama::PP_GEO);
if (rc == 0){
std::cerr << "can not get frame of map" << std::endl;
return 1;
}else{
std::cerr << "total border in geo: X1:" << ::gis::coord::common::radian2degree(mapFrame.X1)
<< " X2:" << ::gis::coord::common::radian2degree(mapFrame.X2)
<< " Y1:" << ::gis::coord::common::radian2degree(mapFrame.Y1)
<< " Y2:" << ::gis::coord::common::radian2degree(mapFrame.Y2)
<< std::endl;
}
double centerB = (mapFrame.X1 + mapFrame.X2)/2.0;
double centerL = (mapFrame.Y1 + mapFrame.Y2)/2.0;
HOBJ textObj = mapCreateSiteObject(hmap, site);
if (textObj == 0){
std::cerr << "can not create object text on temp site" << std::endl;
return 1;
}
rc = panorama::mapRegisterObjectByKey(textObj, TEXT_SIGN_KEY);
if (rc == 0){
std::cerr << "can not register text object by key" << std::endl;
return 1;
}
rc =mapAppendPointGeo(textObj, centerB, centerL);
if (rc == 0){
std::cerr << "can not append point to object Text" << std::endl;
return 1;
}
QString text = " Hello world мир";
QByteArray koi8r = ::gis::common::convertStringToKOI8_R(text);
rc = panorama::mapPutText(textObj, koi8r.constData(), 0);
if (rc == 0){
std::cerr << "can not put text to text object" << std::endl;
return 1;
}
mapCommitObject(textObj);
mapFreeObject(textObj);
drawToFile(hmap, "map.png", 600, 200);
mapCloseData(hmap);
P.S. я пытался найти на форуме, но попадались только темы про настольные приложения ГИС Карта и задачи автоматического построения объектов по семантике или типа того.
P.P.S. нашёл несколько тем(одна из них), но как-то понятнее не стало =( Видимо, только вручную поддерживать объект подпись рядом с объектом к которому он относится, либо использовать редактор классификатора (нам не подходит, у нас нет операторов, работающих с картой)
Можно выравнивание использовать (для точечных объектов). В качестве точки метрики подписи отдавать точку метрики объекта, а выравнивание выставлять горизонтальное по центру, а вертикальное - по верхней линии:
Код
rc = panorama::mapPutTextVerticalAlign(textObj, FA_TOP, 0);
if (rc != FA_TOP){
std::cerr << "can not put vertical align to text object" << std::endl;
return 1;
}
rc = panorama::mapPutTextHorizontalAlign(textObj, FA_CENTER, 0);
if (rc != FA_RIGHT){
std::cerr << "can not put horizontal align to text object" << std::endl;
}
Но это подойдёт только если знак рисуется вверх от первой точки метрики. Знак может быть векторным, например, и рисоваться вокруг первой точки метрики (какой-нибудь круглый знак).