Перейти к содержанию
Fire Monkey от А до Я
  • 0

Работа с маркерами


Rusland

Вопрос

Создаю маркер так

procedure TFormMain.SetMarker(Lat,Lon:Double);
var
  Descrip: TMapMarkerDescriptor;
  MyLocation: TMapCoordinate;
  Angle:integer;
begin 
  TThread.Queue(nil, procedure
  begin
    try
      if (TabControl.ActiveTab=TabMap)and((PrevLat<>Lat) or (PrevLon<>Lon)) then
      begin        
        MyLocation:=TMapCoordinate.Create(Lat,Lon);
        MapView.Location:=MyLocation;
        Descrip:=TMapMarkerDescriptor.Create(MyLocation);
        Descrip.Icon := Image1.Bitmap;
        Descrip.Draggable:=True;   
        Descrip.Title:='Маркер '+#10+#13+Descrip.Position.ToString;
        if Assigned(MyMarker) then MyMarker.Remove;
        MyMarker:=MapView.AddMarker(Descrip); 
        PrevLat:=Lat;
        PrevLon:=Lon;
      end;
    except
      LabInfo.Text:='Произошла ошибка'; 
    end;
  end);
end;

Маркер я сделал Draggable, то есть его можно переносить сделав на нем долгий Tap.

Можно ли навесить какую-то свою функцию на изменение положения маркера? Я хочу при изменении положения маркера менять ему в Title его координаты.

И еще интересует как сделать Title в две строки?  #10+#13 почему-то не делает переноса.

Изменено пользователем Rusland
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

 

 

но я выяснил что в памяти всегда хранится дискриптор последнего добавленного маркера на карту.

да, если ты работаешь не с маркером, а с описанием маркера. это ведь очевидно, что вбил в него последнее, то и прочитал

а если читать с маркера, то будешь получать правильные данные

 

Спасибо за пояснение.... просто уже глаз "замылился" и немного затупил. разобрался. все работает как надо.

Ссылка на комментарий
  • 0

Подскажите как заставить маркер перетаскиваться по карте?

сделал на нажатие по маркеру 

Цитата

procedure TForm4.MapView1MarkerClick(Marker: TMapMarker);
begin
tapDescr.Draggable:=true;
end;

но ни с места.

Ссылка на комментарий
  • 0
3 часа назад, Rusland сказал:

AndroidHalfNoob, я указываю при создании Descrip.Draggable:=True; и тогда маркер умеет двигаться (нужно на нем тапнуть и подержать).

Можешь еще подсказать как удалить все маркеры? если например у меня на форме были раставлены маркеры. потом я переключился на другую форму. и при возврате на предыдущую у меня должны все маркеры что там были удалиться и создаться новые. уже дополненные.

пробую код 

if assigned (Marker) then Marker.remove

что то типа такого. строчку на память написал. сейчас перед глазами нет кода.

или тут был еще кусок кода с "загоном" всех маркеров в 

TList<TMapMarker>;

подскажи если этим способом пользоваться, какой модуль надо подключать чтобы описать TList

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0

При добавлении маркера его нужно запомнить, например, сохраняем его в лист:

public
  FMarkers: TList<TMapMarker>;

procedure TFormMain.FormCreate(Sender: TObject);    
begin  
  FMarkers :=TList<TMapMarker>.Create;
end;
Descrip:=TMapMarkerDescriptor.Create(MyLocation);
Descrip.Draggable:=True; 
Descrip.Title:='Маркер1';
Descrip.Snippet:='[1]';
MyMarker:=MapView.AddMarker(Descrip);
FMarkers.Add(MyMarker);

 

Тогда удаляем все маркеры так: 

procedure TFormMain.ClearMarkersList;
var
  Marker: TMapMarker;
begin
  for Marker in FMarkers do
  begin
    Marker.Remove;
    Marker.Free;
  end;
  FMarkers.Clear;
