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

Рассечение площадного объекта линией

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

Пытаюсь разрезать площадной объект MapObj1
линейным объектом  hObj
 
hSite := mapGetSiteIdent(mvMap.MapHandle,1);
hObj := mapCreateSiteObject(mvMap.MapHandle, hSite,KM_IDDOUBLE2, 0);
mapRegisterObject(hObj, 10000176, OL_LINE);
mapAppendPointPlane(hObj, Line.first.X, Line.first.Y, 0); // Координаты есть
mapAppendPointPlane(hObj, Line.second.X, Line.second.Y, 0); // Координаты есть
mapCommitObject(hObj);
ShowMessage ('hObj = '+IntToStr(hObj)); // Дескриптор есть
ShowMessage ('MapObj1.ObjHandle = '+IntToStr(MapObj1.ObjHandle)); // Дескриптор есть
Cross := mapCreateObjectCutByLine(hObj,MapObj1.ObjHandle,OL_SQUARE,0);
mvMap.Repaint;
ShowMessage ('Cross = '+IntToStr(Cross));  // Дескриптор есть
mapFreeObject(hObj);

В результате линейный объект hObj наносится на карту,
но самого рассечение площадного объекта MapObj1
не происходит,
Что я делаю не правильно?
 
Функция mapCreateObjectCutByLine создает экземпляр класса рассечения, у которого надо будет перебрать все полученные в результате "нарезки" объекты, а по окончании освободить.
Объекты, полученные в результате рассечения, сами никуда не сохраняются.

Цитата

// Рассечение замкнутого объекта по линии
// Создание класса рассечения
// info1 - линия без подобъектов, по которой режут
// info2 - замкнутый объект, который режут (произвольный,c подобъектами)
// method - метод нарезки объектов:
//          LOCAL_LINE - линейный,
//          LOCAL_SQUARE - площадной
// precision - точность при дотягивании (в метрах) , при precision=0 устанавливается точность
//             0.001 для карт масштаба <= 500000,
//             0.01 для карт масштаба более 500000, если precision больше предложенной, то
//             устанавливается большее значение
// Возвращает указатель на класс разрезания
// При ошибке возвращает 0

_MAPIMP HCROSS _MAPAPI mapCreateObjectCutByLine(HOBJ info1, HOBJ info2, long int method,
                                       double precision);


// Рассечение замкнутого объекта по линии
// Освобождение класса рассечения
// hCross - указатель на класс разрезания

_MAPIMP void _MAPAPI mapFreeObjectsCut(HCROSS hCross);


// Рассечение замкнутого объекта по линии
// Запросить объект
// hCross - указатель на класс разрезания
// info - результат
// При ошибке возвращает 0

_MAPIMP HOBJ _MAPAPI mapGetNextCut(HCROSS hCross, HOBJ info);
 
Сделал так:

function CutZone(BaseSQR, CutLINE, ResObject : HOBJ) : boolean;
var Cross : HCross;
   _out  : HObj;
   FSite  : Maptype.HSITE;
   mdel : integer;
begin
 result := false;

 mdel := mapDeleteLoop(BaseSQR, 1);

 ShowMessage ('mdel = '+IntToStr(mdel)); // Равно 1

 FSite := mapGetSiteIdent(form_main.mvMap.MapHandle,0);

 ShowMessage ('FSite = '+IntToStr(FSite)); // Дескриптор есть

 _out  := mapCreateSiteObject(form_main.mvMap.MapHandle, FSite);

 ShowMessage ('_out = '+IntToStr(_out));  // Дескриптор есть

 ShowMessage ('BaseSQR = '+IntToStr(BaseSQR));  // Дескриптор есть

 ShowMessage ('CutLINE = '+IntToStr(CutLINE));  // Дескриптор есть

 Cross := mapCreateObjectCutByLine(CutLINE,BaseSQR,OL_SQUARE,0); // режим разрезка площадного с результатом площадь

 ShowMessage ('Cross = '+IntToStr(Cross));  // Дескриптор есть

 If Cross <> 0 then
  While mapGetNextCut(Cross, _out) <> 0 do
  begin

  mapReadCopyObject(ResObject, _out);

  ShowMessage ('ResObject = '+IntToStr(ResObject));  // Дескриптор равен 0

  Break;
  end;
 mapFreeObjectsCut(Cross);
 mapFreeObject(_out);
end;

Почему ResObject равен 0 не пойму.
Что можно еще проверить?
 
Цитата

 // Считать копию объекта векторной (src) карты в другой объект (dest)
 // Для каждого полученного и больше не используемого
 // идентификатора HOBJ необходим вызов функции mapFreeObject()
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapReadCopyObject(HOBJ dest, HOBJ src);

Оба HOBJ должны существовать. Поэтому ResObject равен нулю быть не может, Вы должные его сначала самостоятельно создать.

Цитата
Сергей Викторович написал:
ShowMessage ('ResObject = '+IntToStr(ResObject));  // Дескриптор равен 0

А так делать не корректно. HOBJ - это идентификатор экземпляра класса в памяти. По сути - указатель, а не Int.
 
Все работает хорошо,
площадной объект  form_main.MapObj1
разрезается линейным объектом CutLINE.

Но сохраняется на карте только одна часть от разрезанного площадного объекта form_main.MapObj1,
вторая его часть стирается.
Что я не правильно делаю?

Line.second.X:=MapPoint1.Point.X;
Line.second.Y:=MapPoint1.Point.Y;

