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

Илья Аникин (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Илья Аникин
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 След.
Не рисуются некоторые знаки классификатора operator.rsc
 
Здравствуйте.
Используем ГИС Конструктор 13.0.0.5 под AstraLinux 1.6.
При отрисовке некоторых знаков из классифкатора operator.rsc на карте ничего не отображается.
Рисуем так:
[CODE] HSITE hTest = mapCreateAndAppendTempSite( mapview->h_gd, PATH_RSC_OPERATOR );

   HOBJ hObj;
   //брдм
   hObj = mapCreateSiteObject(mapview->h_gd, hTest);
   mapRegisterObject(hObj,112010330,LOCAL_VECTOR);
   mapAppendPointPlane(hObj, 5021973, 6461544);
   mapAppendPointPlane(hObj, 5021973, 6461644);
   mapCommit(hObj);
   mapFreeObject(hObj);

   //страшина
   hObj = mapCreateSiteObject(mapview->h_gd, hTest);
   mapRegisterObject(hObj,111010436,LOCAL_VECTOR);
   mapAppendPointPlane(hObj, 5023973, 6461544);
   mapAppendPointPlane(hObj, 5023973, 6461644);
   mapCommit(hObj);
   mapFreeObject(hObj);
[/CODE]
[URL=https://hostingkartinok.com/show-image.php?id=9f08ff4b303c84003ef4520168808c2f]Результат[/URL].


Здесь в месте, куда указывает стрелка, должен быть знак "Старшина". Таких нерисующихся знаков десятки.
Поиск составной линии пересечения площадных объектов
 
Хорошо, проверим, есть ли ошибка в логике

Для проверки модифицируем функцию таким образом, чтобы из кода рисовался тестовый полигон, который будет пересекать круг.

Легенда:
- Красный - секущий круг
- Красный пунктир - линии пересечения
- Полигон с синими границами - тестовый полигон

[CODE]void getTestLineCrossCircle(MapView *mapview_)
{
   //имитация береговой черты
   HOBJ hPolygon = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);
   mapRegisterObject(hPolygon,131044100,LOCAL_SQUARE);
   mapAppendPointPlane(hPolygon,5110074, 6375971);
   mapAppendPointPlane(hPolygon,5159727, 6387064);
   mapAppendPointPlane(hPolygon,5129354, 6404760);
   mapAppendPointPlane(hPolygon,5147050, 6452300);
   mapAppendPointPlane(hPolygon,5103207, 6464185);
   mapAppendPointPlane(hPolygon,5119318, 6516480);
   mapAppendPointPlane(hPolygon,5072041, 6487691);
   mapAppendPointPlane(hPolygon,5110074, 6375971);
   mapCommit(hPolygon);
   mapFreeObject(hPolygon);

   //секущий круг
   HOBJ hCircle;
   hCircle = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);
   mapRegisterObject(hCircle,201053200,LOCAL_SQUARE);
   DOUBLEPOINT altCenter;
   altCenter.X = 5045102;  altCenter.Y = 6399477;
   mapBuildEllpse( hCircle, &altCenter/*&dpos*/, 100000/*radius*/, 100000/*radius*/, 0, 100);
   mapAppendPointPlane(hCircle, mapXPlane( hCircle, 1 ), mapYPlane( hCircle, 1 ));

   //объект для сохранения линий пересечения
   HOBJ hLand = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);
   mapRegisterObject(hLand, 221054733,LOCAL_LINE);

   int excode(0);
   int flag = WO_FIRST;
   HOBJ hObj = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);

   HSELECT select = mapCreateSiteSelectContext( mapview_->h_gd, mapview_->taskCoord ); //селект содержит все нарисованные элементы слоя
   mapSelectLocal( select, -1, 0);             //блок всех локализаций
   mapSelectLocal( select, LOCAL_SQUARE, 1);     //выбираем площадные объекты

   while(mapSeekSelectObject(mapview_->h_gd, hObj, select, flag))
   {
       flag = WO_NEXT;

       if(hObj)
       {
           excode = mapObjectExcode(hObj);

           if(excode == /*131044100*/31110000)    //131044100 - корона, 31110000 - океаны и моря
           {
               //пересечение
               HCROSS hCross = mapCreateObjectsCross( hCircle, hObj, LOCAL_LINE, 0);

               if (hCross) //0 если нет пересечения или если ошибка
               {
                   HOBJ hIntersect = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);
                   mapRegisterObject(hIntersect, 221054733,LOCAL_LINE);


                   while( mapGetNextCross( hCross, hIntersect) ) //0 если ошибки
                   {
                       int cnt = mapPointCount( hIntersect, 0 );
                       if( cnt )
                       {
                           int subject(0);
                           if( mapPointCount( hLand, 0 ) ) subject = mapCreateSubject( hLand );    //если метрика объекта занята - создаем подобъект

                           for( int i = 1; i <= cnt; i++ )
                               mapAppendPointPlane( hLand, mapXPlane( hIntersect, i ), mapYPlane( hIntersect, i ), subject );
                       }
                   }
                   mapFreeObject( hIntersect );
               }
               mapFreeObjectsCross( hCross );
           }
       }
   }

   mapDeleteSelectContext( select );
   mapCommit( hLand );
   mapFreeObject( hLand );