end;

 

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
1 час назад, Rusland сказал:

При добавлении маркера его нужно запомнить, например, сохраняем его в лист:


public
  FMarkers: TList<TMapMarker>;

procedure TFormMain.FormCreate(Sender: TObject);    
begin  
  FMarkers :=TList<TMapMarker>.Create;
end;

Descrip:=TMapMarkerDescriptor.Create(MyLocation);
Descrip.Draggable:=True; 
Descrip.Title:='Маркер1';
Descrip.Snippet:='[1]';
MyMarker:=MapView.AddMarker(Descrip);
FMarkers.Add(MyMarker);

 

Тогда удаляем все маркеры так: 


procedure TFormMain.ClearMarkersList;
var
  Marker: TMapMarker;
begin
  for Marker in FMarkers do
  begin
    Marker.Remove;
    Marker.Free;
  end;
  FMarkers.Clear;
end;

 

да. этот код я уже встречал, но он не запускается так как в

Цитата

 public
  FMarkers: TList<TMapMarker>;

подчеркивается TList

я так понял что необходимо какой то модуль подключить в проекте в разделе Uses. надо подключать   SysUtils или что то другое?

Ссылка на комментарий
  • 0
2 часа назад, Rusland сказал:

Надо подключить   System.Generics.Collections

Ок. попробовал. все хорошо работает.

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0
1 час назад, AndroidHalfNoob сказал:

Кстати Rusland ты разобрался как отобразить обновленные координаты при перетаскивании маркера?

Нет, пока забросил эту тему

Ссылка на комментарий
  • 0

Вот и  я сейчас столкнулся с данной проблемой. Что при перетаскивании маркера указываются его координаты при создании, а новые координаты не могу сообразить пока как сделать.

Ссылка на комментарий
  • 0

что-то похожее я реализовал чуток другим способом... 

при нажатии на маркер я показываю юзеру кнопку (создать новое положение маркера) после нажатия на которую я убираю маркер и жду события OnMapClick, которое создаст новый маркер

procedure TFGPS.MapView1MapClick(const [Ref] Position: TMapCoordinate);
begin
  if NOT(WaitTapForGPS) then exit;
  WaitTapForGPS:= False;

  GPS_X:= Format('%2.6f', [Position.Latitude]);
  GPS_Y:= Format('%2.6f', [Position.Longitude]);

  MarkerAdd(GPS_X, GPS_Y, 'New GPS coord');
end;

Правда у меня чуток другая задача... а разве в вашем случае возвращаемый TMapMarker из события OnMarkerDragEnd не содержит в себе новые координаты?

Ссылка на комментарий
  • 0

как оказалось нет. наверное так и придется делать. при запуске формы ставить на карту маркер, а если щелкаешь на карту пальцем, то маркер удалять и создавать новый и уже записывать его координаты. с перетаскиванием то эффектнее смотрится:) но событие MapView1MarkerDragEnd не возвращает его новые координаты на карте.

Ссылка на комментарий
  • 0

Нашел такой выход: 

Цитата

procedure TForm1.MapView1MarkerDragEnd(Marker: TMapMarker);
begin
tapDescr.Position:=MapView1.Location;
Label1.Text:= floattostr(tapDescr.Position.latitude);
Label2.Text:=floattostr(tapDescr.Position.longitude);
end;

точность немного страдает, но 

2016_03_30_14.23.12[1].png

20160330_142046[1].jpg

Ссылка на комментарий
  • 0
8 минут назад, beklexx сказал:

ну тут уж от зума зависит точность ... ибо от середины карты до края экрана может быть и километр и поболее))

ну да. тут расчет на то, что пользователь захочет как можно точнее указать свое местоположение и будет по максимуму зуммировать карту:)

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0

Придумал при перетаскивании маркера создавать новый маркер в этой позиции но не выводить его на экран. координаты меняются, но в каком то странном формате они отображаются.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...