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.
Welche Codezeile löst den Fehler aus? –
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. –