2016-10-25 6 views
2

델파이 시애틀 10에서 gmlib로 작업하고 있습니다. 클라이언트 응용 프로그램이 FireMonkey 응용 프로그램을 통해 위치 (위도 및 경도)를 내 데이터베이스 인 InterBase XE7로 보냅니다. 내 관리 콘솔은 검색어의 마커가 포함 된 Google지도를 표시합니다. 나중에지도의 모든 마커 사이의 거리를 계산할 수 있습니다.GM 방향 구성 요소가 특정 좌표로 널입니다.

마커를 만드는 절차는 완벽하게 작동하는 동시에 마커 좌표로 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; 

그리고 마지막으로. 마커가있는 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; 

이 코드는 모두 테스트 데이터베이스의 모든 레지스터에서 작동합니다. 우리 나라 엘살바도르의 좌표. 그러나 과테말라의 데이터베이스에서 구현했을 때.

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

이 일부 해당 좌표 과테말라의 데이터베이스에서 오순절을 발생 : 일부 좌표는 GMDirection 구성 요소 나에게 다음과 같은 오류를 줄 것을 일으키는 원인이된다. 예를 들면. 쿼리에서 나에게 다음 데이터를 제공하는 경우 :

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에 있습니다. 실행 및 방향 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 함께 aprox)

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

을 Variants 유닛을 추가하고

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

다시 컴파일에 의해 대체

그게 전부 야.

+0

그것이 문제가되었습니다! 고마워요. 그렇게 많이 cadetill !!!. 귀하의 솔루션은 매우 잘 작동했으며 모든 좌표에 대해 작동합니다. 감사합니다. –