//    mapDeleteObject(hCircle);
   mapCommit( hCircle );
   mapFreeObject(hCircle);
   mapFreeObject( hObj );

   mapview_->dmap->UpdatePictureBorder();
}
[/CODE]В [URL=https://hostingkartinok.com/show-image.php?id=6d9a778d2dc88c7e24c1860144d9fd71]результате выполнения этого кода[/URL] получим 3 линии пересечения, как и должно быть.

Далее, раскомментируем второй excode в строке:
[CODE]if(excode == /*131044100*/31110000) //131044100 - корона, 31110000 - океаны и моря[/CODE]В этом случае в качестве объекта, который режут, выступает полигон "Океаны и моря". В [URL=https://hostingkartinok.com/show-image.php?id=9bad0b29e40a535d33945e51a0137db4]результате получаем[/URL] только одну линию пересечения, хотя очевидно, что должна быть как минимум вторая в правом нижнем углу. Очевидно потому, что этот объект "Океаны и моря" [URL=https://hostingkartinok.com/show-image.php?id=0283908273597d67d234b6a5706c3c71]выглядит вот так[/URL], если выделить его (QDMapView::SetObjSelected()).

Возможно, причина  - сложность полигона "Океаны и моря", он имеет полости, [URL=https://hostingkartinok.com/show-image.php?id=d3294afbebeb6421bf37756f4ce4312f]как видно на картинке[/URL].
Как бы то ни было, мне нужно получить все линии пересечения.
Поиск составной линии пересечения площадных объектов
 
Oleg Belenkov,если честно, понятней не стало. У меня, насколько я могу судить, написано тоже самое.
Окружность пересекает ломанную в нескольких местах, это видно глазами. Но при этом
[CODE]while (mapGetNextCross(hcross, hobj) != 0)[/CODE]после первого прохода возвращает 0.

Переформулирую вопрос: что не так в коде, который привел я?
Поиск составной линии пересечения площадных объектов
 
Здравствуйте.
Используем ГИС Конструктор 13.0.0.5 под AstraLinux 1.6.
Необходимо определить береговую черту в заданном радиусе. Для этого строю площадной объект hCircle (красный круг), и ищу для него линии пересечения с объектами "Океаны и моря". Линии пересечения копируются в hLand.

[CODE]while(mapWhatObjectBySelect(h_gd, hObj, &frame, select, flag, PP_PLANE ))
   {
       flag = WO_NEXT;

       if(hObj)
       {
           excode = mapObjectExcode(hObj);

           if(excode == 31110000 )    //океаны и моря
           {
               //пересечение
               HCROSS hCross = mapCreateObjectsCross( hCircle, hObj, LOCAL_LINE, 0);

               if (hCross) //0 если нет пересечения или если ошибка
               {
                   HOBJ hIntersect = mapCreateSiteObject(h_gd, taskCoord);
                   mapRegisterObject(hIntersect, 221054733,LOCAL_LINE);

                   while( mapGetNextCross( hCross, hIntersect) ) //0 если ошибки
                   {
                       int cnt = mapPointCount( hIntersect, 0 );
                       if( cnt )
                       {
                           int subject(0);
                           if( mapPointCount( hLand, 0 ) ) subject = mapCreateSubject( hLand );    //если метрика объекта занята - создаем подобъект

                           for( int i = 1; i <= cnt; i++ )
                               mapAppendPointPlane( hLand, mapXPlane( hIntersect, i ), mapYPlane( hIntersect, i ), subject );
                       }
                   }
                   mapFreeObject( hIntersect );
               }
               mapFreeObjectsCross( hCross );
           }
       }
   }
[/CODE]
Предполагается, что в случае, когда hCircle пересекает один объект в нескольких местах, за счет while(...) мы обрабатываем их все. Но на практике [URL=https://hostingkartinok.com/show-image.php?id=9b01cc300a383ac6bd226a124a8a8fff]обрабатывается только первое пересечение[/URL], а для следующего mapGetNextCross() возвращает 0.

Как получить все линии пересечения?
Отображение рамки карты(map) на другой карте(map)
 
[QUOTE]Oleg Belenkov написал:

Дело в том, что угловые точки рамки на конической проекции расположены далеко от основной территории карты и после пересчета,
соединенные прямыми линиями не отражают реальное размещение карты. Это не проблема пересчета. Нужно заменить прямые линии на ломаные.[/QUOTE]

Так и есть, добавил 5 промежуточных точек на каждую сторону рамки, и теперь рисуется вполне себе [URL=https://i.yapx.ru/NdkRA.png]правдоподобно[/URL], спасибо за помощь!
Отображение рамки карты(map) на другой карте(map)
 
[QUOTE]Oleg Belenkov написал:
Фоновая карта может иметь ошибочные параметры проекции.[/QUOTE]
Взял другую фоновую карту, карту мира, с параметрами:
Система координат - не определно(-1)
Проекция - Цилиндрическая специальная для бланковой карты
Тип карты - Бланковка (Цилиндрическая на эллипсоиде Красовского)

На ней рамка той же карты России выглядит [URL=https://i.yapx.ru/NaZcZ.png]примерно так же[/URL].
Как проверить, имеет ли карта ошибочные параметры проекции?
Отображение рамки карты(map) на другой карте(map)
 
[QUOTE]Oleg Belenkov написал:
Для этого нужно добавить пересчет -
[CODE] mapGeoToGeoWGS843D(hm_, listreg.BNorthWestCoordinate,listreg.LNorthWestCoordinate, 0);
mapAppendPointGeoWGS84(hObj, listreg.BNorthWestCoordinate,listreg.LNorthWestCoordinate, 0);... [/CODE] [/QUOTE]

Добавил пересчет, результат визуально такой же. [URL=https://i.yapx.ru/NZXed.png]В этом примере[/URL] в качестве района используется карта Россия 1:1000000, которую мы у вас приобретали. Видно, что рамка находится сильно южнее, чем должна.
Отображение рамки карты(map) на другой карте(map)
 
Здравствуйте.
Используем ГИС Конструктор 13.0.0.5 под AstraLinux 1.6
Есть открытая карта - набор листов map( назовем ее "подложка" ). Задача - отобразить рамку, описывающую листы другой карты map (назовем ее "район").

"Район" открываем
[CODE]mapOpenData()[/CODE]Далее, запрашиваем данные по карте и первому листу функциями
[CODE]MAPREGISTEREX mapregx;
memset(&mapregx, 0, sizeof(MAPREGISTEREX) );

LISTREGISTER listreg;
memset(&listreg, 0, sizeof(LISTREGISTER) );

mapGetMapInfoEx(hm_, 1, &mapregx, &listreg);
[/CODE]И далее обводим каждый лист "района" рамкой, запрашивая геодезические координаты углов из структуры LISTREGISTER
[CODE]mapAppendPointGeoWGS84( hObj, listreg.BNorthWestCoordinate,listreg.LNorthWestCoordinate, 0);
mapAppendPointGeoWGS84( hObj, listreg.BNorthEastCoordinate,listreg.LNorthEastCoordinate, 0);
mapAppendPointGeoWGS84( hObj, listreg.BSouthEastCoordinate,listreg.LSouthEastCoordinate, 0);
mapAppendPointGeoWGS84( hObj, listreg.BSouthWestCoordinate,listreg.LSouthWestCoordinate, 0);
mapAppendPointGeoWGS84( hObj, listreg.BNorthWestCoordinate,listreg.LNorthWestCoordinate, 0);
[/CODE]
Для большей части тестового картоматериала это работает хорошо, но есть некоторые районы, для которых рамка получается искаженной.

Параметры "подложки" из структуры MAPREGISTERE
Система координат - СК-42
Вид эллипсоида - Красовский
Проекция - Гаусса-Крюгера
Тип карты - Топографическая

Параметры "района", рамка которого отображается с искажениями:
Система координат - Прямоугольная условная для обзорных карт
Вид эллипсоида - Красовский
Проекция - Коническая
Тип карты - Обзорно-географическая

Правильно ли я понимаю, что для таких "районов" требуется выполнить преобразование координат и каким образом это можно сделать?
Поворот векторных знаков
 
Хоть тема и старая, думаю, уместно будет задать этот вопрос здесь.
Возможно ли зеркальное рисование таких векторных знаков, у которых нет признака зеркальности в
[CODE]char Mirror
[/CODE]?
Получение изображения объекта из классификатора с учетом семантик, Получение изображения объекта из классификатора с учетом семантик, которые могут влиять на его отображение
 
[QUOTE]Oleg Belenkov написал:
Примеры формирования есть в коде IMLAPI (см. sdk13.zip\imlapi)s57navy\imlmain.cpp  Код_IMLIMP long int _IMLAPI imlPaintExampleEx(long int type, const IMGDRAW * parm, const IMGCONTEXT * context,
                                          HRSC hrsc, const char * semantic)
  ...
  POLYDATAEX  data;

                              // Ident    Length    Code  Type Scale  Value
  unsigned char Semantic[] = { 0xFF, 0x7F,  16, 0,  136, 0,  2,   0,   100, 0, 137, 0,  2,   0,   170, 0};

  data.Semantic   = (char*)semantic;[/QUOTE]
Насколько я понял, в вашем пример берется конкретная семнатика { 0xFF, 0x7F,  16... }. Откуда мне взять все эти циферки для семантики, которая интересует меня "Гос. принадлежность" код 1300?
Страницы: 1 2 3 4 5 6 7 След.



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

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