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

Как посчитать произвольную площадь на карте

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

hSite := mapGetSiteIdent(form_main.mvMap.MapHandle,1);
ObjectSquare := mapCreateSiteObject(form_main.mvMap.MapHandle, hSite,KM_IDDOUBLE2, 0);
mapRegisterObject(ObjectSquare, 1000000002, OL_SQUARE);
ResObject  := mapCreateSiteObject(form_main.mvMap.MapHandle, hSite);
SelectPoint := SelectPoint+1;
SelectPoints := SelectPoints+1;
points[SelectPoint].X := xx1;
points[SelectPoint].Y := yy1;
ProcUzor.PaintRect();
mapAppendPointPlane(ObjectSquare, points[SelectPoint].X, points[SelectPoint].Y, 0);
mapCommitObject(ObjectSquare);
form_main.mvMap.Repaint;

 points[SelectPoint].X := xx1;
points[SelectPoint].Y := yy1;
ProcUzor.PaintRect();
mapAppendPointPlane(ObjectSquare, points[SelectPoint].X, points[SelectPoint].Y, 0);
mapCommitObject(ObjectSquare);
form_main.mvMap.Repaint;

form_main.MapFind1.Active := false;
form_main.MapFind1.FindPoint := false;
form_main.MapFind1.MapSelect.Clear;
form_main.MapFind1.MapObj.Style := OS_NORMAL;
form_main.MapFind1.MapSelect.Excode[-1,OL_SQUARE] := false;
form_main.MapFind1.MapSelect.Excode[1000000002,OL_SQUARE] := true;
form_main.MapFind1.Active := true;
form_main.MapFind1.First;

With CreateMessageDialog('Площадь равна '+FormatFloat('0.00',form_main.MapObj1.Square)+' кв.м', mtInformation,[mbYes]) do
begin
Caption := 'Результат';
(FindComponent('Yes') as TButton).Caption := 'ОК';
ShowModal;
 If ModalResult = 6 then
 begin
 N9.Checked := false;
 Free;
 end;
end;

form_main.MapFind1.MapObj.Delete;
form_main.MapFind1.MapObj.Commit;
form_main.mvMap.Repaint;
mvMap.MapSort(true,true);
form_main.mvMap.Repaint;

Каждый раз приходится наносить физически этот объект на карту,
потом физически его удалять.

Можно ли посчитать площадь этого объекта без физического внесения его на карту,
т.е. без Commit?
 
Сергей Викторович, тяжело разобраться в Вашем коде, тем более понять по нему логику того, что вы хотите сделать.

Судя по коду, Вы создаете два объекта с помощью функций MAPAPI. Один из них - ObjectSquare, Вы сохраняете в карту физически. Причем, зачем-то,  дважды.

Потом, уже с помощью компонент, Вы пытаетесь искать первый попавшийся площадной объект с классификационным кодом 1000000002, который не обязательно будет тем ObjectSquare, который Вы создали.
При этом найденный объект Вы удаляете после того, как запросите у него площадь. И удаление выполняется уже с помощью компонента MapObj, в который установил свой результат компонент MapFind.
При таком подходе после удаления объекта критерии поиска в MapFind становятся недействительными, а ObjectSquare (при условии, что именно он был найден через MapFind, чего Ваш код совсем не гарантирует) будет в себе содержать информацию об объекте, которого на карте уже нет.
После этого Вы еще делаете сортировку карты - очень тяжелую операцию с точки зрения ресурсоемкости, после которой вообще желательно заново запросить информацию для всех открытых хэндлов.

Я Вам неоднократно рекомендовал не смешивать без особой необходимости использование компонентов и MAPAPI, так как такой подход требует большей внимательности и глубокого понимания физики процессов, происходящих в компонентах GTK.

Что мешает в данной ситуации всё реализовать только на компонентах?
Цитата
1. Создали объект, например, с помощью TMapObj.CreateObjectByExcode;
2. Добавили в него метрику TMapObj.Metric.Append;
3. Не сохраняя запросили площадь у него напрямую (без всяких лишних поисков) - метод TMapObj.Square

или только на MAPAPI?
Цитата
1. Создали объект, например, с помощью mapCreateSiteObject;
2. Добавили в него метрику mapAppendPointPlane;
3. Не сохраняя запросили площадь у него напрямую (без всяких лишних поисков) - mapSquare
4. Освободили объект - mapFreeObject.

Желательно, конечно, не создавать и удалять объект каждый раз (даже в памяти), а пока он нужен для работы режима просто очищать ему метрику и заполнять заново.
 
Не надо записывать объект в карту.
Вы создаете его функциями ГИС-ядра.
После добавления метрики вызываете АПИ функцию расчета площади.
// Вычисление уточненной площади объекта на местности
// Для вычисления площади объекта его координаты пересчитываюся
// в проекцию топографической карты ближайшей зоны!
// mapPrecisionSquare выполняет деление полигона по участкам,
// занимающим по долготе не более 6 градусов для повышения точности
// вычислений (метрика не должна иметь самопересечений)
// Obj   - идентификатор объекта карты в памяти
// При ошибке возвращает 0

function  mapSquare(Obj : HObj): double;
Страницы: 1
Читают тему (гостей: 1)



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

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