hSite := mapGetSiteIdent(form_main.mvMap.MapHandle,1);
CutLINE := mapCreateSiteObject(form_main.mvMap.MapHandle, hSite,KM_IDDOUBLE2, 0);
mapRegisterObject(CutLINE, 10000176, OL_LINE);
mapAppendPointPlane(CutLINE, Line.first.X, Line.first.Y, 0);
mapAppendPointPlane(CutLINE, Line.second.X, Line.second.Y, 0);
mapCommitObject(CutLINE);
mapDeleteLoop(form_main.MapObj1.ObjHandle, 1);
ResObject  := mapCreateSiteObject(form_main.mvMap.MapHandle, hSite);
Cross := mapCreateObjectCutByLine(CutLINE,form_main.MapObj1.ObjHandle,OL_SQUARE,0);

 If Cross <> 0 then
 begin
  While mapGetNextCut(Cross, form_main.MapObj1.ObjHandle) <> 0 do
  begin
  mapReadCopyObject(ResObject, form_main.MapObj1.ObjHandle);
  mapCommitObject(ResObject);
  Break;
  end;
 end;

mapFreeObjectsCut(Cross);
mapFreeObject(CutLINE);
mapFreeObject(ResObject);
Изменено: Сергей Викторович - 06.08.2019 13:40:00
 
Цитата
Сергей Викторович написал:
Но сохраняется на карте только одна часть от разрезанного площадного объекта form_main.MapObj1,вторая его часть стирается. Что я не правильно делаю?

Скорее, остается последняя часть.
Вы в цикле считываете описание отрезанных частей в ResObject.
Каждое последующее чтение замещает описание, полученное ранее.
Вместо mapCommitObject(ResObject) Вам, возможно, стоит использовать mapCommitObjectAsNew, тогда каждая часть будет сохранятся как новый объект, а не перетирать предыдущую.
 
D

В цикле сделал так:

Cross := mapCreateObjectCutByLine(CutLINE,form_main.MapObj1.ObjHandle,OL_SQUARE,0); // режим разрезка площадного с результатом площадь

 If Cross <> 0 then
 begin
  While mapGetNextCut(Cross, form_main.MapObj1.ObjHandle) <> 0 do
  begin
  mapReadCopyObject(ResObject, form_main.MapObj1.ObjHandle);
  mapCommitObjectAsNew(ResObject);
  Break;
  end;
 end;

Теперь первая часть рассеченного объекта сохраняется также, как и сохранялась,
а вторая часть, вместо второй части рассеченного объекта, сохраняет весь объект целиком.

Что еще может быть не правильно?  
 
Цитата
Сергей Викторович написал:
 If Cross <> 0 then
 begin
  While mapGetNextCut(Cross, form_main.MapObj1.ObjHandle) <> 0 do
  begin
  mapReadCopyObject(ResObject, form_main.MapObj1.ObjHandle);
  mapCommitObjectAsNew(ResObject);
  Break;
  end;
 end;

Во-первых, не понятно, зачем после первой же итерации выходить из цикла.

Во-вторых, где у Вас сохранение "второй части рассеченного объекта", вместо которой якобы "сохраняется весь объект целиком"?

Выйдя из цикла, Вы никаких частей, кроме первой и не сохраните. А "объект целиком"- это исходный объект. С ним Вы ничего и не делаете, вот он и остался.
 
Да, проблема решилась,
если убрать Break.
 
Добрый день, Денис!

Еще раз хотелось бы вернуться к этой теме.
Дело в том, что после разрезания площадного объекта линией,
новые объекты создаются хорошо,
но и старый объект также разрезается(.
Старый, до разрезания объект MapObj1
Как только его разрезали и создали новые объекты,
разрезанный старый объект также разрезался.
Не удаляется MapObj1
Не удаляются и обе половинки MapObj1

Что я делаю не правильно?
 
  CutLINE := mapCreateSiteObject(form_main.mvMap.MapHandle, hSite,KM_IDDOUBLE2, 0);
  mapRegisterObject(CutLINE, 1000000001, OL_LINE);
  mapAppendPointPlane(CutLINE, Line.first.X, Line.first.Y, 0);
  mapAppendPointPlane(CutLINE, Line.second.X, Line.second.Y, 0);
  mapDeleteLoop(form_main.MapObj1.ObjHandle, 1);
  ResObject  := mapCreateSiteObject(form_main.mvMap.MapHandle, hSite);
  Cross := mapCreateObjectCutByLine(CutLINE,form_main.MapObj1.ObjHandle,OL_SQUARE,0);

   If Cross <> 0 then
   begin
    While mapGetNextCut(Cross, form_main.MapObj1.ObjHandle) <> 0 do
    begin
    mapReadCopyObject(ResObject, form_main.MapObj1.ObjHandle);
    mapCommitObjectAsNew(ResObject);
    mapLogCommitAction(form_main.mvMap.MapHandle, form_main.mvMap.MapSites[0].SiteHandle);
    IDObject := copy(GetGuid,2,25);
    mapAppendSemanticUn(ResObject,10,PChar(IDObject),25);
    mapCommitObject(ResObject);
    end;
   end;

  MapObj1.Delete; // Попытка удалить старый объект, но он уже разрезанный на две половинки
  form_main.mvMap.Repaint;
  mapFreeObjectsCut(Cross);
  mapFreeObject(CutLINE);
  mapFreeObject(ResObject);

Результат скопированные две половинки старого объекта MapObj1
и сам разрезанный на две половинки MapObj1
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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