델파이 시애틀 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
위의 오류를 알려주십시오. 나는 무엇이 문제인지 모른다. 그리고 왜 코드가 일부 레지스터와 다른 레지스터와 함께 작동하는지 이해할 수 없습니다. 비슷한 문제 나 아이디어가있는 사람이있는 경우. 큰 도움을 주시면 감사하겠습니다.
감사합니다.
어떤 코드 줄에서 오류가 발생합니까? –
안녕하세요 @ JohnEasley 오류를 제기하는 코드 라인, 때로는 방향 GM에 있습니다. 실행 및 방향 GM2.Execute 다른 사람. 쿼리의 좌표에 따라 다릅니다. 문제는 구성 요소 자체에 있다고 생각합니다. 왜냐하면 언제 내가 디버그 모드로 실행합니다. 이 예외는 다음 함수를 실행하는 순간에 발생합니다. GetRetournedData; 그것은 GMDirection의 코드의 일부입니다. –