GM Direction Component为Null,具有特定坐标

时间:2016-10-25 16:53:35

标签: google-maps delphi google-maps-markers gmlib

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

创建标记的过程非常有效,同时我使用标记的坐标填充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;

最后。当创建带有标记的谷歌地图并且组件充满数据时。我执行所有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

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

问候。

1 个答案:

答案 0 :(得分:2)

我发现了这个问题。要解决它,打开单位GMDirection,将变量单位添加到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 aprox)

    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;

重新编译组件

这就是全部