Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Openstreetmaps und Indy (https://www.delphipraxis.net/214731-openstreetmaps-und-indy.html)

Dicki 29. Feb 2024 11:35

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;

Klaus01 29. Feb 2024 12:37

AW: Openstreetmaps und Indy
 
.. an dem Leerzeichen zwischen ? und bbox kann es nicht liegen?

haentschman 29. Feb 2024 12:43

AW: Openstreetmaps und Indy
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

.. an dem Leerzeichen zwischen ? und bbox kann es nicht liegen?
...definitiv.8-)

Mit Leerzeichen -> Bild, ohne Leerzeichen kommt Speichern-Dialog...:wink:

Exception auslesen ist auch eine Option. :zwinker: Da hat man auch den Fehlertext...

Dicki 4. Mär 2024 17:51

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.

himitsu 4. Mär 2024 22:53

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 Delphi-Referenz durchsuchenFormat 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?
Delphi-Referenz durchsuchenSysErrorMessage, MSDN-Library durchsuchenGetLastError oder Delphi-Referenz durchsuchenRaiseLastOSError.
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
* MSDN-Library durchsuchenGetExitCodeProcess

Klaus01 5. Mär 2024 10:11

AW: Openstreetmaps und Indy
 
..oder so:

Delphi-Quellcode:
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;
Grüße
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