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

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

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

ShowMessage ('До создания пользовательской карты MapCount = '+IntToStr(MapCount)); // Здесь равно 1

// создадим временную карту для размещения результата пересечения
hsitenew := mapCreateAndAppendTempSite(form_main.mvMap.MapHandle, nil);
fillchar(parm1, sizeof(TPROCESSPARM), 0);
parm1.Map := form_main.mvMap.MapHandle;
parm1.Site2 := hsitenew;

MapCount := mapGetSiteListCount(form_main.mvMap.MapHandle,form_main.mvMap.MapHandle);

ShowMessage ('После создания пользовательской карты MapCount = '+IntToStr(MapCount)); // Здесь тоже равно 1 Почему?

GIS Server 8.3
GisToolKit 13.4.4.1

В ГИС Сервере администраторе редактирование и даже копирование карты разрешены.  

Если так, то результат тот же:

MapCount := mapGetSiteListCount(form_main.mvMap.MapHandle,hsitenew);

ShowMessage ('До создания пользовательской карты MapCount = '+IntToStr(MapCount)); // Здесь равно 1

// создадим временную карту для размещения результата пересечения
hsitenew := mapCreateAndAppendTempSite(form_main.mvMap.MapHandle, nil);
fillchar(parm1, sizeof(TPROCESSPARM), 0);
parm1.Map := form_main.mvMap.MapHandle;
parm1.Site2 := hsitenew;

MapCount := mapGetSiteListCount(form_main.mvMap.MapHandle,hsitenew);

ShowMessage ('После создания пользовательской карты MapCount = '+IntToStr(MapCount)); // Здесь равно 1
Изменено: Сергей Викторович - 24.10.2021 22:12:22
 
Одновременно может быть открыто несколько карт в одном документе. Карта может состоять из нескольких листов (для топографических карт - номенклатурный лист). Вы запрашиваете сколько листов в конкретной карте, а не сколько карт в документе с идентификатором HMAP.

 // Запросить общее число листов на карте
 // hMap   - идентификатор открытой основной карты (данных)
 // hSite  - идентификатор открытой пользовательской карты (может быть равен hMap
 //          для доступа к основной карте)
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetSiteListCount(HMAP hmap, HSITE hSite);

 // Запросить количество открытых пользовательских карт
 // hMap - идентификатор открытой карты
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetSiteCount(HMAP hMap);
 
Цитата
Andrey Gheleznyakov написал:
_MAPIMP long int _MAPAPI mapGetSiteCount(HMAP hMap);
Да, все верно.

Еще вопрос:
form_main.MapFind1.Center; // Зона уборки
ShowMessage ('найден объект шаблон = '+form_main.MapFind1.MapObj.ObjName); // Здесь все хорошо

ExCode := 10000040; // Газоны
ShowMessage ('ExCode = '+IntToStr(ExCode));

// ищем обрабатываемый объект
form_main.MapFind2.Active := false;
form_main.MapFind2.FindPoint := false;
form_main.MapFind2.MapSelect.Clear;
form_main.MapFind2.MapObj.Style := OS_SELECT;
form_main.MapFind2.MapSelect.SiteNumber := 0;
form_main.MapFind2.MapSelect.SelectSeekArea(-1,form_main.MapFind1.MapObj,1,0,0,0,0);
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;
form_main.MapFind2.Center;
ShowMessage ('найден обрабатываемый объект = '+form_main.MapFind2.MapObj.ObjName);  // Здесь все хорошо

While not form_main.MapFind2.Eof do
begin

MapCount := mapGetSiteCount(form_main.mvMap.MapHandle);

ShowMessage ('До создания пользовательской карты MapCount = '+IntToStr(MapCount)); // Здесь все хорошо = 0

// создадим временную карту для размещения результата пересечения
hsitenew := mapCreateAndAppendTempSite(form_main.mvMap.MapHandle, nil);
fillchar(parm1, sizeof(TPROCESSPARM), 0);
parm1.Map := form_main.mvMap.MapHandle;
parm1.Site2 := hsitenew;

MapCount := mapGetSiteCount(form_main.mvMap.MapHandle);

ShowMessage ('После создания пользовательской карты MapCount = '+IntToStr(MapCount));  // // Здесь все хорошо = 1

RetFunc := form_main.ovlObj.OverlapTest(4, form_main.mvMap.MapHandle, 0, 0, hsitenew, 0, 0, 0, 0, 0, 0);

ShowMessage ('RetFunc = '+IntToStr(RetFunc)); // Здесь все хорошо = 1

