Цитата
А можно немного поподробнее о том, как можно это сделать?
Ну, все данные Вы получаете, судя по тексту ниже.
Цитата
Также не совсем понятно, как из этой информации можно получить задержку сигнала от определенной вышки..
TA - это и есть задержка. В у.е. Актуальна только при наличии соединения.
Цитата
Подскажите, пожалуйста, как можно переколбасить эти данные в координаты.
ЗЫ О каком, кстати, сервисе Гугла речь идет? Вроде информации по вышкам там взяться неоткуда...
Google Maps для мобильных устройств ходит на свой серверок, который по CID/LAC возвращает широту/долготу. Яндекс тоже имеет такой сервис. Недолгое гугление привело к коду
Код
function GetCoordFromGoogle(CountryCode, NetworkCode, LAC, CellID: Integer): string;
var
strA, strB, strC, strAll: string;
sResult: string;
ms: TMemoryStream;
dLat, dLon: Double;
iLat, iLon: Integer;
i: Integer;
b: byte;
sTmp, sTmp2: string;
iCntr: Integer;
HTTP: TIdHTTP;
begin
Result := '';
strA := '000E00000000000000000000000000001B0000000000000000000000030000';
strB := '0000' + IntToHex(CellID, 2) + '0000' + IntToHex(LAC, 2);
strC := '000000' + IntToHex(NetworkCode, 2) + '000000' + IntToHex(CountryCode, 2);
strAll := strA + strB + strC + 'FFFFFFFF00000000';
HTTP := TIdHTTP.Create(nil);
HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
HTTP.Request.ContentLength := Length(strAll) div 2;
ms := TMemoryStream.Create;
try
iCntr := 1;
for i := 1 to (Length(strAll) div 2) do begin
b := StrToInt('0x' + Copy(strAll, iCntr, 2));
iCntr := iCntr + 2;
ms.Write(b, 1);
end;
ms.Seek(0, soFromBeginning);
try
sResult := HTTP.Post('http://www.google.com/glm/mmap', ms);
if Length(sResult) > 14 then begin
sTmp := '0x';
for i := 1 to 5 do begin
sTmp2 := Copy(sResult, i + 6, 1);
sTmp := sTmp + IntToHex(Ord(sTmp2[1]), 2);
end;
iLat := StrToInt(sTmp);
sTmp := '0x';
for i := 1 to 4 do begin
sTmp2 := Copy(sResult, i + 11, 1);
sTmp := sTmp + IntToHex(Ord(sTmp2[1]), 2);
end;
iLon := StrToInt(sTmp);
dLat := iLat/1000000;
dLon := iLon/1000000;
Result := Format('%12.7f%s%12.7f', [dLat, #13#10, dLon]);
end;
except
// stub
end;
finally
HTTP.Free;
ms.Free;
end;
end;
function GetCoordFromYandex(CountryCode, NetworkCode, LAC, CellID: Integer): string;
const
cc_URL = 'http://mobile.maps.yandex.net/cellid_location/?&cellid=%d&operatorid=%d&countrycode=%d&lac=%d';
var
sURL: string;
rs: TStream;
node: IXMLNode;
HTTP: TIdHTTP;
XML: TXMLDocument;
begin
Result := '';
sURL := Format(cc_URL, [CellID, NetworkCode, CountryCode, LAC]);
rs := TMemoryStream.Create;
HTTP := TIdHTTP.Create(nil);
XML := TXMLDocument.Create(HTTP); // если указать nil то будет ошибка :-D
try
HTTP.Request.Accept := 'text/plain';
HTTP.Request.AcceptEncoding := 'windows-1251';
try
HTTP.Get(sURL, rs);
if rs.Size > 0 then begin
rs.Seek(0, soFromBeginning);
XML.LoadFromStream(rs);
XML.NSPrefixBase := 'location';
node := XML.Node.ChildNodes.FindNode('location');
if (node <> nil) then begin
node := node.ChildNodes.FindNode('coordinates');
if (node <> nil) then begin
Result :=
StringReplace(node.Attributes['latitude'], '.', ',', []) + #13#10 +
StringReplace(node.Attributes['longitude'], '.', ',' ,[]);
end;
end;
end;
except
// stub
end;
finally
XML.Free;
HTTP.Free;
rs.Free;
end;
end;
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин