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

GPS


Martifan

Вопрос

Доброго времени сутки
пишу аппликацию где используется GPS (компонент TLocationSensor) вроде работать нормально но время от времени он маркер мгновенно перескакивает на другие координаты и обратно возвращается но когда я пользуюсь компонентом
TMapView "синяя точка" стабильно показывает мои координаты в чем проблема кто знает?
Ссылка на комментарий

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

  • 0

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

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

Аналогично, я бы тоже хотел это знать. Видимо тут сам гугл чего-то подшаманивает, помогая установить точное положение.

если честно я сомневаюсь что это так

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

Пока придумал вести список последних N-координат (я взял 10) и

1.) сравнивать последнюю полученную с предыдущей на измененное расстояние. Если расстояние больше чем M-метров (в моем случае 100м), значит координата "захвачена" с базовой станции, а не GPS

if (GetDistance(x,y,x2,y2)>100) then Result:=false

2.) во время стоянки объекта проверять принадлежит ли последняя координата (Ш0,Д0) многоугольнику вершинами которого являются предыдущие координаты (Ш1,Д1) - (ШN, ДN).

  type
   tPolygon = array of tPoint; //tPoint - это запись, с  двумя полями, x и y
   ...
 function IsCoordInPoly(x,y: integer; myP: tPolygon): boolean; //x и y - это координаты  
 var                                                           //myP - массив с вершинами полигона
   i,j,npol: integer;
   inPoly: boolean;
 begin
   inPoly:=false;
   npol:=length(myP)-1;
   j:=npol;   
   for i:=0 to npol do
   begin
     if ((((myP[i].y<y) and (y<myP[j].y)) or ((myP[j].y<=y) and (y<myP[i].y))) and 
        (x>(myP[j].x-myP[i].x)*(y-myP[i].y) / (myP[j].y-myP[i].y)+myP[i].x))
          then inPoly:=not inPoly;
     j:=i;
   end;
   result:=inPoly;
 end;

 

Но не оставляю надежды добраться до координат самого MapView 

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

Пока придумал вести список последних N-координат (я взял 10) и

1.) сравнивать последнюю полученную с предыдущей на измененное расстояние. Если расстояние больше чем M-метров (в моем случае 100м), значит координата "захвачена" с базовой станции, а не GPS


if (GetDistance(x,y,x2,y2)>100) then Result:=false

2.) во время стоянки объекта проверять принадлежит ли последняя координата (Ш0,Д0) многоугольнику вершинами которого являются предыдущие координаты (Ш1,Д1) - (ШN, ДN).


  type
   tPolygon = array of tPoint; //tPoint - это запись, с  двумя полями, x и y
   ...
 function IsCoordInPoly(x,y: integer; myP: tPolygon): boolean; //x и y - это координаты  
 var                                                           //myP - массив с вершинами полигона
   i,j,npol: integer;
   inPoly: boolean;
 begin
   inPoly:=false;
   npol:=length(myP)-1;
   j:=npol;   
   for i:=0 to npol do
   begin
     if ((((myP[i].y<y) and (y<myP[j].y)) or ((myP[j].y<=y) and (y<myP[i].y))) and 
        (x>(myP[j].x-myP[i].x)*(y-myP[i].y) / (myP[j].y-myP[i].y)+myP[i].x))
          then inPoly:=not inPoly;
     j:=i;
   end;
   result:=inPoly;
 end;

 

Но не оставляю надежды добраться до координат самого MapView 

Спасибо за ответ

но если не сложно можешь выслать маленький рабочий пример?

и откуда берёшь GetDistance?

заранее спасибо

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

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

Вот что нашёл (в английском не дока), но всё же:

Hi all,
this is a very great news!
Me and my CEO (Daniele Tetibit Time Professionals) have figured out how to implement and use the LocationSensor on Android Service.

Код примера использования этого сервиса

Может, кто "копнёт"?

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

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

Вот что нашёл (в английском не дока), но всё же:

Hi all,
this is a very great news!
Me and my CEO (Daniele Tetibit Time Professionals) have figured out how to implement and use the LocationSensor on Android Service.

Код примера использования этого сервиса

Может, кто "копнёт"?

да это давно проходили но там такая же беда 

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

Спасибо за ответ

но если не сложно можешь выслать маленький рабочий пример?

и откуда берёшь GetDistance?

заранее спасибо

Собственно то что написал и есть пример. Но собственно нужно еще протестировать как будет работать при движении (я пока тестил когда объект неподвижен).

GetDistance я брал вроде у ZuBy:

function TFormMain.GetDistance(const aStart, aEnd: TMapCoordinate): Double;
const // определение расстояния между двумя точками
  Radius = 6372795; // примерный радиус земли
  PiDiv180=Pi/180;
var
  CosLatStart, SinLatStart, CosLatEnd, SinLatEnd, Delta, CosDelta, SinDelta, X, Y: Double;
