1. Работа программера: [QUOTE]Несоответствие флагов должно исправляться контролем карты автоматически (в соответствии с приоритетом).[/QUOTE] в этом случае умножается на ноль первым же открытием карты ГИС Панорамой. В ситуации: узер выставил подписи для разношерсных, городов на не правильно прошелся задачей MapTask (все выровняно и смаштабировано) - все стало на места. Закрыл/Открыл - "0".
2. [QUOTE]Я писал для программеров. [/QUOTE] Но программеры под которых Вы пишите в свою очередь пишут под юзеров А они в свою очередь очень капризны. К примеру функции: _MAPIMP long int _MAPAPI mapObjectTopScale(HOBJ info); _MAPIMP long int _MAPAPI mapSetObjectTopScale(HOBJ info,long int scale); _MAPIMP long int _MAPAPI mapObjectBotScale(HOBJ info); _MAPIMP long int _MAPAPI mapSetObjectBotScale(HOBJ info,long int scale); срабатываю корректно (изменяя при этом линейку в свойстве объекта) Почему-бы не учесть это для вышеописанных функций ?
Еще раз здравствуйте Александр ! Если диалог заходит в тупик то показываю наглядно: КОД: Obj: HObj; // глобальная для модуля // на клик кнопкой begin stext:='Example Object'#0; Obj:=mapCreateSiteObject(MV.MapHandle,MV.MapHandle, KM_IDFLOAT2,0); mapRegisterObject(Obj,8888,OL_TEXT); // 8888 - объект типа подпись (создан вручную в классификаторе) mapAppendPointPlane(Obj, 6171670,7405930,0); // координаты верхнего левого угла Подольска (в рамке) mapAppendPointPlane(Obj, 6171670,7408450,0); mapAppendSemantic(Obj,9,PChar(stext),LenGth(sText)); mapPutText(Obj,PChar(stext),0); mapCommitObject(Obj); MV.Repaint; end;
// второй клик var _press, _scale : integer; begin _press:=1; _scale:=1; mapSetObjectPress(Obj,_Press); mapSetObjectScale(Obj,_scale); mapCommitObject(Obj); // сохраняем end; ------------------------------- в результате : объект есть, подпись тоже есть в свойствах данного объекта галочек "Сжимать" и "Масштабируемость" нет.
Здравствуйте ! 1. Ищем объект через mapSeekObject (или другую функцию класса Seek) 2. Пишем следующий код mapRegisterObject(Obj,КОД_КЛАСИФИКАТОРА,ЛОКАЛИЗАЦИЯ); mapCommitObject(Obj); Все ! Следует учесть: Если исходный объект точечный, то естесвенно преобразование в площадной или линейный приведет к "несрабатыванию" mapRegisterObject --------------------------- PS: Можете воспользоватся mapDescribeObject вместо mapRegisterObject это уже кому как нравится.
То есть Вы имете ввиду что функция mapSetObjectPress никак не влияет на свойство объекта "Не сжимать" ? Тогда раскажите пожалуйста кроме "границ видимости" какие еще свойства отображения, можно выставить для отдельного объекта КАРТЫ (не классификатора!) И каким образом в ГИС Панорама отследить обратные функции к mapSetObjectPress/mapSetObjectScale mapGetObjectPress и mapGetObjectScale соответсвенно. Простыми словами где в Панораме отследить действие функций mapSetObjectPress/mapSetObjectScale ---------------------------- Благодарю за 1-ю коррекцию !
Здравствуйте ! попробуйте функцию mapSetObjectScale Не забудьте учесть(исправлено) в классификаторе галочку "растягивать". ------------------------ К Разработчикам: Данные функции mapSetObjectPress и mapSetObjectScale срабатывают НО: в ГИС Панорама -> Свойства объекта -> Вид Галочки отсутсвуют ?
Здравствуйте Tim ! Судя по вопросу, вы наверное пишите приложение мониторинга ? Посмотрите пожалуйста : содержимое ПАПКИ "ГИСТоолКит\Example\Trafic1" [URL=http://www.mediafire.com/file/hy3t4y3kwam/Traffic.rar]СКАЧАТЬ[/URL] там целый пример движения объекта (даже с поворотом карты) Причем все на Api функциях. может чем-то поможет ? ------------------------------------------- А если нет КОД:
var Screen: TMapScreen; // объект GisToolKit ............... // процедура обновления и разрисовки begin // обновляем метрику: mapUpdatePointPlane(FObj,FPos.X,FPos.Y,1,0); PaintObjMove(Screen,FPos); end;
// данная процедура - является выборкой самых необходимых // API функций и условий с того-же примера Trafic1.
procedure PaintObjMove(FMap:TMapScreen;pPos : TDoublePoint); var cRect : TRect ; pnt,delta : TPoint; dp,P : TDOUBLEPOINT; FImg : TPAINTPARM; aScreenDc : HDC; fflag : boolean; begin if FMap = nil then exit; dp.X := FMap.MapLeft; dp.Y := FMap.MapTop; P:=pPos; mapPlaneToPicture(FMap.MapHandle,P.X,P.Y);
Delta.Y:=Round(0.5*mapScreenMeter2Pixel(FFrame.X2-FFrame.X1)/FMap.ViewScale); Delta.X:=Round(0.5*mapScreenMeter2Pixel(FFrame.Y2-FFrame.Y1)/FMap.ViewScale); Pnt:=Point(trunc(P.X-FMap.MapLeft),trunc(P.Y-FMap.MapTop)); fflag := FVisible; FVisible:=not((Pnt.X<Delta.X) or (Pnt.X>FMap.Width-Delta.X) or (Pnt.Y<Delta.Y) or (Pnt.Y>FMap.Height-Delta.Y));
// уберем объекты пользователя в буфере экрана if Assigned(pf_scrClearObjects) then case FClear.Left=-1 of true : pf_scrClearObjects(TMapView(FMap).FMapScreen, nil); false: if fflag then pf_scrClearObjects(TMapView(FMap).FMapScreen, @FClear); end; // *****> ТУТ 2 пути или рисуем или нет // объект вне видимости ничего не рисуем => ВЫХОД if not FVisible then exit;
// перерисуем карту из буфера в окно cRect := rect(0, 0, FMap.MapWidth, FMap.MapHeight); // проверим попадает ли объект в клиентскую обасть ? FClear := Rect(pnt.X-Delta.X, pnt.Y-Delta.Y, pnt.X+Delta.X, pnt.Y+Delta.Y); if Assigned(pf_scrPaintScreen) then pf_scrPaintScreen(TMapView(FMap).FMapScreen, TMapView(FMap).FCanvas.Handle, cRect);
FIMG:=FImage; if TMapView(FMap).FMapScreen = 0 then mapViewMapObject(FMap.MapHandle, FMap.Handle, dp, FIMG, FObj, cPP_PICTURE) else if Assigned(pf_scrDrawMapObject) then pf_scrDrawMapObject(TMapView(FMap).FMapScreen, FIMG, FObj); // обновим окно на экране InvalidateRect(FMap.Handle, @FClear, false); end;
Здравствуйте господа разработчики GIS Web Administrator-а! ВОзникло парочка вопросов: 1. При добавлении карт в список, "сбивается" путь в диалоговом окне. Если вставляется несколько карт с одной и той же папки другого диска затормаживается процесс настройки. Просьба подкорректировать код. ----------------- при вызове диалога "Открыть карту" (или в объекте TOpenDialog) уберите пожалуйста со свойства Directory текущую папку. 2. Возникают непонятные процессы в ветке: "Темы"->"Таблицы базы данных" Если развернуть данную ветку в правой нижней части формы появляется перечень активных таблиц БД. Если кликать на одну из таблиц N раз - столько же раз она добавляется в данную ветку.
Здравствуйте Алексей Игнатьев! [QUOTE]...хотел спросить есть ли какая-нибудь функция проверяющая есть ли точка с заданными координатами на контуре объекта(линейного,незамкнутого).Подскажите выход из этой ситуации...[/QUOTE] Используя алгоритм описанный выше, Вы сможете проверить совпадает ли Ваша точка с одной из вершин. Поддерживаю разработчиков по этой теме. Такой функции нет и быть не может. Точки попадают на ребро (как я понимаю) полилинии только в книжках по математике. В реальности, в ГИС Системах Вы никогда не выставите точку точно на ребро. Для такой задачи необходим другой алгоритм, реализованный в ГИС Панорама как диалог "выбор объекта карты", в котором указывается радиус поиска и.т.п. Как раз он выполняет ту задачу которую Вам надо реализовать. Если в соостветсвующей компоненте отключить отображения диалога то Вы получите 0-если не попадает и HOBJ если попадает.
PS: А если конкретней (судя по форуму какой Вы выбрали-Вы программист): Держите кусок о кода который может Вам помочь (на ПАСКАЛЕ) // отрезок с окружностью // p1,p2 - начало/конец отрезка // Cnt- координаты Вашей точки // R - радиус поиска // Cross - результат (0,1,2 - точки пересечения) // результат функции false если точек пересечения 0
function CrossLineToCircle(p1,p2,Cnt : TDoublePoint;R:double; var Cross : TDoubleArray): boolean; var A0,B0, A,B,C, D: double; begin result:=false; Finalize(Cross); if P1.X-P2.X<>0 then begin A0:=(P2.Y-P1.Y)/(P2.X-P1.X); B0:=P1.Y-A0*P1.X; D:=b0-Cnt.Y; A:=sqr(A0)+1; B:=2*A0*D-2*Cnt.X; c:=sqr(Cnt.X)+sqr(D)-sqr®; D:=sqr(b)-4*A*C; if (D<0) then exit; C:=(-b+sqrt(D))/(2*a); if ((C<=max(P1.X, P2.X)) and (C>=min(P1.X, P2.X))) then begin SetLenGth(Cross,1); Cross[0].X:=C; Cross[0].Y:=A0*C+B0; end; D:=(-b-sqrt(D))/(2*a); if (D<>C) and ((D<=max(P1.X, P2.X)) and (D>=min(P1.X, P2.X))) then begin SetLenGth(Cross,LenGth(Cross)+1); Cross[High(Cross)].X:=D Cross[High(Cross)].Y:=A0*D+B0; end; end else begin B:=-2*Cnt.Y; C:=sqr(Cnt.Y)+sqr(P1.X-Cnt.X)-sqr®; D:=sqr(B)-4*C; if D<0 then exit; A0:=(-b+sqrt(D))/2; if ((a0<=max(P1.Y, P2.Y)) and (a0>=min(P1.Y, P2.Y))) then begin SetLenGth(Cross,1); Cross[0].X:=P1.X; Cross[0].Y:=a0; end; A:=(-b-sqrt(D))/2; if (a0<>a) and ((A<=max(P1.Y, P2.Y)) and (A>=min(P1.Y, P2.Y))) then begin SetLenGth(Cross,LenGth(Cross)+1); Cross[High(Cross)].X:=P1.X; Cross[High(Cross)].Y:=a; end; end; result:=LenGth(Cross)>0; end; ------------------------ ПРОГНАВ ВСЕ отрезки объекта используя функции mapXPlane, mapYPlane через Вашу точку получите результат. Если нужно просто найти до первого true. Потом цикл можно прерывать
Здравствуйте V_Bolotoff ! [QUOTE] К сожалению, я не могу подобрать заголовок SXF при условии хранения координат объектов в градусах. [/QUOTE] Вообще-то если координаты объекта хранятся в градусах или радианах заголовок значения не имеет. Главное что-бы он был корректен (в синтаксическом и логическом смысле) этого слова. Какие геодезические параметры проекции и Dаtum-а Вы выставите зависит от Вас. Если выставите как топограифческую карту ГИС Панорама воспимет ее в одном виде, если как стереографическую то в другом. При открытии карты SXF ГИС Панорама сама преобразует ее в ту проекцию и СК которую Вы указали. ------------ Если же Вас интересует конкретный вид карты (точнее сетки в ней), рекомендую прочитать литературу по проекциям в которой Вы можете выбрать такой вид какой Вас устроит и заполнить, соотвественно, заголовок SXF по законам ГИС Панорамы. ------------ PS: "Картинка" (вид карты) в ГИС Панорама, поверьте мне, будет совпадать с той которую Вы выберете в книжке по проекциям.
Здравствуйте господин V_Bolotoff! Если Вы так виртуозно разобрали SXF формат то почему посредством средств ОС не можете "тупо" срезать все объекты с файла (зная конечно смещение гед они начинаються) создать свой заголовок-паспорт и сшить 2 дампа ? ---------------------------- ГИС Панорама заглотнет Ваши объекты с коориднатами в радианах с таким паспортом, какой Вы укажете.