Пытаюсь написать что-то наподобие вот такой функции
Цитата
// создать смежные границы между объектами procedure CreateEDGE(map: HMAP; base, outObj : HOBJ); var cross : HCross; Obj : HObj; begin cross := mapCreateObjectsConsent(base, outObj, OL_LINE, 0.01); Obj := mapCreateSiteObject(Map, Map);
while mapGetNextConsent(cross, obj) <> 0 do begin mapRegisterObject(obj, 100000001, OL_LINE); // системный mapCommitObject(obj); end; mapFreeObject(Obj); mapFreeObjectsConsent(cross); end;
Вызываю так
Цитата
procedure TForm1.Button2Click(Sender: TObject); var Map : HMap; Obj1, Obj2 : HObj; begin Map := mapOpenMap('E:\tmp\@ANI-BASE-FILL\MAP\WorldBorder.sitx', 0); Obj1 := mapCreateSiteObject(Map, Map); Obj2 := mapCreateSiteObject(Map, Map); if (mapSeekSiteObject(Map, Map, Obj1, 28335) <> 0) and (mapSeekSiteObject(Map, Map, Obj2, 28332) <> 0) then CreateEDGE(Map, Obj1, Obj2); mapFreeObject(Obj1); mapFreeObject(Obj2); mapCloseMap(map); end;
Итог "построений"
Вопрос к разрабочикам. Функция mapGetNextConsent точно должна формировать объект (красную линию)... не две зелёные? см.. картинку Выше?? п.с для проверки: Исходная карта находится в папке \Data.Ani\Карта регионов\ICAO-countries.sitx (изделия АНИ)
Пробовал копировать объект, - "воз" там же (см. оранжевые объекты)
Цитата
while mapGetNextConsent(cross, obj) <> 0 do begin if mapReadCopyObject(ret, obj)<>0 then begin mapRegisterObject(ret, 81140100, OL_LINE); mapCommitObject(ret); end; end;
П.С. работаю с ядром ГИС Панорама 13! (mapacces64.dll) .. не с GTK !
Функция выдает участки, примыкающие к общим участкам. В данном случае должно быть два контура, как на последнем рисунке. Для надежности можно записывать mapCommitObjectAsNew (чтобы не затереть предыдущий).
Для получения пересечения линий (общих участков контуров) можно применить mapCreateObjectsCross с линейным методом пересечения.