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

Проблемы с нарезкой объекта при mapCommitWithPlace

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Проблемы с нарезкой объекта при mapCommitWithPlace
 
Здравствуйте, возникла проблема при использовании mapCommitWithPlace в 12й версии тулкита. Далее по порядку:

1. Открываем первый sit файл через
mapOpenAnyData(pszFilePath, GENERIC_READ | GENERIC_WRITE, &iError);

2. Открываем еще n sit файлов через
mapOpenSiteForMapUn(hMap, pszFilePath, GENERIC_READ | GENERIC_WRITE);
где hMap = возвращаемому вызовом в п.1 значению

3. Как-либо модифицируем метрику объекта / создаем новый, а в конце вызываем
mapCommitWithPlace(hNewObj);

При использовании gislib11 (первоначально разработка велась с ней) все работало корректно - при перемещении объекта таким образом, что часть объекта залезала на территорию одного сита, а часть на территорию другого - он распиливался на границе на 2 части и каждая часть добавлялась на свой сит.
Сейчас купили GISToolActive12Free и соответственно перешли на gislib12, и теперь остается только часть объекта, а вторая половина пропадает.
Пока нет идей в какую сторону думать, может кто-нибудь подскажет?  
 
Логика нарезки объекта по листам в версии 12 такая же, как в версии 11.
Если объект целиком попадает в лист (карту), то для других карт проверка не выполняется.
Если карта не ограничена рамкой (свойство установлено в паспорте карты), то нарезка не выполняется - объект сохраняется целиком
или карта пропускается при проверке (если она не первая в нарезке).

Если у Вас программа работает иначе, то просим прислать пример данных и фрагмент программы, сохраняющей объект,
и указать версию библиотек (название и дату файла, например).
 
Во вложении данные, на которых тестируется проблема.

11 версия, с ней работает как ожидается:
Линковка с gisacces.lib.
Версия, судя по подписи gisacces.dll, 11.13.12.23

12 версия, с ней другое поведение:
Линковка с gisuacces.lib (у gisuacces.dll подпись 12.5.2.16)  и libgislink12x32.lib


Приведу фрагмент тестового кода добавления нового объекта (с перемещением объектов те же проблемы):

