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

Не считает пересечение оверлейная функция

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 4 След.
RSS
Не считает пересечение оверлейная функция, TMapOverlay
 
Здравствуйте!

С выходом GisToolKit13 стало гораздо лучше считать оверлейные функции.
Однако есть случай, который не считает пересечение.
Карту отправил в техподдержку.
ScreenShort19.PNG (6.95 КБ)
 
На техподдержку карта не пришла.  
 
Цитата
Сергей Викторович написал:
Карту отправил в техподдержку.
Карту с примером данных не получали. Просьба выслать повторно.
 
Карта правильная. Какой объект с каким надо пересечь?
 
Цитата
Andrey Gheleznyakov написал:
Карта правильная. Какой объект с каким надо пересечь?
В качестве обрабатываемого объекта MapFind2.MapObj здесь Газон
В качестве шаблона MapFind1.MapObj здесь Зона уборки юридических лиц
В результате должны получить площадь пересечения Газон столько-то квадратных метров.

Параметры TMapOvl
ObjectIn MapObj2
ObjectOut MapObj3
ObjectTemp MapObj1
 
Также не правильно вычисляются следующие пересечения.
См. скриншот.
ScreenShort2.PNG (39.43 КБ)
 
Чем пользуетесь для расчета пересечений? Рекомендую TMapOverlay.cntOverlapTest.
 
Цитата
Andrey Gheleznyakov написал:
Чем пользуетесь для расчета пересечений? Рекомендую TMapOverlay.cntOverlapTest.
form_main.MapFind2.Active := false; // Обрабатываемый объект
form_main.MapFind2.FindPoint := false;
form_main.MapFind2.MapSelect.Clear;
form_main.MapFind2.MapObj.Style := OS_NORMAL;
form_main.MapFind2.MapSelect.Excode[-1,OL_SQUARE] := false;
form_main.MapFind2.MapSelect.Excode[ExCode,OL_SQUARE] := true;
form_main.MapFind2.Active := true;
form_main.MapFind2.First;

 While not form_main.MapFind2.Eof do
 begin
 SquareObject := 0;

 res := form_main.ovlObj.CreateOVL(1, 0.001, -1, 0);

 If res = 0 then
 ShowMessage ('Программа не может определить результат взаимного'+#10#13+'расположения рассматриваемых для пересечения объектов.');

 res := form_main.ovlObj.SetObjectCross(-1, 0.001, 0, ovl_METHOD_SQUARE, ovl_OBJECTINSIDE);

  case res of
  1 :
  begin

   If mapGetExclusiveSubject(form_main.MapObj1.ObjHandle, 0) <> 0 // шаблон замкнут
   then
   begin
 
  // Все контура объекта совпадают с шаблоном (лежат на шаблоне

   SquareObject := form_main.MapFind2.MapObj.Square;

    NameObject     := form_main.MapFind2.MapObj.ObjName;
    ExCode        := form_main.MapFind2.MapObj.ExCode;

   AppendSanitObjects(); // Запишем результат

   end;
  end;

  2 :
  begin
  // ShowMessage ('Все контура объекта '+form_main.MapFind2.MapObj.ObjName+' вне шаблона '+
  end;

  3 :
  begin
  SquareObject := 0;

  // Один или несколько контуров объекта пересекаются с шаблоном

   NameObject     := form_main.MapFind2.MapObj.ObjName;
   ExCode        := form_main.MapFind2.MapObj.ExCode;

   While 1=1 do
   begin
   form_main.MapObj3.CreateObjectByKey(1, KM_IDDOUBLE2, form_main.MapObj2.KeyName);

    If form_main.ovlObj.GetNextObject = 0 then
    break;

   SquareObject := SquareObject+form_main.MapObj3.Square;

   end;

  AppendSanitObjects();  // Запишем результат

  end;

  4 :
  begin

  SquareObject := form_main.MapObj1.Square;

  // ShowMessage (' Обрабатываемый объект '+form_main.MapFind2.MapObj.ObjName+' внутри него находиться шаблон '+form_main.MapFind1.MapObj.ObjName+' площадь шаблона = '+FloatToStr(SquareObject));

  NameObject     := form_main.MapFind2.MapObj.ObjName;
  ExCode        := form_main.MapFind2.MapObj.ExCode;

  AppendSanitObjects();  // Запишем результат

  end;

  0 :
  begin
  ShowMessage('Ошибка топологии карты! '+#10#13+'Проверьте качество векторной карты.');
  end;
  end;

 form_main.ovlObj.FreeOVL;
 form_main.MapFind2.Next;
 end;

end;

Карту Ногинска отправил в техподдержку.

Что-то здесь не правильно?
Изменено: Сергей Викторович - 17.05.2021 14:58:28
 
Если я правильно понял: Вы не пользуетесь рекомендованной функцией cntOverlapTest ?

Функция SetObjectCross имеет ряд ограничений, которые не позволяет обрабатывать сложные полигоны, в том числе и мультиполигоны.
Пересечение двух объектов с подобъектами функция SetObjectCross также не выполняет: в качестве шаблона не может быть выбран объект с подобъектом.  Для таких случаев специально разработана более сложная функция: cntOverlapTest.

Порядок проверки:
1. Открыл Вашу карту.
2. Выделил объект 266 и добавил в список "Газон": ГИС "Панорама" - Поиск - Списки объектов - Добавить. Сохранить. Выход.
3. Выделил объект 857 и добавил в список "Зона".
4. Выполнил построение пересечений с помощью диалога: Поиск - Списки объектов - Построение - Объединение/пересечение объектов списков - Выполнить. Выход. Выход.

Результат пересечения (лиловый объект) на рисунке (получено с использованием функции cntOverlapTest).
Изменено: Александр Кружков - 17.05.2021 15:31:47
 
Пример использования функции cntOverlapTest приведено в примере \MapOverlay.  
Страницы: 1 2 3 4 След.
Читают тему (гостей: 1)



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

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