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

KFF (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » KFF
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 ... 317 318 319 320 321 322 323 324 325 326 327 След.
mapSetObjectPress
 
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);
срабатываю корректно (изменяя при этом линейку в свойстве объекта)
Почему-бы не учесть это для вышеописанных функций ?
Изменено: XENA - 15.02.2009 20:19:33
mapSetObjectPress
 
Еще раз здравствуйте Александр !
Если диалог заходит в тупик то показываю наглядно:
КОД:
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
это уже кому как нравится.
Изменено: XENA - 20.02.2009 14:55:59
mapSetObjectPress
 
То есть Вы имете ввиду что
функция mapSetObjectPress никак не влияет на
свойство объекта "Не сжимать" ?
Тогда раскажите пожалуйста кроме "границ видимости"
какие еще свойства отображения, можно выставить для отдельного
объекта КАРТЫ (не классификатора!)
И каким образом в ГИС Панорама отследить обратные функции к
mapSetObjectPress/mapSetObjectScale
mapGetObjectPress и mapGetObjectScale соответсвенно.
Простыми словами
где в Панораме отследить действие функций
mapSetObjectPress/mapSetObjectScale
----------------------------
Благодарю за 1-ю коррекцию !
mapSetObjectPress
 
Здравствуйте !
попробуйте функцию mapSetObjectScale
Не забудьте учесть(исправлено) в классификаторе                    
галочку "растягивать".
------------------------
К Разработчикам:
Данные функции mapSetObjectPress и mapSetObjectScale
срабатывают НО: в ГИС Панорама -> Свойства объекта -> Вид
Галочки отсутсвуют ?
Изменено: XENA - 14.02.2009 18:31:27
Временный объект
 
Здравствуйте 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;
Изменено: KFF (Фёдор) - 04.10.2009 22:21:23
GIS Web Administrator
 
Здравствуйте господа разработчики GIS Web Administrator-а!
ВОзникло парочка вопросов:
1. При добавлении карт в список, "сбивается" путь в диалоговом окне.
Если вставляется несколько карт с одной и той же папки другого диска
затормаживается процесс настройки.
Просьба подкорректировать код.
-----------------
при вызове диалога "Открыть карту" (или в объекте TOpenDialog)
уберите пожалуйста со свойства Directory текущую папку.
2. Возникают непонятные процессы в ветке:
"Темы"->"Таблицы базы данных"
Если развернуть данную ветку в правой нижней части формы появляется
перечень активных таблиц БД. Если кликать на одну из таблиц N раз -
столько же раз она добавляется в данную ветку.

ЗАРЕНЕЕ БЛАГОДАРЮ ЗА ОТВЕТ
Изменено: XENA - 14.02.2009 12:39:52
Не тот глуп кто не знает, а тот, кто не знает где искать.
проверка нахождения точки на контуре объекта
 
Здравствуйте Алексей Игнатьев!
[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. Потом цикл можно прерывать
Изменено: XENA - 08.02.2009 22:13:49
карта формата SXF, метрика в градусах
 
Здравствуйте V_Bolotoff !
[QUOTE]
К сожалению, я не могу подобрать заголовок SXF при условии хранения координат объектов в градусах.
[/QUOTE]
Вообще-то если координаты объекта хранятся в градусах или радианах заголовок значения не имеет.
Главное что-бы он был корректен (в синтаксическом и логическом смысле) этого слова.
Какие геодезические параметры проекции и Dаtum-а Вы выставите зависит от Вас.
Если выставите как топограифческую карту ГИС Панорама воспимет ее в одном виде, если как
стереографическую то в другом.
При открытии карты SXF ГИС Панорама сама преобразует ее в ту проекцию и СК которую Вы указали.
------------
Если же Вас интересует конкретный вид карты (точнее сетки в ней), рекомендую прочитать литературу
по проекциям в которой Вы можете выбрать такой вид какой Вас устроит и заполнить, соотвественно,
заголовок SXF по законам ГИС Панорамы.
------------
PS: "Картинка" (вид карты) в ГИС Панорама, поверьте мне, будет совпадать с той которую Вы выберете в
книжке по проекциям.
карта формата SXF, метрика в градусах
 
Здравствуйте господин V_Bolotoff!
Если Вы так виртуозно разобрали SXF формат
то почему посредством средств ОС не можете
"тупо" срезать все объекты с файла
(зная конечно смещение гед они начинаються)
создать свой заголовок-паспорт и сшить 2 дампа ?
----------------------------
ГИС Панорама заглотнет Ваши объекты с коориднатами в радианах
с таким паспортом, какой Вы укажете.
Страницы: Пред. 1 ... 317 318 319 320 321 322 323 324 325 326 327 След.



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

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