Код
//...
std::vector<CIC_Point3DD>& vPoints = sxfLayer.GetCurrentSelectionVector();
/********************************************************
   Метод для создания произвольного объекта на пользовательской карте*
********************************************************/
auto CreateObject = [&]()->bool
{
   //0.Ищем куда мы попали
   CIC_Rect3DD siteRect, polyRect;
   CSXFLayer::CSITE* targetSite = NULL;
            
   auto minmaxX = std::minmax_element(vPoints.begin(), vPoints.end(), [](CIC_Point3DD & pt, CIC_Point3DD & pt2){ return pt.x < pt2.x; });
   auto minmaxY = std::minmax_element(vPoints.begin(), vPoints.end(), [](CIC_Point3DD & pt, CIC_Point3DD & pt2){ return pt.y < pt2.y; });
            
   polyRect.SetRect(minmaxX.first->x, minmaxY.second->y, minmaxX.second->x, minmaxY.first->y);
   polyRect.NormalizeGeoRect();
      
   //Работаем только с sits у которых классификатор "Errors"
   std::vector<CSXFLayer::CSITE*> vErrorsSites = GetErrorsSites(&sxfLayer);

   auto sitesIter = vErrorsSites.begin();
   auto alternativeSite = vErrorsSites.end();

   for(; sitesIter != vErrorsSites.end(); ++sitesIter)
   {
      (*sitesIter)->GetBoundRect(siteRect);
      if(siteRect.RectInRectGeo(&polyRect))
         break;
      if(siteRect.IntersectGeoRect(&siteRect,&polyRect))
      {
         if(alternativeSite == vErrorsSites.end())
            alternativeSite = sitesIter;
         else
         {
            CIC_Rect3DD currentAlternativeRect;
            (*alternativeSite)->GetBoundRect(currentAlternativeRect);
            currentAlternativeRect.IntersectGeoRect(¤tAlternativeRect, &polyRect);
            if(siteRect.GetSquare() > currentAlternativeRect.GetSquare())
               alternativeSite = sitesIter;
         }
      }      
   }
   HMAP targetHmap;
   HSITE targetHsite;

   if(sitesIter != vErrorsSites.end())
   {
      targetHmap = (*sitesIter)->GetMap();
      targetHsite = (*sitesIter)->GetSite();
   }
   else if(alternativeSite != vErrorsSites.end())
   {
      targetHmap = (*alternativeSite)->GetMap();
      targetHsite = (*alternativeSite)->GetSite();
   }
   else
   {
      ASSERT(0);
      return false;
   }

   //1.Cоздать пустой объект пользовательской карты
   HOBJ hNewObj = mapCreateSiteObject(targetHmap, targetHsite);
   if(hNewObj)
   {
      //2.Добавить метрику
      for(size_t i = 0; i < vPoints.size(); ++i)
         mapAppendPointPlane3D(hNewObj, vPoints.at(i).y, vPoints.at(i).x, vPoints.at(i).z);


      //3.Сформировать описание нового объекта
      mapRegisterObject(hNewObj, pObjInfo->m_rscObjectInfo.Code, pObjInfo->m_rscObjectInfo.Local);
         
      //Добавить текст подписи если это соответствующий тип
      if(pObjInfo->m_rscObjectInfo.Local == LOCAL_TITLE)
      {
#ifdef UNICODE
         mapPutTextUnicode(hNewObj, pObjInfo->m_sTitleLabel.GetString(), 0);
#else
         mapPutText(hNewObj, pObjInfo->m_sTitleLabel.GetString(), 0);
#endif
            
         //Если в метрике одна точка - посчитать вторую 
         if(vPoints.size() == 1)
         {
            double dLenghtInMicrons = mapGetTextLengthMkm(hNewObj, 0);
            double dMapScale = mapGetMapScale(targetHmap) /  1000000.;
   
            double dLength = dLenghtInMicrons * dMapScale;

            CIC_Point3DD secondP(vPoints.at(0));
            secondP.x += dLength;//TODO(optional): подумать о работе с углами 
            mapAppendPointPlane3D(hNewObj, secondP.y, secondP.x, secondP.z);
         }
      }

      //4.Добавить семантики
      std::vector<CMapObjectData::SEM_VARIANT> vSemantics = pObjInfo->GetSemantics();
      for_each(vSemantics.begin(), vSemantics.end(), [&] (const CMapObjectData::SEM_VARIANT& semantic)
      {
         switch(semantic.m_storedType)
         {
         case CMapObjectData::SEM_VARIANT::SEM_TYPE_DOUBLE:
            mapAppendSemanticDouble(hNewObj, semantic.m_iSemCode, semantic.m_value.doubleValue);
            break;

         case CMapObjectData::SEM_VARIANT::SEM_TYPE_LONG:
            mapAppendSemanticLong(hNewObj, semantic.m_iSemCode, semantic.m_value.longValue);
            break;

         case CMapObjectData::SEM_VARIANT::SEM_TYPE_STR:
#ifdef  UNICODE
            mapAppendSemanticUnicode(hNewObj, semantic.m_iSemCode, semantic.m_value.strValue, _tcslen(semantic.m_value.strValue));
#else
            mapAppendSemantic(hNewObj, semantic.m_iSemCode, semantic.m_value.strValue, _tcslen(semantic.m_value.strValue));
#endif
            break;
         default: ASSERT(0);
         }
      });

      //5.Сommit в карту
      mapCommitWithPlace(hNewObj);

      //6.Освободить память
      mapFreeObject(hNewObj);
   }
   else
      return false;

   return true;
};

 
Спасибо за информацию!
Есть ошибочка. Обновим в новой версии библиотек в ближайшее время.
 
Спасибо!
Не могли бы Вы отписаться в этой ветке по готовности?
Страницы: 1
Читают тему (гостей: 1)



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

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