1

我使用 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;
4

0 回答 0