我有客户数据库,我想在googlemaps上查看,如果找到coordenate,则更新字段纬度。
我的代码在下面但我执行它会返回一个索引超出范围的错误列表。我试图创建一个循环,但有些东西是不正确的。
procedure TForm1.btnPegaCoordenadasClick(Sender: TObject);
var xTemp: TStringList;
endereco : string;
tamanho : integer;
latitude, customer: string;
begin
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;
IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
xTemp:= TStringList.Create;
while not qryCustomer.eof do begin
endereco:= qryCustomerENDERECOGOOGLE.Value;
customer := qryCustomerCODE.Value;
IdHTTP1.Request.Accept := 'text/html, */*';
IdHTTP1.Request.UserAgent := 'Mozilla/3.0 (compatible; IndyLibrary)';
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
IdHTTP1.HandleRedirects := True;
xTemp.Text := UTF8Decode(IdHTTP1.Get('http://maps.google.com/maps/api/geocode/json?sensor=false&address='+endereco));
// position latitude
latitude := (xTemp.Strings[63]);
with ps_UpdatesCustomers do begin
Parameters.ParamByName('@latitude').Value := latitude;
Parameters.ParamByName('@customer').Value := customer;
ps_UpdatesCustomers.ExecProc;
close;
end;
qryCustomers.Next;
end;
end;
答案 0 :(得分:0)
在尝试访问特定项目之前,您需要检查TStringList
变量xTemp
的长度。
if xTemp.Count >= 64 then
// Do something with xTemp[63]
else
raise SomeError
您还应该使用try/finally
块作为字符串列表:
xTemp:= TStringList.Create;
try
...
finally
xTemp.Free;
end;
如果出现异常情况,这将避免内存泄漏。
答案 1 :(得分:0)
您已经对您阅读的行的索引进行了硬编码:
latitude := (xTemp.Strings[63]);
我认为没有理由认为第64行将保持纬度,也不会总是 至少64行输出。您获得的异常表示至少在一种情况下,不是 64行输出。 (也许address_components
数组并不总是像你期望的那样长。)
您提供的URL返回JSON,因此您应该做的是使用JSON解析器来处理数据。然后从中读取results[0].geometry.viewport.southwest.lat
值。 (读取该属性的确切语法取决于您使用的JSON库。)