In der Shoutbox kam gerade die Frage nach einer API zum abfragen der Geo-Koordinaten anhand einer PLZ.
Ich habe für die deutschen Postleitzahlen mal ein Script erstellt (benutzt MAPs der neuen AutoIt-Version): im Anhang.
In der Shoutbox kam gerade die Frage nach einer API zum abfragen der Geo-Koordinaten anhand einer PLZ.
Ich habe für die deutschen Postleitzahlen mal ein Script erstellt (benutzt MAPs der neuen AutoIt-Version): im Anhang.
Very nice !!!
Hi, sieht interessant aus und definitv twas was ich leider nicht verstehe
Alternativ habe ich für meine Zwecke das, dank AspirinJunkie, so umgesetzt:
Consolewrite(GetCoordinates('Platz der Republik 1, 11011 Berlin') & @CRLF)
Func GetCoordinates($Address)
Local $Result, $Lat, $Lon
$Address = Stringreplace($Address, ' ', '+')
$Result = SendRequest($Address, 'GET', 'nominatim.openstreetmap.org')
$Lat = Stringsplit(Stringsplit($Result, "lat='", $STR_ENTIRESPLIT)[2], "'")[1]
$Lon = Stringsplit(Stringsplit($Result, "lon='", $STR_ENTIRESPLIT)[2], "'")[1]
Return $Lat & ',' & $Lon
EndFunc
Func SendRequest($Target, $RequestType, $TargetIP)
Local $Url, $oHTTP, $Response, $Data, $aArray, $Final
$Url = "https://" & $TargetIP & '/search?q=' & $Target & '&format=xml'
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open($RequestType, $Url, False)
$oHTTP.Option(4) = 13056 ; THIS IS MANDATORY! Ignores any SSL Errors
$oHTTP.Send()
$Response = $oHTTP.Status
$Data = $oHTTP.ResponseText
$aArray = StringRegExp($Data,'"([^"]*)":"([^"]*)"', 3)
if IsArray($aArray) then
$Final = _Array_Resize($aArray, 2)
Else
$Final = $Data
EndIf
Return $Final
EndFunc
Func _Array_Resize(ByRef $aArray1d, $iColumns, $iStart = Default)
If IsKeyword($iStart) Then $iStart = 0
Local $iElements = UBound($aArray1d) - $iStart
If Mod($iElements, $iColumns) <> 0 Then Return SetError(1, 0, False)
Local $aArray2d[$iElements / $iColumns][$iColumns]
For $i = 0 To $iElements - 1
$aArray2d[Floor($i / $iColumns)][Mod($i, $iColumns)] = $aArray1d[$i + $iStart]
Next
_ArrayInsert($aArray2d, 0, UBound($aArray2d))
Return $aArray2d
EndFunc ;==>_Array_Resize
Alles anzeigen
Alternativ habe ich für meine Zwecke das, dank AspirinJunkie, so umgesetzt:
Naja, dafür braucht man eine Internetverbindung. Meins wäre offline (aber nur PLZ ohne Straße).
Dein Script kann man etwas kürzen:
ConsoleWrite(_GetCoordinates('Platz der Republik 1, 11011 Berlin') & @CRLF)
Func _GetCoordinates($sAddress)
Local $oHTTP, $sResponse, $sData
$sAddress = StringReplace($sAddress, ' ', '+')
$oHTTP = ObjCreate('winhttp.winhttprequest.5.1')
$oHTTP.Open('GET', 'https://nominatim.openstreetmap.org/search?q=' & $sAddress & '&format=xml', False)
$oHTTP.Option(4) = 13056 ; THIS IS MANDATORY! Ignores any SSL Errors
$oHTTP.Send()
Return StringRegExpReplace($oHTTP.ResponseText, "(?s).+?lat='(.+?)'.+?lon='(.+?)'.+", '$1,$2')
EndFunc ;==>GetCoordinates
Alles anzeigen
Das ist richtig.
Aber mir war wichtig eine allgemein (vom Prinzip) immer wieder verwendbare Funktion z.B. zum Senden des http requests zu haben.
Zudem erwarte ich meistens entweder einen String oder Array zurück bisher (API Calls), da war diese (simple) obige Variante bisher sehr zuverlässig (mit kleinen individuellen Anpassungen weil wegen Authentifizierung etc.). Mittlerweile habe ich weitaus umfangreichere um div. Authentifizierungen abzubilden, die wären für diesen Fall aber definitiv oversized gewesen.
Und Regex ist wie gesagt nicht mein Steckenpferd.
Dennoch kurze und knappe Lösung deinerseits für solche denen das so reicht Oscar