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

Как рассчитать площадь пересечения двух площадных объектов

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 5 След.
RSS
Как рассчитать площадь пересечения двух площадных объектов, CalcCrossObjectSquare
 
В качестве шаблона (первый объект) вы должны указать объект карты и номер контура (если надо определить пересечение с подобъектом). Поэтому первым вы должны выбрать объект без подобъектов. Поэтому при вызове функции  ovlObj.SetObjectCross(-1, 0.001, 0, ovl_METHOD_SQUARE, ovl_ANYOBJECT) в первом параметре стоит -1.
 
Карта Ваша нормальная без самопересечений.

1. В качестве шаблона выбираете объект без подобъектов (прямоугольник в примере)
2. Функцию поиска модифицируете следующим образом
res := ovlObj.SetObjectCross(-1, 0.001, 0, ovl_METHOD_SQUARE, ovl_OBJECTINSIDE); - изменил последний параметр на Поиск контуров внутри шаблона.

Результат на картинке
Изменено: Andrey Gheleznyakov - 01.02.2021 15:42:36
 
Цитата
Andrey Gheleznyakov написал:
Результат на картинке
У меня не получилось почему-то.
Можете отправить мне ответом программу и карту, что бы я у себя собрал это и проверил?
Спасибо.
 
Пример отправлю. Карту использовал Вашу.
 
Цитата
Andrey Gheleznyakov написал:
1. В качестве шаблона выбираете объект без подобъектов (прямоугольник в примере)
Функциональная задача требует брать в качестве шаблона желтый объект с подобъектами,
а обрабатываемый объект, по которому нужна площадь пересечения с шаблоном,
как раз должен быть объект, который на карте указан в качестве прямоугольного.

Просьба подсказать как написать функцию в этом случаи?
 
Никто не мешает пользователю выбирать первым объект с подобъектами. В этой ситуации при программировании в качестве шаблона при вызове функции указать второй объект (прямоугольник).  
 
Цитата
Andrey Gheleznyakov написал:
Никто не мешает пользователю выбирать первым объект с подобъектами. В этой ситуации при программировании в качестве шаблона при вызове функции указать второй объект (прямоугольник).  
С этим разобрались. Первый, второй объект, с этим понятно. Спасибо.
---

Вопрос второй, не менее важный.
Требуется вычислить площадь пересечения объекта имеющего подобъект.
Нужно чтобы получилась площадь пересечения как на ScreenSort5.png,
а в результате получается площадь пересечения как на ScreenSort6.png, т.е. без учета подобъекта.
Как поступить? Если ли здесь какое-то решение?  
ScreenSort5.PNG (40.17 КБ)
ScreenSort6.PNG (39.91 КБ)
ScreenSort4.PNG (40.17 КБ)
Изменено: Сергей Викторович - 09.02.2021 12:01:14
 
Есть функция в gis64vecex.dll
//------------------------------------------------------------------
// Анализ пересечений двух площадных объектов (obj1 и obj2)
// (обрабатывает мультиполигоны)
// В создаваемые объекты добавляется семантика объектов obj1 и obj2
// func - условия формирования областей
// 1 - создать объекты областей объекта obj1, расположенные снаружи obj2
// 2 - создать объекты областей объекта obj2, расположенные снаружи obj1
// 3 - создать объекты непересекающихся областей мультиполигонов obj1 и obj2
// 4 - создать объекты пересекающихся областей мультиполигонов obj1 и obj2
// 5 - создать объекты областей, покрытых обоими объектами obj1 и obj2
// parm - параметры обработки
// сode - внутренний код для записи областей (от 1)
// Режимы создания (сохранить семантики обоих объектов):
// > 0 - создать объекты с кодом сode
// 0 - создать объекты с кодом SQUARESERVINCODE
// Режимы обрезки:
// -1 - обрезать объекты с сохранением в виде объекта obj1
// -2 - обрезать объекты с сохранением в виде объекта obj2
// При ошибке возвращает 0
//------------------------------------------------------------------
long int cntOverlapTest(HOBJ obj1, HOBJ obj2, long int func, PROCESSPARM * parm, long int code);

Вам нужен режим
// 4 - создать объекты пересекающихся областей мультиполигонов obj1 и obj2

Особенность заключается в том, что эти области создаются не в памяти, а записываются в карту. Код объектов можете задать самостоятельно и затем их удалить.
 
В следующих версиях вызов функции добавим в компонент TMapObj
 
//------------------------------------------------------------------
// ПАРАМЕТРЫ ПРОСЕССА ОБРАБОТКИ МЕТРИКИ ОБЪЕКТОВ
//------------------------------------------------------------------
typedef struct PROCESSPARM
{

 // Обязательные параметры отмечены звездочками (***)

 HMAP    Map;            // *** Идентификатор открытых данных

 HMAP    Map2;           // Идентификатор открытых данных для записи результата
                         // - если Map2 = 0, то Map2 = Map
 HMAP    Map3;           // Идентификатор открытых данных для записи неисправленных объектов
                         // - если Map3 = 0, то Map3 = Map

 HSITE   Site;           // Исходная карта
                         // - если Site = 0, то Site = Map
 HSITE   Site2;          // Новая карта для записи обработанных объектов
                         // - если Site2 = 0, то Site2 = Map2
 HSITE   Site3;          // Карта ошибочных объектов (для записи неисправленных объектов)
                         // - если Site3 = 0, то Site3 = Map3

 // Если Site2 = Site и Map2 = Map - обработанные объекты записываются в ИСХОДНУЮ карту,
 //                          иначе - в НОВУЮ карту (Map2, Site2) с нарезкой на листы
 // Если Site3 = Site и Map3 = Map - ошибочные объекты записываются в ИСХОДНУЮ карту,
 //                          иначе - в карту ОШИБОЧНЫХ объектов (Map3, Site3)

 HSELECT Select;         // Состав обрабатываемых объектов (пока не используется)
 HWND    Handle;         // Идентификатор окна сопровождения процесса обработки
                         // - если Handle != 0, то функция cntCorrection() посылает сообщение
                         //   WM_PROGRESSBARUN с текущим процентом выполнения (WPARAM от 0 до 100)
                         //   и строку "Коррекция метрики объектов. Исправлено ошибок: XXX" (LPARAM)
 double  Free;
 double  Precision;      // Точность (в метрах на местности),
                         // используемая для проверки равенства точек

 int     SheetNumber;    // Номер листа обрабатываемой карты (от 1)
                         // (при обработке одного объекта игнорируеся)
 int     MultiPolygon;   // Формирование мультиполигона
 int     Reserve[18];
}
 PROCESSPARM;
Страницы: Пред. 1 2 3 4 5 След.
Читают тему (гостей: 1)



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

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