Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I fetch Google static maps with TIdHTTP?

I'm trying to return content from maps.google.com from within Delphi 2006 using the TIdHTTP component.

My code is as follows

procedure TForm1.GetGoogleMap();
var
  t_GetRequest: String;
  t_Source: TStringList;
  t_Stream: TMemoryStream;
begin
  t_Source := TStringList.Create;

  try
    t_Stream := TMemoryStream.Create;

    try
      t_GetRequest :=
        'http://maps.google.com/maps/api/staticmap?' +
        'center=Brooklyn+Bridge,New+York,NY' +
        '&zoom=14' +
        '&size=512x512' +
        '&maptype=roadmap' +
        '&markers=color:blue|label:S|40.702147,-74.015794' +
        '&markers=color:green|label:G|40.711614,-74.012318' +
        '&markers=color:red|color:red|label:C|40.718217,-73.998284' +
        '&sensor=false';

      IdHTTP1.Post(t_GetRequest, t_Source, t_Stream);

      t_Stream.SaveToFile('google.html');
    finally
      t_Stream.Free;
    end;
  finally
    t_Source.Free;
  end;
end;

However I keep getting the response HTTP/1.0 403 Forbidden. I assume this means that I don't have permission to make this request but if I copy the url into my web browser IE 8, it works fine. Is there some header information that I need or something else?

like image 829
cloudstrif3 Avatar asked Apr 23 '10 04:04

cloudstrif3


2 Answers

you're doing a POST request, however your browser will be doing a GET request; change your delphi code to also do a GET request.

google may be blocking by UserAgent; try clearing it, or changing it to match your browser's.

like image 128
glob Avatar answered Sep 28 '22 08:09

glob


cloudstrif3, the value returned by the request is a image not a html page, i just wrote this article Using Google maps (Static Maps) without TWebBrowser on my blog, so you can check the source code.

check this sample.

var
  StreamData :TMemoryStream;
  JPEGImage  : TJPEGImage;
  Url        : string; 
begin
  Url        :='http://maps.google.com/maps/api/staticmap?' +  
  'center=Brooklyn+Bridge,New+York,NY' +  
  '&zoom=14' +  
  '&size=512x512' +  
  '&maptype=roadmap' +  
  '&markers=color:blue|label:S|40.702147,-74.015794' +  
  '&markers=color:green|label:G|40.711614,-74.012318' +  
  '&markers=color:red|color:red|label:C|40.718217,-73.998284' +  
  '&format=jpg'; //i add this param to return a  jpg image , because the default format used is png.
  '&sensor=false'; 
  StreamData := TMemoryStream.Create;
  JPEGImage  := TJPEGImage.Create;
  try
    try
     idhttp1.Get(Url, StreamData); //Send the request and get the image
     StreamData.Seek(0,soFromBeginning);
     JPEGImage.LoadFromStream(StreamData);//load the image in a Stream
     ImageMap.Picture.Assign(JPEGImage);//Load the image in a Timage component
    Except On E : Exception Do
     MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
    End;
  finally
    StreamData.free;
    JPEGImage.Free;
  end;
end;
like image 23
RRUZ Avatar answered Sep 28 '22 09:09

RRUZ