私はDelphiシアトル10のgmlibで作業しています。 クライアントアプリケーションがFireMonkeyアプリケーションを介してInterBase XE7データベースに場所(緯度と経度)を送信します。 私の管理コンソールには、クエリのマーカーが表示されたGoogleマップが表示されます。後で地図のすべてのマーカー間の距離を計算します。GMディレクションコンポーネントの座標がNullです
マーカーを作成する手順は完全に機能していますが、同時に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;
そしてここでは、インターネットからの「間の距離」の手順のコードは次のとおりです。
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;
このコードは、すべてテストデータベースのすべてのレジスタで動作します。私の国El Salvadorからの座標で。しかし、グアテマラのデータベースに実装したとき。いくつかの座標が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
私に上記のエラーを教えてください。 問題は何か分かりません。そして、私はなぜコードがいくつかのレジスタで動作するのか他のもので動作しないのか分かりません。 誰かが同じような問題や不具合のアイデアを持っている場合。 私はこのことに大変感謝しています。
よろしくお願いいたします。
どのコード行でエラーが発生していますか? –
こんにちは@JohnEasleyエラーを発生させるコード行、時には方向GM.Executeと方向GM2.Executeの他のです。クエリから来る座標の違い。私は、問題はコンポーネント自体にあると思います。私はいつデバッグモードでそれを実行します。この例外は、次の関数を実行する瞬間に発生します。GetRetournedData;それはGMDirectionのコードの一部です。 –