[QUOTE]Олег Касьянов написал: 1. Подскажите, есть ли возможность обеспечить запуск потоковой задачи ГИС-Карта до открытия какой-либо карты[/QUOTE] Олег, ниже я напишу последовательность действий, а ты решай это оно или не оно
1. запуск задачи 2. нажатие какой то кнопки "потоковой задачи" 3. создание отдельной карты и отдельного хендла без привязки к хендлу карты, который тебе передали через CallMapFunction(Ex) 4. выполнение каких то операций по наполнению новой карты данным (из БД, обменного формата, другой карты и.т.п) ненужное вычеркнуть 5. закрытие карты 6. если карта наполнена так как тебе нужно задётся вопрос - "подключить карту ?" [B] если ДА[/B] - отправляешь в ГИС Панораму сообщение SendMessage(Handle, AW_OPENDOC, 0 , 'путь к карте'); где Handle это то, что тебе передают на вход через CallMapFunction в структуре TMapTask [B] если НЕТ[/B] удаляешь карту даже не показывая оператору что она существовала в принципе
Вместо карты можно создать SIT(X) по паспорту текущей карты как отдельный файл, который после закрытия подключается к основной карте через функцию mapOpenSiteForMap ... или удаляется как мусор, если что-то не так
если тебе нужно сделать это до того, как открыта первая карта , то нужно просить разработчиков, чтобы они предусмотрели в ГИС Панораме возможность запуска задач без карты п.с. например если мне нужно проверить(смоделировать) подобную функцию я называю свою задачу именем какой то стандартной задачи которая вызывается с главного меню ГИС Панорамы, например конверторе импорта в меню Файл->Импорт
[QUOTE]Олег Касьянов написал: 2. Может ли пользователь сам каким-то образом дополнить список поддерживаемых ГИС-Картой проекций?[/QUOTE] Олег, копай в сторону этого блока функций [URL=http://help.gisinfo.ru/showresult.php?file=mapapi.htm&search=mapCreateUserSystem#1]http://help.gisinfo.ru/showresult.php?file=mapapi.htm&search=mapCreateUserSystem#1[/URL]
[QUOTE]Oleg Belenkov написал: У меня значение такое: расстояние 2 535 212.0966, азимут 82.78878[/QUOTE] Подал. Библиотека mapacces64.dll выдаёт правильный результат, который Вы указали выше
Проблема возникла при расчёте расстояния между аэродромами Бирмингем и Борисполь, которая привела к некорректному направлению расчёта маршрута пролёта рейса. Получилось, что у меня Бирмингем дальше (почти как экватор - 40 000 км) от Борисполя чем Манила (столица Филлипин) которая втрое дальше
Здравствуйте господа разработчики ! В ядре имеется следующая функция : [CODE] // Обратная геодезическая задача на эллипсоиде // 03/04/12 // Для расстояния не более 180 градусов по широте // Выполняется построение ортодромии функцией mapOrthodromeObject // и запрос длины объекта и азимута первого отрезка // Точность порядка точности триангуляции 1 класса // Вычисления выполняются на текущем эллипсоиде, установленном // в документе - mapSetDocProjection // hmap - идентификатор открытых данных // b1,l1 - геодезические координаты первой точки // b2,l2 - геодезические координаты второй точки // angle - рассчитанный азимут с первой точки на вторую // Возвращает расстояние между заданными точками на текущем эллипсоиде // При ошибке в параметрах возвращает 0
function mapInversePositionComputation(map : HMAP; b1, l1, b2, l2 : double; angle : pdouble) : double; // 20130128 Korolev {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF} external sGisAcces;[/CODE]Хочу задать несколько вопросов по этой функции
1. в каком формате подавать на вход b1, l1, b2, l2 если точка в западном полушарии (со стороны Европы, а не со стороны Дальнего Востока)? 2. Какое расстояние должна выдавать функция при следующих входящих параметрах (на эллипсодие WGS84) точка 1 N51°01'21.00" W001°06'25.00" в радианах b1=[B]+[/B]0.8905106176 l1= [B]-[/B]0.019319825192 точка 2 N48°21'41.00" E034°12'10.10" в радианах b1=[B]+[/B]0.84406546695 l1=[B]+[/B]0.59695157036 (Специально указал знаки значений)
[QUOTE]Алексей Азаренко написал: Но на самом деле я просто замазал ошибку.. а она осталась... и неплохо бы как то ее программно исправить. [/QUOTE] Пробовали подкинуть в папку с Вашим приложением недостающую библиотеку shape.iml ? :)
[QUOTE]Аслан Запенов написал: написать программу для расчета расстояния между населенными пунктами .... есть ли у кого нить исходники на С++[/QUOTE] [CODE]function mapInversePositionComputation(Map: HMAP; b1,l1,b2,l2: double; var angle: double): double;[/CODE] где Map - карта на которой расположены населённые пункты b1,l1 - геодезическая координата центра первого населённого пункта (в радианах) b2,l2 - геодезическая координата центра второго населённого пункта (в радианах) angle - рассчитанный азимут между первым и вторым населённым пунктом Функция возвращает длину между населёнными пунктами в метрах
[QUOTE]LMM написал: int res = mapGeneralFilterInMap(hMap, hMap, 1, 1.5, this->Handle); // res = 0[/QUOTE] Я указал лишь перечень интересующих Вас функций. Если нужно профильтровать выборку, я бы делал вот так: [CODE]if (cnt4) { HOBJ obj = mapCreateSiteObject(hMap, hMap); if (mapSeekSiteSelectObject(hMap, hMap, obj, hSelect, WO_FIRST)) do { mapGeneralFilter(hMap, obj, DELTANULL); // фильтрация отдельного объекта } while (mapSeekSiteSelectObject(hMap, hMap, obj, hSelect, WO_NEXT));
[QUOTE]Сергей Викторович написал: Но в результате все равно не создается объект пересечения двух площадных объектов. Что-то опять я не правильно делаю?[/QUOTE] Во первых , при пересечении двух [B]площадных [/B]объектов не создаются никакие объекты . Результат такого пересечения - вырезка с базового объекта, объектом "резаком" Во вторых, если Вы хотите достичь эффекта вырезания части объекта с базового при условии что оба объекта площадные, Вам необходимо выполнить следующие операции 1. создать линейный объект резак по координатам площадного аналога 2. выполнить разрезки базового объекта 3. сохранить результат вырезки 4. удалить временный объект резак [B]ИЛИ[/B] воспользоваться другим методом разрезки объектов (см. ниже)
Пример:[CODE]// функция поиска пересечений. Возвращает площадь пересечения function TMainForm.CalcCrossObject(ExtMap : HMap; baseObj, crossObj : HObj): double; var cross : HCross; obj : HObj; begin cross := mapCreateObjectsCross(baseObj, crossObj, OL_SQUARE, 0.001); result := 0; if Cross=0 then exit; obj := mapCreateSiteObject(ExtMap, ExtMap, KM_IDFLOAT3, 0); while mapGetNextCross(cross, obj)<>0 do result := result+mapSquareInMap(obj); mapFreeObjectsCross(cross); mapFreeObject(obj); end;[/CODE] где obj - результат пересечения вне зависимости от локализации по крайней мере так написано в описании функции [CODE]//******************************************************************** //* ФУНКЦИИ ПЕРЕСЕЧЕНИЯ ОБ'ЕКТОВ ЭЛЕКТРОННОЙ КАРТЫ * //* * //* Пересечение двух объектов; т.е. нахождение общей части объектов; * //* один из которых (ПЕРВЫЙ объект карты) - РЕЗАК(по которому режут) * //* другой (ВТОРОЙ объект карты) - ОБЪЕКТ; КОТОРЫЙ РЕЖУТ. * //* Только для ПЛОЩАДНЫХ или ЛИНЕЙНЫХ объектов !!! * //********************************************************************
// Пересечение двух объектов; т.е. нахождение общей части объектов; // один из которых (ПЕРВЫЙ объект карты) - РЕЗАК(по которому режут) // другой (ВТОРОЙ объект карты) - ОБЪЕКТ; КОТОРЫЙ РЕЖУТ. // // Создание класса пересечения // Только для ПЛОЩАДНЫХ или ЛИНЕЙНЫХ объектов !!! // info1 - первый объект карты - РЕЗАК (произвольный замкнутый контур; подобъекты не учитываются) // info2 - второй объект карты (площадной объект с подобъектами) // или // info1 - первый объект карты - РЕЗАК (произвольный замкнутый контур с подобъектами) // info2 - второй объект карты (линейный объект с подобъектами) // 09/08/04 // Пересечение произвольных площадных объектов с подобъектами - mapCreateObjectsCrossSquare(...) // method - тип результирующих объектов // LOCAL_SQUARE - площадной; LOCAL_LINE - линейный // тип результирующих объектов зависит от типа // второго объекта: // - если второй объект незамкнутый; то тип только LOCAL_LINE; // - если второй объект замкнутый; то тип может быть LOCAL_LINE или LOCAL_SQUARE. // При логическом сложении method и флага проверки входимости (FLAGINSIDEOBJECTS = 32 // см. maptype.h) в класс пересечения будут добавлены объекты; которые полностью входят // в объект - РЕЗАК (напр. LOCAL_SQUARE | FLAGINSIDEOBJECTS) //24/08/04 // precision - точность при дотягивании (в метрах); при precision=0 устанавливается точность //24/05/07 // 0.001 для карт масштаба <= 500000; // 0.01 для карт масштаба более 500000; если precision больше предложенной; то // устанавливается большее значение // Возвращает указатель на класс пересечения // При отсутствии пересечения или при ошибке возвращает 0
function mapCreateObjectsCross(aInfo1, aInfo2 : HOBJ; aMethod : integer; aPrecision : double) : HCROSS; {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}; external sGisAcces; // Пересечение двух объектов // Освобождение класса пересечения
// Запрос на пересечение двух объектов // Только для ПЛОЩАДНЫХ или ЛИНЕЙНЫХ объектов !!! // info1 - первый объект карты // info2 - второй объект карты // Если объекты пересекаются; возвращает 1 // При ошибке или неверном типе объектов возвращает 0
Олег, бросай задачу мне на ящик (надеюсь не забыл на какой) я тебе все один раз сделаю по человечески будешь использовать в качестве болванки в других задачах (в том числе для обучения подрастающего поколения программистов) 8)
[QUOTE]Татьяна Софинова написал: 1.При снятии флажка редактирования карт, событие в Pantask не происходит. [/QUOTE] Это не совсем так Татьяна. Отловить в ГИС Панораме можно абсолютно всё, в том числе движение мышки, запуск других задач и результат их выполнение Так бы и написали, эта функция недокументирована :D Показываю на ролике эффект "отлова флажка" который хочет Олег [VIDEO TYPE=YOUTUBE WIDTH=459 HEIGHT=344]//www.youtube.com/embed/ihP0shZUGSE?feature=oembed[/VIDEO] Отлов флажка read/only выполняется вот так (Олег, читай комментарии в коде, всё поймёшь) [CODE]type TMyTask= class(TPanTask) private FWrite : boolean; // флажок редактирования карты (для примера основнной) public function GetAction(comid : integer; run : integer) : HMAPACTION; procedure ChangeData; override; destructor Destroy; override;
function PrepareMessage(amessage : integer; awparam : WPARAM; alparam : LPARAM; var retcode : integer) :integer; override; // переопределяем обработчик end;
function TMyTask.PrepareMessage(amessage: integer; awparam: WPARAM; alparam: LPARAM; var retcode: integer): integer; var fflag : boolean; begin if (amessage=$B040) and (awparam=0) then // отлавливаем событие активации кнопко на чужих задачах begin fflag := mapGetSiteEditFlag(FHMap, FHMap)<>0; // и всегда проверяем флаг if fflag<>FWrite then // если флаг сменился, зачит кто-то запустил задачу "Состав карты" и сменил флаг case byte(fflag) of // обрабатывам (примитивно сообщением) 1: ShowMessage('Основная карта в READ/WRITE'); 0: ShowMessage('Основная карта в READ ONLY'); end; FWrite := fflag; // запоминаем флаг end;
end;
procedure TMyTask.ChangeData; begin inherited; FWrite := mapGetSiteEditFlag(FHMap, FHMap)<>0; // запоминаем начальное состояние статуса главной карты (можно Сита, можно всех ситов и.т.п)
end;[/CODE]
[QUOTE]Татьяна Софинова написал: 2.Смена языка обрабатывается в EnableActionUn. [/QUOTE] Татьяна, немного не так. Смена языка отлавливается вот этой экспортной функцией [CODE] // Извещение об изменени языка диалогов и меню procedure utsChangeLanguage(htask : HPANTASK; aparm : TTASKPARM); stdcall;[/CODE]где aparm.Language = новый язык. aparm
После неё, вызывается EnableAction для того, чтобы программист "подсунул" название кнопок на нужном языке. и вообще, EnableAction вызывается по поводу и без повода при любых изменениях панели, от движения мышки по кнопке (событие на Hint) и до сворачивания/разворачивания окна карты [QUOTE]Олег Касьянов написал: 3. Что может приводить к блокировке кнопок панели? [/QUOTE] Блокировка всех кнопок в цикле
======================== Я делаю очень просто . 1) создаю форму пустышку (которую потом погу вклчить в ЕХЕ файл для отладки без ГИС Панорамы) 2) на форме пустышке создаётся единственный TToolBar на котором я создаю кнопки и сеператоры 3) в каждую кнопку заполняю следующее - в Hint русское название кнопки - в Сaption английское название кнопки - в Tag команду которая присваивается кнопке ( всмысле IDT_USER+ххх) - в Enabled - активно/неактивность кнопки - в Visible - видимость/невидимость (использую для работы фоновых Action) вызываемых с форм уже при нажатой кнопке 4) в 2011 версии в кнопку загружал рисунок, который потом перерисовывал, теперь это делаю тупо для красоты Рисунки в 12-й версии уже не рисуются специальными функциями, а просто загружаются в виде прозрачных картинок PNG с названием равным номеру команды. В таком случае, ГИС панорама сама за картинками "следит" [B]Всё.[/B]
На подготовительном этапе делаю в цикле insertbuttonPNG (новая команда под 12ю версию) На этапе EnabledAction нахожу по значению тега (который равен команде передаваемой мне через экспортную функцию) нужную кнопку и считываю с ней состояние Enabled а также в зависимости от Fparam.Language возвращаю Панораме в структуре TTASKBUTTON или значение caption (русский текст) или значение (Hint - английский текст)
Кстати, Caption и Hint самого TToolBar-а использую для русского/англ. названия самой задачи