form_main.MapFind3.Active := false;
form_main.MapFind3.FindPoint := false;
form_main.MapFind3.MapSelect.Clear;
form_main.MapFind3.MapObj.Style := OS_SELECT;
form_main.MapFind3.MapSelect.SiteNumber := 1;
form_main.MapFind3.MapSelect.Excode[-1,OL_SQUARE] := false;
form_main.MapFind3.MapSelect.Excode[1000000002,OL_SQUARE] := true;
form_main.MapFind3.Active := true;
form_main.MapFind3.First;
form_main.MapFind3.Center;
ShowMessage ('найден объект пересечения= '+form_main.MapFind3.MapObj.ObjName); // Здесь показывает что найден объект пересечения Газоны. Почему?
 
Потому что для поиска доступна и основная карта, не только та, которую создали и добавили последней. Необходимо отключить карты, по которым поиск не должен выполняться.
MapFind3.MapSites[0] := false
 
Цитата
Andrey Gheleznyakov написал:
Потому что для поиска доступна и основная карта, не только та, которую создали и добавили последней. Необходимо отключить карта, по которым поиск не должен выполняться.MapFind3.MapSites[0] := false
Сделали теперь так:

form_main.MapFind3.Active := false;
form_main.MapFind3.FindPoint := false;
form_main.MapFind3.MapSelect.Clear;
form_main.MapFind3.MapObj.Style := OS_SELECT;
form_main.MapFind3.MapSelect.MapSites[0] := false;
form_main.MapFind3.MapSelect.SiteNumber := 1;
// form_main.MapFind3.MapSelect.MapSites[1] := true; Если так, то результат тот же, находит объект ЛИНИЯ
form_main.MapFind3.MapSelect.Excode[-1,OL_SQUARE] := false;
form_main.MapFind3.MapSelect.Excode[1000000002,OL_SQUARE] := true;
form_main.MapFind3.Active := true;
form_main.MapFind3.First;
form_main.MapFind3.Center;
ShowMessage ('найден объект пересечения= '+form_main.MapFind3.MapObj.ObjName); // Теперь пишет: найден объект пересечения ЛИНИЯ, ожидается площадной объект

Что еще можно попробовать?
Изменено: Сергей Викторович - 25.10.2021 13:37:40
 
Потому, что был отключен поиск только для площадных объектов. Из документации

"Например, для того чтобы включить доступ только к одному виду объектов карты
необходимо:

Excode[-1, 0] := false;

Excode[aExcode, OL_LINE] := true;

Применяется к текущей карте, указанной в свойстве SiteNumber."

 
Сделали так:

form_main.MapFind1.Center; // Зона уборки
ShowMessage ('найден объект шаблон = '+form_main.MapFind1.MapObj.ObjName);

ExCode := 10000040; // Газоны
ShowMessage ('ExCode = '+IntToStr(ExCode));

// ищем обрабатываемый объект
form_main.MapFind2.Active := false;
form_main.MapFind2.FindPoint := false;
form_main.MapFind2.MapSelect.Clear;
form_main.MapFind2.MapObj.Style := OS_SELECT;
form_main.MapFind2.MapSelect.SiteNumber := 0;
form_main.MapFind2.MapSelect.SelectSeekArea(-1,form_main.MapFind1.MapObj,1,0,0,0,0);
form_main.MapFind2.MapSelect.Excode[-1, 0] := false;
form_main.MapFind2.MapSelect.Excode[ExCode,OL_SQUARE] := true;
form_main.MapFind2.Active := true;
form_main.MapFind2.First;
form_main.MapFind2.Center;
ShowMessage ('найден обрабатываемый объект = '+form_main.MapFind2.MapObj.ObjName);

While not form_main.MapFind2.Eof do
begin

MapCount := mapGetSiteCount(form_main.mvMap.MapHandle);

ShowMessage ('До создания пользовательской карты MapCount = '+IntToStr(MapCount)); // 0

// создадим временную карту для размещения результата пересечения
hsitenew := mapCreateAndAppendTempSite(form_main.mvMap.MapHandle, nil);
fillchar(parm1, sizeof(TPROCESSPARM), 0);
parm1.Map := form_main.mvMap.MapHandle;
parm1.Site2 := hsitenew;

MapCount := mapGetSiteCount(form_main.mvMap.MapHandle);

ShowMessage ('После создания пользовательской карты MapCount = '+IntToStr(MapCount)); // 1

ObjSiteCount := mapGetSiteObjectCount(form_main.mvMap.MapHandle,hsitenew);

ShowMessage ('Количество объектов на пользовательской карте до выполнения оверлейной функции ObjSiteCount = '+IntToStr(ObjSiteCount)); // 0

