Доброго дня!
Слава Україні!!!
Можливо не на часі, але працювати за можливості потрібно.
Тому можливо хтось із Гуру Digitals мені допоможе.
Суть проблеми: при використанні функції
@Map.IntersectionWithLayer не коректно опрацьовуються об'єкти-складні полігони, у підсумку площа об'єкта пересічення вираховується невірно.
У моєму випадку площа об'єкта пересічення становить 56,3550, а має бути 54,5962.
Фрагмент скрипта яким я користуюсь.
Код:
$N90008N=@Map.Layers.FindByID ID90008
@if $N90008N>0 then @Goto %Yes90008
@if $N90008N=0 then @Map.Layers.Add 90008 1 Залишок по обробітку
@Map.Layers.SetAttributes ID90008 0 0 255 20 1 16777215 0 Arial 80 0 -16777208
@Map.Layers.Polygon ID90008 1
%Yes90008
;----------------------------------------------------------
;----------------------------------------------------------
$RestrictLayerID=ID90005
@Map.DeselectAll
@Dialog.WaitBox Виберiть контури для аналiзу
$ObjectList=@Map.Selected.List
@Map.DeselectAll
@Text[1].Text=$ObjectList
@Text[2].Clear
$Count=@Text[1].Count
@While $Count>0 %LoopObjectList
;---------------------------------------------------------------------
$ObjectID=@Text[1].Line[$Count]
$ObjArea=@Map.Object[$ObjectID].Parameter[0]
;---------------------------------------------------------------------
$RestrictObj=@Map.IntersectionWithLayer $ObjectID $RestrictLayerID
@If $RestrictObj=0 Then @Goto %SkipObjectList
;---------------------------------------------------------------------
;---------------------------------------------------------------------
;Додано мною для виправлення помилки, але всеодно не коректно працює
;функція IntersectionWithLayer при обробітку великої кількості обєктів
;@Map.DeselectAll
;@Map.Object[$RestrictObj].LayerID ID90008
;Операции с объектами.Разделить
;@ExecuteMenu spbSplit
;@Map.DeselectAll
;@Map.SelectLayer ID90008
;Операции с объектами.Сложный полигон
;@ExecuteMenu spbCombine
;$RestrictObj=@Map.SelectedObject
;---------------------------------------------------------------------
;---------------------------------------------------------------------
$ObjRestArea=@Map.Object[$RestrictObj].Parameter[0]
@Map.DeleteObject $RestrictObj
@Text[2].Add Об'єкт $ObjectID, площа $ObjArea (пересiчення з шаром $RestrictLayerID складає $ObjRestArea)
%SkipObjectList
$Count=$Count-1
%LoopObjectList
$Count=@Text[2].Count
@If $Count=0 Then @Break Спiвпадань з шаром $RestrictLayerID не знайдено
$Buffer=@Text[2].Text
@Dialog.Message $Buffer
Частково вихід знайшов, якщо застосувати в цьому коді таку маніпуляцію
Код:
;Додано мною для виправлення помилки, але всеодно не коректно працює функція IntersectionWithLayer при обробітку великої кількості об'єктів
;@Map.DeselectAll
;@Map.Object[$RestrictObj].LayerID ID90008
;Операции с объектами.Разделить
;@ExecuteMenu spbSplit
;@Map.DeselectAll
;@Map.SelectLayer ID90008
;Операции с объектами.Сложный полигон
;@ExecuteMenu spbCombine
;$RestrictObj=@Map.SelectedObject
;---------------------------------------------------------------------
Але якщо опрацьовувати велику кількість об'єктів складнішим скриптом, з певним набором циклів. То трапляються випадки, що функція @Map.IntersectionWithLayer у результаті своєї роботи повертає результат $RestrictObj=0, хоча там 100% є пересічення.
Допоможіть будь-ласка розібратись з цією проблемою. Файл приклад додаю.