Попытался использовать cntOverlapTest, не получилось.
Delphi обертка |
---|
[CODE] unit mapcntapi; interface Uses Windows ,maptype ;
Const sGisLib = 'c:\gislib12x32\gislib12x32\gisuvecex.dll';
//------------------------------------------------------------------ // ПАРАМЕТРЫ ПРОСЕССА ОБРАБОТКИ МЕТРИКИ ОБЪЕКТОВ //------------------------------------------------------------------ // Обязательные параметры отмечены звездочками (***) // Если Site2 = Site и Map2 = Map - обработанные объекты записываются в ИСХОДНУЮ карту, // иначе - в НОВУЮ карту (Map2, Site2) с нарезкой на листы // Если Site3 = Site и Map3 = Map - ошибочные объекты записываются в ИСХОДНУЮ карту, // иначе - в карту ОШИБОЧНЫХ объектов (Map3, Site3) type PROCESSPARM = packed record Map: HMAP; // *** Идентификатор открытых данных Map2: HMAP; // Идентификатор открытых данных для записи результата// - если Map2 = 0, то Map2 = Map Map3: HMAP; // Идентификатор открытых данных для записи неисправленных объектов// - если Map3 = 0, то Map3 = Map
Site: HSITE; // Исходная карта// - если Site = 0, то Site = Map Site2: HSITE; // Новая карта для записи обработанных объектов// - если Site2 = 0, то Site2 = Map2 Site3: HSITE; // Карта ошибочных объектов (для записи неисправленных объектов)// - если Site3 = 0, то Site3 = Map3
Select:HSELECT; // Состав обрабатываемых объектов (пока не используется) Handle:HWND; // Идентификатор окна сопровождения процесса обработки // - если Handle != 0, то функция cntCorrection() посылает сообщение // WM_PROGRESSBARUN с текущим процентом выполнения (WPARAM от 0 до 100) // и строку "Коррекция метрики объектов. Исправлено ошибок: XXX" (LPARAM) Free :double; Precision:double; // Точность (в метрах на местности),// используемая для проверки равенства точек
SheetNumber: integer; // Номер листа обрабатываемой карты (от 1)// (при обработке одного объекта игнорируеся) Reserve: integer; end;
// Анализ пересечений двух площадных объектов (obj1 и obj2) // (обрабатывает мультиполигоны) // func - условия формирования областей // 1 - создать объекты областей объекта obj1, расположенные снаружи obj2 // 2 - создать объекты областей объекта obj2, расположенные снаружи obj1 // 3 - создать объекты непересекающихся областей мультиполигонов obj1 и obj2 // 4 - создать объекты пересекающихся областей мультиполигонов obj1 и obj2 // 5 - создать объекты областей, покрытых обоими объектами obj1 и obj2 // parm - параметры обработки // сode - внутренний код для записи областей (от 1) // если сode = 0, то сode = SQUARESERVINCODE // При ошибке возвращает 0 //------------------------------------------------------------------ //_VECIMP long int _VECAPI cntOverlapTest(HOBJ obj1, HOBJ obj2, long int func, // PROCESSPARM & parm, long int code); // 25/01/19 function cntOverlapTest(obj1: HOBJ; obj2: HOBJ; func: Integer; parm: PROCESSPARM; code: Integer): Integer; {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF} external sGisLib name 'cntOverlapTest';
implementation end. [/CODE] |
Вызов функции
[CODE]
procedure TfrmOvl.Button2Click(Sender: TObject);
var
param: PROCESSPARM;
map: HMAP;
res: Integer;
begin
map := mvMap.MapHandle;
FillChar(param, sizeOf(param), 0);
param.Map := map;
param.Site := map;
param.Precision := 0.01;
if temp.SeekObject(mvMap.MapName, StrToInt(edTemplet.Text)) = 0
then begin
ShowMessage('Объект шаблон не найден!');
exit;
end;
if objIn.SeekObject(mvMap.MapName, StrToInt(edObjIn.Text)) = 0
then begin
ShowMessage('Обрабатываемый объект не найден!');
exit;
end;
res := cntOverlapTest(temp.ObjHandle, objIn.ObjHandle, 4, param, 0 );
end;
[/CODE]
Возвращает 0 и пересечения не создает.
Наверное где-то ошибку сделал (что-то с описанием параметров может),
посмотрите пожалуйста.
Библиотеки х32 обновил