RetFunc := form_main.ovlObj.OverlapTest(4, form_main.mvMap.MapHandle, 0, 0, hsitenew, 0, 0, 0, 0, 0, 0);

ShowMessage ('RetFunc = '+IntToStr(RetFunc)); // 1

ObjSiteCount := mapGetSiteObjectCount(form_main.mvMap.MapHandle,hsitenew);

ShowMessage ('Количество объектов на пользовательской карте после выполнения оверлейной функции ObjSiteCount = '+IntToStr(ObjSiteCount)); // 0

form_main.MapFind3.Active := false;
form_main.MapFind3.FindPoint := false;
form_main.MapFind3.MapSelect.Clear;
form_main.MapFind3.MapObj.Style := OS_SELECT;
form_main.MapFind3.MapSelect.MapSites[0] := false;
form_main.MapFind3.MapSelect.SiteNumber := 1;
form_main.MapFind3.MapSelect.Excode[-1, 0] := false;
form_main.MapFind3.MapSelect.Excode[1000000002,OL_SQUARE] := true;
form_main.MapFind3.Active := true;
form_main.MapFind3.First;
form_main.MapFind3.Center;
ShowMessage ('найден объект пересечения= '+form_main.MapFind3.MapObj.ObjName); // ЛИНИЯ

Количество объектов на пользовательской карте после выполнения оверлейной функции не добавилось, не пойму почему?
MapFind3 упорно находит только ЛИНИЮ, ожидается площадной объект.
 
// создадим временную карту для размещения результата пересечения
hsitenew := mapCreateAndAppendTempSite(form_main.mvMap.MapHandle, nil);
fillchar(parm1, sizeof(TPROCESSPARM), 0);
parm1.Map := form_main.mvMap.MapHandle;
parm1.Site2 := hsitenew;

MapCount := mapGetSiteCount(form_main.mvMap.MapHandle);

ShowMessage ('После создания пользовательской карты MapCount = '+IntToStr(MapCount)); // Здесь все хорошо 1

ObjSiteCount := mapGetSiteObjectCount(form_main.mvMap.MapHandle,hsitenew);

ShowMessage ('Количество объектов на пользовательской карте до выполнения оверлейной функции ObjSiteCount = '+IntToStr(ObjSiteCount));  // Здесь все хорошо 0

// RetFunc := form_main.ovlObj.OverlapTest(4, form_main.mvMap.MapHandle, 0, 0, hsitenew, 0, 0, 0, 0, 0, 0); // Это не работает

RetFunc := form_main.ovlObj.cntOverlapTest(4, @parm1, 0); // Это работает

ShowMessage ('RetFunc = '+IntToStr(RetFunc));  // Здесь все хорошо 1

ObjSiteCount := mapGetSiteObjectCount(form_main.mvMap.MapHandle,hsitenew);

ShowMessage ('Количество объектов на пользовательской карте после выполнения оверлейной функции ObjSiteCount = '+IntToStr(ObjSiteCount)); // Здесь показывает что количество объектов пересечения 2, и это не понятно? Ожидается 1 объект пересечения.  
1.PNG (10.01 КБ)
 
Практически, вроде заработало, но:

form_main.MapFind3.Active := false;
form_main.MapFind3.FindPoint := false;
form_main.MapFind3.MapSelect.Clear;
form_main.MapFind3.MapObj.Style := OS_SELECT;
form_main.MapFind3.MapSelect.MapSites[0] := false;
form_main.MapFind3.MapSelect.SiteNumber := 1;
form_main.MapFind3.MapSelect.Excode[-1, 0] := false;
form_main.MapFind3.MapSelect.Excode[1000000002,OL_SQUARE] := true;
form_main.MapFind3.Active := true;
resbool := form_main.MapFind3.First;

 If resbool = true then
 begin
 form_main.MapFind3.Center;
 ShowMessage ('найден объект пересечения = '+form_main.MapFind3.MapObj.ObjName) // Найден объект пересечения ВЫДЕЛЕНИЕ ПЛОЩАДНЫХ, наверное это хорошо
 end
 else
 begin
 ShowMessage ('не найден объект пересечения');
 end;

ShowMessage ('площадь пересечения= '+FloatToStr(form_main.MapFind3.MapObj.Square)); // Но здесь пишет, что площадь его равна 0, не пойму почему?
3.PNG (6.73 КБ)
4.PNG (6.5 КБ)
 
При вычислении площади объекта из площади внешнего контура вычитается площадь внутренних контуров.
Если они, например, совпадают, то площадь будет равна нулю.
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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