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

Получение граничных точек отображаемой области карты

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Получение граничных точек отображаемой области карты
 
Здравствуйте. Возникла задача определить, лежит ли координатная точка на видимой области карты (там, где есть отображение, а не серый фон).
Надеюсь на Вашу помощь
Использую ГИС  Конструктор для Qt Designer x64 (версия 12, Qt 4, Qt 5, ОС "Astra Linux  Special Edition", релиз "Смоленск", для платформы "x64")
Изменено: Дмитрий Гусаков - 03.07.2018 16:40:05
 
Рамка карты всегда включает в себя серый фон по краям.
Но вы можете пройтись по всем листам векторной карты, и проверять точку на вхождение в габариты листа карты.


P.S. Я не сотрудник КБ "Панорама", это не официальный ответ.
 
Цитата
Владимир Егоров написал:
Рамка карты всегда включает в себя серый фон по краям.
Но вы можете пройтись по всем листам векторной карты, и проверять точку на вхождение в габариты листа карты.


P.S. Я не сотрудник КБ "Панорама", это не официальный ответ.
Да, я понимаю, что каждая карта содержит так же область, на которой нет отображения (серый фон), но мне необходимо определить, что точка попадает не на серый фон, а именно на область карты.
В крайнем случае можно ли получить полигон данной карты, не RegionRect?
 
Не знаю, может и можно.

Ещё раз повторюсь, если мы говорим о многолистовой векторной карте (MAP), то вы можете получить список листов данной карты, а у каждого листа карты есть габариты:

Код
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// +++++  ФОРМУЛЯР ЛИСТА ЭЛЕКТРОННОЙ КАРТЫ  ++++++++++++++++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++

typedef struct LISTREGISTER
{
  int         Length                 ;  // Размер данной структуры (544)
  char        Nomenclature[32]       ;  // Номенклатура листа
  char        ListName[32]           ;  // Название листа
  char        FileName[260]          ;  // Имя файла по которому в районе будет
                                        // создан лист с данным именем
                                        // и расширениями HDR, DAT, SEM, DRW

  // Прямоугольные координаты листа в метрах
  double      XSouthWest             ;  // X ю-з
  double      YSouthWest             ;  // Y ю-з
  double      XNorthWest             ;  // X с-з
  double      YNorthWest             ;  // Y с-з
  double      XNorthEast             ;  // X с-в
  double      YNorthEast             ;  // Y с-в
  double      XSouthEast             ;  // X ю-в
  double      YSouthEast             ;  // Y ю-в

  // Геодезические координаты листа в радианах
  double      BSouthWestCoordinate   ;  // B ю-з
  double      LSouthWestCoordinate   ;  // L ю-з
  double      BNorthWestCoordinate   ;  // B с-з
  double      LNorthWestCoordinate   ;  // L с-з
  double      BNorthEastCoordinate   ;  // B с-в
  double      LNorthEastCoordinate   ;  // L с-в
  double      BSouthEastCoordinate   ;  // B ю-в
  double      LSouthEastCoordinate   ;  // L ю-в

  int         MaterialKind           ;  // Вид исходного материала
  int         MaterialType           ;  // Тип ИКМ
  int         ReliefHeight           ;  // Высота сечения рельефа в дециметрах
  char        Date[12]               ;  // Дата съемки "ГГГГММДД" (YYYYMMDD)

  double      MagneticAngle          ;  // Магнитное склонение
  double      YearMagneticAngle      ;  // Годовое магнитное склонение
  double      MeridianAngle          ;  // Среднее сближение меридианов
  char        DateAngle[12]          ;  // Дата склонения "ГГГГММДД" (YYYYMMDD)

  unsigned int UpdateDate            ;  // Дата обновления листа в виде числа YYYYMMDD по Гринвичу
  unsigned int UpdateTime            ;  // Время обновления листа в виде числа - секунды с 0 часов по Гринвичу
  int         HeightSystem           ;  // Система высот листа (может отличаться от системы высот района)
  char        Reserve[16]            ;  // = 0
}
  LISTREGISTER;

