使用相同参数给出不同结果的函数

时间:2016-04-22 14:52:28

标签: google-maps delphi gmlib

我使用GMLib处理谷歌地图,现在我已经到了很困惑的地步。 我有GetDistance和GetHeading函数来计算地图上2个标记之间的距离和罗盘方向。 当我从我的程序GetHeadingDistance中调用它时,我得到了我期望的结果(距离和方向是正确的) - aSearchCallInfo是一个包含需要使用值更新的信息的类。

现在我正在尝试添加一个功能,让用户在地图上按下鼠标右键并获取有关该位置的信息。

但在这种情况下,我的结果非常错误。据我所知,结果它使用GMMarker.Items [1] .Position作为源,即使我知道它是GMMarker.Items [0] .Position我作为参数发送。

当我尝试通过在计算过程中将值写入文本文件来调试函数时,我可以看到它是在正确位置处理的正确值。

(GMMarker.Items [0] .Position是软件用户的位置)

任何想法,我可以尝试解决这个问题?

procedure TfrmQthMap.GMMapRightClick(Sender: TObject; LatLng: TLatLng; X, Y: Double);
var
  MessageText: string;
  LL: TLatLng;
  Heading: double;
  Distance: double;
  Qra: string;
begin
  if GMMarker.Count > 0 then
    begin
      LL := TLatLng.Create;
      try
        LL.Lat    := LatLng.Lat;
        LL.Lng    := LatLng.Lng;
        Heading   := GetHeading(GMMarker.Items[0].Position, LL);
        Distance  := GetDistance(GMMarker.Items[0].Position, LL);
        Qra       := Maidenhead(LatLng.LngToStr, LatLng.LatToStr);
      finally
        FreeAndNil(LL);
      end;
      MessageText := 'Data for det sted du klikkede på: ' + sLineBreak + sLineBreak +
                     Format('Længdegrad: %s', [LatLng.LngToStr(Precision)]) + sLineBreak +
                     Format('Breddegrad: %s', [LatLng.LatToStr(Precision)]) + sLineBreak +
                     Format('Afstand: %6.1f km', [Distance]) + sLineBreak +
                     Format('Retning: %6.1f °', [Heading]) + sLineBreak +
                     Format('Lokator: %s', [Qra]);
      ShowMessage(MessageText);
    end;
end;

procedure TfrmQthMap.GetHeadingDistance(aSearchCallInfo: TCallInfo);
var
  Heading: double;
  Distance: double;
begin
  if GMMarker.Count > 1 then
    begin
      Heading   := GetHeading(GMMarker.Items[0].Position, GMMarker.Items[1].Position);
      Distance  := GetDistance(GMMarker.Items[0].Position, GMMarker.Items[1].Position);

      barFooter.Panels[PanelDist].Text  := Format('Afstand: %6.1f km', [Distance]);
      barFooter.Panels[PanelDir].Text   := Format('Retning: %6.1f°', [Heading]);

      aSearchCallInfo.Distance          := Format('%6.1f km', [Distance]);
      aSearchCallInfo.Heading           := Format('%6.1f °', [Heading]);
      aSearchCallInfo.SaveToDatabase;
    end;
end;
function TfrmQthMap.GetDistance(aOrigin, aDest: TLatLng): double;
var
  Distance: double;
begin
  Distance  := TGeometry.ComputeDistanceBetween(GMMap, aOrigin, aDest);
  Distance  := Distance / 1000;
  Result    := Distance;
end;

function TfrmQthMap.GetHeading(aOrigin, aDest: TLatLng): double;
var
  Heading: double;
begin
  Heading := TGeometry.ComputeHeading(GMMap, aOrigin, aDest);
  Heading := 180 + Heading;
  Result  := Heading;
end;

0 个答案:

没有答案