begin
  try
    CosLatStart := Cos(aStart.Latitude * PiDiv180);
    CosLatEnd   := Cos(aEnd.Latitude * PiDiv180);
    SinLatStart := Sin(aStart.Latitude * PiDiv180);
    SinLatEnd   := Sin(aEnd.Latitude * PiDiv180);
    Delta := (aEnd.Longitude * PiDiv180) - (aStart.Longitude * PiDiv180);
    CosDelta := Cos(Delta);
    SinDelta := Sin(Delta);
    Y := Sqrt(((CosLatEnd*SinDelta)*(CosLatEnd*SinDelta))+
      ((CosLatStart*SinLatEnd-SinLatStart*CosLatEnd*CosDelta)
      *(CosLatStart*SinLatEnd-SinLatStart*CosLatEnd*CosDelta)));
    X := SinLatStart * SinLatEnd + CosLatStart * CosLatEnd * CosDelta;
    Result := Round(ArcTan2(Y, X) * Radius);
  except
    Result := -1;
  end;
end;

 

10 часов назад, Alexander сказал:

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

Вот что нашёл (в английском не дока), но всё же:

Hi all,
this is a very great news!
Me and my CEO (Daniele Tetibit Time Professionals) have figured out how to implement and use the LocationSensor on Android Service.

Код примера использования этого сервиса

Может, кто "копнёт"?

Alexander, Решение рабочее

 

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

Проверил в движении - IsCoordInPoly работает некорректно, координаты перестают идти вообще. :( Видимо этот алгоритм работает если многоугольник без самопересечений, а в нашем случае координаты располагаются хаотично, да и многоугольник при движении вытягивается сильно. Есть какие-нибудь другие алгоритмы проверки?

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

Геометрически этот вопрос решить нереально, не в каждом проекте идёт постоянное снятие GPS координат дабы по каким либо закономерностям вычисления проводить... бывает 2 координаты и вторая уже швах

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

Геометрически этот вопрос решить нереально, не в каждом проекте идёт постоянное снятие GPS координат дабы по каким либо закономерностям вычисления проводить... бывает 2 координаты и вторая уже швах

Что значит "и вторая уже швах"? Вы имеете в виду что она определилась по БС и слишком далеко от реального местоположения? Или что-то иное? 

Фактически самое трудное определить движение объекта, так как сенсор Speed отдает редко - на мой взгляд только геометрически решить и можно. Только нормальный алгоритм придумать нужно.

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

krapotkin, что вы имеете в виду под "скорость перемещения объекта"? Speed который отдает сенсор? Если да, то он отдает Speed крайне неохотно, часто выдает NaN.

Если объект стоит на месте, то сенсор все равно периодически отдает координаты (может и несколько координат за 5 секунд выдать)... объект стоит на месте, а координаты идут (они не нужны). Как отличить от реального (например медленного) движения?

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

ненене. это вообще генератор случайных чисел ))
скорость в школьном понимании v = s / t

у меня диспетчерская система электротранспорта ебурга
пару лет назад только устаканилось качество сигнала,
до этого размах координат был в радиусе 25 метров, а у стоячих вообще больше сотни...

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

Что значит "и вторая уже швах"? Вы имеете в виду что она определилась по БС и слишком далеко от реального местоположения?

ага... стояла к примеру задача: один чел прошёл некие объекты и снял их координаты, через некоторое время выдвигается второй чел по этим координатам и вот тут, когда он понимает что точность всего лишь +- километр, наступает печалька. В данный момент первому челу приходится перепроверять снятые GPS координаты обзором их на карте, от чего хотелось бы избавится.

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

а что, скорость перемещения объекта не подходит?

если она сильно выбивается из нормы, то явно что-то не так

скорость в школьном понимании v = s / t

Написал функцию которая считает среднюю скорость по трем последним координатам... так скорость скачает от 0 до 120км/ч. 

Координаты выбрасываются непредсказуемо в любое время, чем меньше время между координатами, тем больше v = s / t (разброс дистанции 10-25метров). И это при том что объект стоит на месте. 

Допустим между двумя координатами прошла 1 секунда, а расстояние 20м. Значит скорость v=20м/сек=72км/ч 

Ну и как на это можно ориентироваться?

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

Попробовал сравнивать последнюю координату и 10ую. При стоянке выдает скорость от 0.2 до 0.7км/ч, ну хоть как-то можно использовать для определения топтания на месте.

 

function TAndroidServiceDM.GetSpeed(Lat,Lon: double; Dat:integer; LC: TList<TCoords>):double;
var
  Speed: double;
  SecBetween: integer;
  DstBetween: real;
begin
  Speed:=-1;
  if LC.Count>=10 then 
  begin
    SecBetween:=Dat-LC[9].Dat;
    DstBetween:=GetDistance(Lat,Lon,LC[9].Lat,LC[9].Lon);
    if (SecBetween<>0) then Speed:=3.6*DstBetween/SecBetween;
  end;
  Result:=Speed;
end;

Проверил в движении, скорость получается с запазданием и долго показывает скорость когда объект уже остановился, что собственно логично, но по крайней мере скорость почти идентична той что выдает программа Статус GPS. 

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

ну так берем перемещение за N секунд и смотрим, можно ли было гонять 70 км.ч пешком
если построить гистограмму скоростей, одна будет сильно выбиваться

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...