То есть для каждого листа карты вы можете получить его габариты (геодезические или плоские прямоугольные координаты), и уже по листам проверять.

Количество листов в карте:
Код
 // Запросить общее число листов в районе
 // hmap - идентификатор открытых данных
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetListCount(HMAP hmap);
Получить паспорт карты и некоторый лист карты:
Код
  // Запросить паспортные данные векторной карты
  // Структуры MAPREGISTER и LISTREGISTER описаны в mapcreat.h
  // hmap - идентификатор открытых данных
  // sheetnumber - номер листа карты для
  // которого запрашиваются паспортные данные
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetMapInfo(HMAP hmap, long int sheetnumber,
                                       MAPREGISTER *map, LISTREGISTER *sheet);
_MAPIMP long int _MAPAPI mapGetMapInfoEx(HMAP hmap, long int sheetnumber,
                                         MAPREGISTEREX *map, LISTREGISTER *sheet);
_MAPIMP long int _MAPAPI mapGetMapInfoPro(HMAP hmap, long int sheetnumber,
                                          MAPREGISTEREX *map, LISTREGISTER *sheet,
                                          SHEETNAMES * sheetnames);         // 07/11/14
Изменено: Владимир Егоров - 03.07.2018 14:05:34
 
Извиняюсь, если неясно выражаюсь, для этого приведу в пример изображение.
На нём изображено 2 точки, указанными стрелками.
Верхняя точка не лежит на карте, т.к. она выступает за границу и лежит на сером фоне, хотя она и входит в RegionRect.
Можно ли как то получить значение того, что точка лежит на отображаемой части карты или нет?
 
Здравствуйте!

Вы можете проверить, принадлежит ли точка с заданными координатами какому-либо объекту, с помощью функции mapWhatObject (seekapi.h):
Код
 // Поиск объектов в окрестности точки, заданной прямоугольной рамкой
 // Применяется для выбора объекта при нажатии левой кнопки мыши на карте
 // hMap - идентификатор открытой карты.
 // info - идентификатор объекта в памяти,
 //        предварительно созданного функцией mapCreateObject()
 //        или mapCreateSiteObject(),
 //        в котором будет размещен результат поиска.
 // frame - прямоугольная область поиска объекта в системе координат,
 //         заданной переменной place (PP_PLANE,PP_GEO, ...)
 // Координаты области пересчитываются в пикселы в текущем масштабе
 // отображения. В список выбранных могут попасть объекты, которые
 // отображаются в текущем масштабе рядом с областью выбора в
 // пределах нескольких пикселов.
 // Площадные объекты выбираются в пределах рамки
 // размером 512х512 пикселов в текущем масштабе изображения
 // flag - порядок поиска объектов (WO_FIRST, WO_NEXT...)
 // Выбор объекта в "точке" лучше начинать с последнего, то
 // есть того, что нарисован поверх остальных (это чуть медленнее
 // прямого поиска)
 // При поиске с флажками WO_NEXT,WO_BACK параметр info должен
 // содержать результат предыдущего поиска.
 // Поиск выполнется среди тех объектов,которые видны на экране,
 // если не установлен флаг WO_VISUALIGNORE
 // place - система координат
 // hPaint - идентификатор контекста отображения для многопоточного вызова функции отображения,
 // создается функцией mapCreatePaintControl
 // Если объект не найден - возвращает ноль,
 // иначе - возвращает значение info !

_MAPIMP HOBJ _MAPAPI mapWhatObject(HMAP hMap, HOBJ info, MAPDFRAME *frame,
                                   long int flag, long int place);

_MAPIMP HOBJ _MAPAPI mapWhatObjectEx(HMAP hMap, HOBJ info, MAPDFRAME *frame,
                                     long int flag, long int place, HPAINT hPaint);
Страницы: 1
Читают тему (гостей: 1)



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

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