2016-10-25 1 views
2

Ich arbeite mit gmlib in Delphi Seattle 10. Meine Client-Anwendung sendet den Standort (Breite und Länge) durch eine FireMonkey-Anwendung auf meine Datenbank InterBase XE7. Meine Admin-Konsole besteht darin, eine Google Map mit Markern anzuzeigen, die aus einer Abfrage stammen, um später den Abstand zwischen allen Markern in der Karte berechnen zu können.GM Direction Component ist Null mit spezifischen Koordinaten

Die Prozedur, die Marker erstellt, funktioniert perfekt und gleichzeitig fülle ich die GMDirection-Komponente mit den Koordinaten der Marker. Hier ist der Code von "Create" -Verfahren:

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; 

Und hier ist der Code des Verfahrens der "Abstand zwischen" aus dem Internet:

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; 

Und schließlich. Wenn die Google Map mit den Markern erstellt wird und die Komponenten voller Daten sind. Ich führe alle GMDirection-Komponenten aus, um die Entfernung zu berechnen, und zeige sie in einem EditText an.

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; 

All dieser Code arbeitet mit allen Registern in einer Testdatenbank. Mit Koordinaten aus meinem Land El Salvador. Aber als ich in einer Datenbank aus Guatemala implementiert habe. Einige Koordinaten verursachen, dass GMDirection Komponente geben Sie mir die folgende Fehlermeldung:

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

Dies geschieht Whit einige Koordinaten von einem guatemaltekischen Datenbank. Zum Beispiel. Wenn die Abfrage gibt mir die folgenden Daten:

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

Der gesamte Code funktioniert perfekt. Aber wenn die Abfrage gibt mir die folgenden Daten:

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

Gib mir den Fehler oben. Ich weiß nicht, was das Problem ist. Und ich verstehe nicht, warum der Code mit einigen Registern funktioniert und mit anderen nicht. Wenn jemand ein ähnliches Problem oder eine ähnliche Problematik hat. Ich würde Ihre Hilfe sehr schätzen.

Grüße.

+0

Welche Codezeile löst den Fehler aus? –

+0

Hi @JohnEasley die Codezeile, die den Fehler auslöst, manchmal ist es in directionGM.Execute und andere in directionGM2.Execute. Hängt von den Koordinaten ab, die von der Abfrage kommen. Ich denke, dass das Problem mit der Komponente selbst ist. Denn wenn ich es im debugg-Modus starte. Die Ausnahme wird im Moment der Ausführung der folgenden Funktion ausgelöst: GetRetournedData; Das ist Teil des GMDirection-Codes. –

Antwort

2

Ich habe das Problem gefunden. Um es zu lösen, offene Einheit GMDirection, fügen Varianten Einheit zur uses-Klausel

implementation 

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

Suchlinie (3575 ca.)

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

und ersetzen durch

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

Recompile die Komponenten

Das ist alles

+0

Das war das Problem !!! Vielen Dank Cadetill !!!. Ihre Lösung hat sehr gut funktioniert und funktioniert für jede Koordinate. Vielen Dank und Grüße. –

Verwandte Themen