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

Определение нахождения точки внутри площадного объекта

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Определение нахождения точки внутри площадного объекта
 
Здравствуйте!
Есть площадной объект с подобъектами (дырами). Мне нужно определить факт нахождения/ненахождения точки внутри. Вижу несколько способов, как это сделать. Помогите, пожалуйста, выбрать наиболее правильный.
Какая функция будет это делать наиболее быстро?  
 
Воспользуйтесь функцией mapCheckInsidePoint

Код
// Определить взаиморасположение замкнутого объекта и точки
// info - идентификатор объекта,
// subject - номер объекта(0) или подобъекта,
// point - координаты проверяемой точки в метрах.
// Возвращает: 1 - точка внутри объекта(подобъекта),
// 2 - точка за пределами объекта(подобъекта),
// 3 - точка совпадает с точкой метрики,
// 4 - точка лежит на отрезке.
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapCheckInsidePoint(HOBJ info, int subject,
DOUBLEPOINT *point);
 
Чтобы получить искомое, мне придется проверить сам объект, а затем пройти циклом по подобъектам. Верно?  
 
Да.
В цикле перебрать все контуры и проверить вхождение в них точки.
При этом, если контур внутренний ("дырка"), то точка не принадлежит объекту, а если контур внешний (это может быть не только основной контур) - то значит точка лежит на объекте.

Проверка внешний/внутренний нужна только для мультиполигонов, у обычных полигонов все контуры, кроме основного, внутренние.

Код
 // Запросить является ли объект мультиполигоном
 // Мультиполигон - это площадной объект, у которого некоторые подобъекты
 // могут быть вне границ объекта
 // При подсчете площади мультиполигона площадь внешних подобъектов
 // будет добавляться к площади основного объекта, а площади
 // внутренних подобъектов - вычитаться
 // info    - идентификатор объекта карты в памяти
 // Если да, возвращает ненулевое значение

_MAPIMP long int _MAPAPI mapIsMultiPolygon(HOBJ info);


 // Запросить флаг размещения подобъекта вне объекта                 
 // subject - номер подобъекта, если 0 - запрос для объекта
 // Для внешних подобъектов возвращает отрицательное значение (-1),
 // для внутренних подобъектов возвращает номер внешнего подобъекта (c 0), в который
 // входит данный подобъект
 // При отсутствии описания возвращает ноль
 
_MAPIMP long int _MAPAPI mapGetSubjectMultiFlag(HOBJ info, long int subject);
 
Цитата
Дмитрий Т написал:
Функция ovlGetLocationPoint подходит для этой задачи?

Подходит. Но Вы спрашивали, какая функция будет быстрее.
mapCheckInsidePoint работает на более низком уровне и несколько быстрее, чем ovlGetLocationPoint.
 
Цитата
Денис Вицко написал:
Проверка внешний/внутренний нужна только для мультиполигонов, у обычных полигонов все контуры, кроме основного, внутренние.
Денис, а так?

Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Комментарий к функции был неполный:
Код
 // Определить взаиморасположение замкнутого объекта и точки
 // info    - идентификатор объекта,
 // subject - номер объекта(0) или подобъекта, если равно -1, то проверяются все контура,
 //           учитывая мультиполигоны  
 // point   - координаты проверяемой точки в метрах.
 // Возвращает: 1 - точка внутри объекта(подобъекта),
 //             2 - точка за пределами объекта(подобъекта),
 //             3 - точка совпадает с точкой метрики,
 //             4 - точка лежит на отрезке.
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapCheckInsidePoint(HOBJ info, int subject, DOUBLEPOINT *point);
Перебирать все контура не нужно. Достаточно передать в параметре subject значение "-1".
 
Благодарю за ответы!
 
Олег, а вы уверены в -1?

Такой код:
       auto res = mapCheckInsidePoint(obj,0,&point);
auto res2 = mapCheckInsidePoint(obj,-1,&point);
       if(res!=res2)
   qDebug()<<"res!=res2" <<res <<res2;

Такой вывод:
...
res!=res2 2 0
res!=res2 1 0
...

Объект простой многоугольник без подобъектов. Библиотеки от августа 2019.
 
Все ответы на форуме относятся только к версии 13 (с декабря 2019 года и до выхода версии 14).

Примеры проверок функций есть в sdk13.zip -

http://gisinfo.ru/download?id=229

\mapacces\tests
\maptest
Страницы: 1
Читают тему (гостей: 1)



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

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