Openstreetmaps und Indy
Ich versuche eine OSM-Datei herunterzuladen.
Gebe ich die Adresse in Firefox ein geht es. Im programm kommt ein Fehler: "Im Projekt UTM_Test.exe ist eine Exception der Klasse EIdHTTPProtocolException mit der Meldung <HTML> aufgetreten." Da ich noch nie mit den Indy-Komponenten gearbeitet habe kann mir hier evtl. jemad helfen. function TdsTransGeoData.Load_OSM_To_File(const FileName: string; const Angle_Top, Angle_Bottom, Angle_Left, Angle_Right: Extended): Boolean; var lStream: TFileStream; begin Result := False; lStream:=TFileStream.Create(FileName+'D', fmCreate or fmShareDenyWrite); try fIdHTTP.Get('https://www.delphi-treff.de/ueber-delphi/das-produkt/',lStream); Result := True; finally lStream.Free; end; ShowMessage('FILE 1'); // ========== lStream:=TFileStream.Create(FileName, fmCreate or fmShareDenyWrite); try fIdHTTP.Get('http://api.openstreetmap.org/api/0.6/map? bbox=11.54,48.14,11.543,48.145',lStream); // ERZEUGT DEN FEHLER Result := True; except ShowMessage('FILE 2 : ERROR'); end; lStream.Free; ShowMessage('FILE 2'); end; |
AW: Openstreetmaps und Indy
.. an dem Leerzeichen zwischen ? und bbox kann es nicht liegen?
|
AW: Openstreetmaps und Indy
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Mit Leerzeichen -> Bild, ohne Leerzeichen kommt Speichern-Dialog...:wink: Exception auslesen ist auch eine Option. :zwinker: Da hat man auch den Fehlertext... |
AW: Openstreetmaps und Indy
Habe jetzt mein OSM-Aufruf so geändert:
FUNCTION TdsTransGeoData.Load_OSM_To_File(CONST FileName: STRING; CONST Angle_Left, Angle_Bottom, Angle_Right, Angle_Top: Extended): Boolean; VAR StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; fString: STRING; CreateProcessString: STRING; BEGIN fString := 'wget --random-wait --no-check-certificate -O %s' + ' "https://api.openstreetmap.org/api/0.6/map?bbox=%.5f,%.5f,%.5f,%.5f"'; //FileName = R:\Test_OSM.OSM' CreateProcessString := FORMAT(fString, [FileName, Angle_Left, Angle_Bottom, Angle_Right, Angle_Top]); ZeroMemory(@StartupInfo, SizeOf(StartupInfo)); StartupInfo.cb := SizeOf(StartupInfo); IF CreateProcess(NIL, PChar(CreateProcessString), NIL, NIL,NOT False, 0, NIL, PChar(ExtractFilePath(FileName)), StartupInfo, ProcessInfo) THEN BEGIN // Warte auf das Ende des Prozesses WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); // ----- Result := true; END ELSE BEGIN // Fehler beim Starten von wget Result := False; END; END; Der Rückgabewert ist TRUE, aber die Dateigröße von "Test_OSM.OSM" ist 0! Habe jetzt WGet über die Konsole so aufgerufen: wget --no-check-certificate -O R:\Test_OSM.OSM "https://api.openstreetmap.org/api/0.6/map?bbox=11.54,48.14,11.543,48.145" Die Datei "Test_OSM.OSM" wird erzeugt mit 28,4MB. Wo liegt bei mir der jetzt der Fehler? Ich glaube, ich bin zu alt dafür. |
AW: Openstreetmaps und Indy
[CODE]...[/CODE] bzw. [DELPHI]...[/DELPHI] aka den Knopf mit dem Helm solltest du dir mal ansehn.
Hast du dir mal angesehn, was Format liefert? Wenn du nicht zufällig ein englisches Windows nutzt, dann kommen dort die falschen Dezimaltrennzeichen raus. Den Parameter "FormatSettings" kennst du? Die Rückgaben von CreateProcess willst du nicht ordentlich prüfen? SysErrorMessage, GetLastError oder RaiseLastOSError. https://learn.microsoft.com/de-de/wi...a#return-value Und dann die Rückgaben vom WGET. * Gut, den Status-/Fehlertext könnte man ignorieren, da das Programm es auch via ErrorLevel/ExitCode ausgibt * GetExitCodeProcess |
AW: Openstreetmaps und Indy
..oder so:
Delphi-Quellcode:
Grüße
uses
System.SysUtils, system.IOUtils, REST.Client, rest.types; function load_OSM_ToFile(CONST FileName: STRING; CONST Angle_Left, Angle_Bottom, Angle_Right, Angle_Top: Extended): Boolean; var restClient: TRestClient; restRequest: TRestRequest; restResponse: TRestResponse; formatSet: TFormatSettings; begin restClient := TRestClient.Create('https://api.openstreetmap.org/api/0.6/map'); try restCLient.Accept := 'application/json'; restClient.AcceptCharset := 'utf-8'; restRequest := TRestRequest.Create(nil); try restRequest.Client := restClient; restRequest.Accept := 'application/json'; restRequest.AcceptCharset := 'utf-8'; restRequest.Method := rmGet; restRequest.AssignedValues := [TRESTRequest.TAssignedValue.rvAccept, TRESTRequest.TAssignedValue.rvConnectTimeout, TRESTRequest.TAssignedValue.rvReadTimeout]; formatSet := TFormatSettings.Create; formatSet.DecimalSeparator := '.'; restRequest.AddParameter('bbox',format('%s,%s,%s,%s',[floatToStr(Angle_Left, formatSet), floatToStr(Angle_Bottom, formatSet), floatToStr(Angle_Right, formatSet), floatToStr(Angle_Top, formatSet)])); var param := restRequest.params.AddHeader('Accept', 'application/json'); param.Options := param.Options + [poDoNotEncode]; restResponse := TRestResponse.Create(nil); try restRequest.Response := restResponse; restRequest.Execute; result := restRequest.Response.StatusCode = 200; if result then TFile.WriteAllText(fileName, restResponse.Content); finally restResponse.Free; end; finally restRequest.Free; end; finally restClient.Free; end; end; Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz