2016-10-25 4 views
2

私は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 

私に上記のエラーを教えてください。 問題は何か分かりません。そして、私はなぜコードがいくつかのレジスタで動作するのか他のもので動作しないのか分かりません。 誰かが同じような問題や不具合のアイデアを持っている場合。 私はこのことに大変感謝しています。

よろしくお願いいたします。

+0

どのコード行でエラーが発生していますか? –

+0

こんにちは@JohnEasleyエラーを発生させるコード行、時には方向GM.Executeと方向GM2.Executeの他のです。クエリから来る座標の違い。私は、問題はコンポーネント自体にあると思います。私はいつデバッグモードでそれを実行します。この例外は、次の関数を実行する瞬間に発生します。GetRetournedData;それはGMDirectionのコードの一部です。 –

答えて

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およそ10mlの液体フッ化水素を圧入)

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; 

再コンパイルによって置き換え

すべてです。

+0

それは問題でした!ありがとうございます。あなたのソリューションは非常にうまく動作し、すべての座標で機能します。ありがとう、よろしく。 –

関連する問題