GM Direction Component is Null with specific coordinates

GM Direction Component is Null with specifics coordinates

我在 Delphi 西雅图 10 区使用 gmlib。 我的客户端应用程序通过 fireMonkey 应用程序将位置(纬度和经度)发送到我的数据库 InterBase XE7。 我的管理控制台包括显示一个带有来自查询的标记的 google 地图,以便稍后计算地图中所有标记之间的距离。

创建标记的过程运行良好,同时我正在用标记的坐标填充 GMDirection 组件。这是 "CreatePoint" 程序的代码:

   amplitud := 1;
   posicion := 0;
   Distancia := 0;
   markerGM.Tag := 1;
   qryDatos.Close;
   qryDatos.Open;

   while not qryDatos.Eof do
   begin
     SetLength(marcadores,amplitud);
     marcadores[posicion] := qryDatos.FieldByName('PLULOG').AsInteger;

     Latitud := qryDatos.FieldByName('LATITUD').AsFloat;
     Longitud := qryDatos.FieldByName('LONGITUD').AsFloat;
     autorizado := qryDatos.FieldByName('AUTORIZADO').AsString;

     with markerGM.Add(Latitud,Longitud) do
     begin
       if autorizado = 'T' then
       begin
         if markerGM.Tag = 1 then
         begin
           directionGM.DirectionsRequest.Origin.LatLng.Lat := Latitud;
           directionGM.DirectionsRequest.Origin.LatLng.Lng := Longitud;
         end
         else if markerGM.Tag = 2 then
              begin
               directionGM.DirectionsRequest.Destination.LatLng.Lat := Latitud;
               directionGM.DirectionsRequest.Destination.LatLng.Lng := Longitud;
               directionGM2.DirectionsRequest.Origin.LatLng.Lat := Latitud;
               directionGM2.DirectionsRequest.Origin.LatLng.Lng := Longitud;

               Distancia :=    DistanceBetween(directionGM.DirectionsRequest.Origin.LatLng.Lat,directionGM.DirectionsRequest.Origin.LatLng.Lng,
                                    directionGM.DirectionsRequest.Destination.LatLng.Lat,directionGM.DirectionsRequest.Destination.LatLng.Lng);
             end
             else if markerGM.Tag = 3 then
                  begin
                    directionGM2.DirectionsRequest.Destination.LatLng.Lat := Latitud;
                    directionGM2.DirectionsRequest.Destination.LatLng.Lng := Longitud;
                    directionGM3.DirectionsRequest.Origin.LatLng.Lat := Latitud;
                    directionGM3.DirectionsRequest.Origin.LatLng.Lng := Longitud;

                    Distancia := Distancia + DistanceBetween(directionGM2.DirectionsRequest.Origin.LatLng.Lat,directionGM2.DirectionsRequest.Origin.LatLng.Lng,
                                                      directionGM2.DirectionsRequest.Destination.LatLng.Lat,directionGM2.DirectionsRequest.Destination.LatLng.Lng);
                  end
                  else if markerGM.Tag = 4 then
                       begin
                         directionGM3.DirectionsRequest.Destination.LatLng.Lat := Latitud;
                         directionGM3.DirectionsRequest.Destination.LatLng.Lng := Longitud;
                         directionGM4.DirectionsRequest.Origin.LatLng.Lat := Latitud;
                         directionGM4.DirectionsRequest.Origin.LatLng.Lng := Longitud;

                         Distancia := Distancia + DistanceBetween(directionGM3.DirectionsRequest.Origin.LatLng.Lat,directionGM3.DirectionsRequest.Origin.LatLng.Lng,
                                                          directionGM3.DirectionsRequest.Destination.LatLng.Lat,directionGM3.DirectionsRequest.Destination.LatLng.Lng);
                       end;


           MarkerType := mtColored;
           ColoredMarker.Width := 48 + (Index * 20);
           ColoredMarker.Height := 48;
           markerGM.Tag := markerGM.Tag + 1;
         end;    
       end;
       mapGM.RequiredProp.Center.Lat := Latitud;
       mapGM.RequiredProp.Center.Lng := Longitud;
       mapGM.RequiredProp.Zoom := 13;
       amplitud := amplitud + 1;
       posicion := posicion + 1;
       qryDatos.Next;
    end;
    mapGM.Active := True;

这里是 "DistanceBetween" 程序的代码来自互联网:

    function TfrmLocationMain.DistanceBetween(const Lat1: Extended; const Lon1: Extended; const Lat2: Extended; const Lon2: Extended): Extended;
    begin
      Result := RadToDeg(ArcCos(Sin(DegToRad(Lat1)) * Sin(DegToRad(Lat2)) + Cos(DegToRad(Lat1)) * Cos(DegToRad(Lat2)) * Cos(DegToRad(Lon1 - Lon2)))) * 69.09;
    end;

最后。当创建带有标记的 google 地图并且组件充满数据时。我正在执行所有 GMDirection 组件来计算距离并在 EditText 中显示。

    procedure TfrmLocationMain.btnRutaClick(Sender: TObject);
    begin
      directionGM.Execute;
      directionGM2.Execute;
      directionGM3.Execute;
      directionGM4.Execute;

      Distancia := (Distancia/0.62137); 
      edtDistancia.Text := FloatToStr(Distancia);
      mapGM.RequiredProp.Zoom := 14;
    end;

所有这些代码都适用于测试数据库中的所有寄存器。坐标来自我的国家萨尔瓦多。但是当我在危地马拉的数据库中实施时。一些坐标导致 GMDirection 组件给我以下错误:

Could not convert variant of type(Null) into type(OleStr)

这发生在危地马拉数据库的一些坐标上。 例如。如果查询给我以下数据:

14.513,-90.558
14.559,-90.545
14.572,-90.542

所有代码都能完美运行。但是如果查询给我以下数据:

14.505,-90.568
14.667,-90.494
14.666,-90.494

给我上面的错误。 我不知道是什么问题。而且我不明白为什么代码适用于某些寄存器,而其他寄存器则不能。 如果有人有类似的问题或想法可能会失败。 非常感谢你的帮助。

此致。

我找到问题了。要解决它,打开单元GMDirection,将Variants单元添加到uses子句

implementation

uses
  {$IFDEF DELPHIXE2}
  System.SysUtils, System.DateUtils, Xml.XMLIntf, Xml.XMLDoc, System.Variants,
  {$ELSE}
  SysUtils, DateUtils, XMLIntf, XMLDoc, Variants,
  {$ENDIF}
  Lang, GMFunctions;

搜索行(大约 3575)

    if SameText(Node.NodeName, LBL_D_SUMMARY) then Result.FSumary := Node.NodeValue;

并替换为

    if SameText(Node.NodeName, LBL_D_SUMMARY) and (Node.NodeValue <> null) then Result.FSumary := Node.NodeValue;

重新编译组件

就这些了