NEWS
Lösung für GPS-Koordinaten nach Ortsnamen aufschlüsseln?
-
Hallo Allerseits,
ich suche gerade nach einer (einfachen) Lösung, wie ich GPS-Koordinaten nach Ortsnamen aufschlüsseln könnte...
Auf http://www.geonames.org/ gibt es z.B. ein TAB separiertes txt-File/Datenbank von Deutschland zum Download:
https://download.geonames.org/export/dump/Hintergrund: Ich habe nun unseren Twingo Elektrik im Iobroker (ZOE Adapter) und der liefert mir u.a auch jeweils die aktuellen GPS Daten, sofern er steht, bzw. abgeschlossen ist. Den Twingo Status (Batterie-Ladung, Reichweite, etc) kann ich nun auch per IOT/Alexa abfragen.
Die Idee dabei, dass mir Alexa dann nicht nur die blanken GPS-Kordinaten, sondern vielleicht auch den passenden Ortsnamen dazu nennt.
Sprich, z.B. aus der Geonames Datenbank, den zu den aktuellen Twingo GPS Daten passenden/dichtesten Ort rausfischen und in einen Datenpunkt schieben, den dann z.B. über Alexa mit im Twingo Statusbericht ausgeben.Jemand eine Idee, wie man das umsetzen könnte, oder ob es schon etwas dafür gibt?
Es macht auch nichts, wenn es dafür eine einfache und schnelle Lösung gibtGruß,
Matthias
Edit: Habe was gefunden: https://nominatim.openstreetmap.org/reverse.php?format=xml&lat=52.10&lon=13.3291015625
Bzw: https://nominatim.openstreetmap.org/ui/reverse.html?format=html&lat=52.10&lon=13.3291015625
Nun muss ich mal schauen wie parsen geht, bzw. die GPS Koordinaten in den http request übergeben...
-
@lemuba sagte in Lösung für GPS-Koordinaten nach Ortsnamen aufschlüsseln?:
Nun muss ich mal schauen wie parsen geht, bzw. die GPS Koordinaten in den http request übergeben...
Hier was zum Rumspielen. Den Request-Block von Blockly kann man mW nicht nutzen da OSM einen Header verlangt, deshalb die Auslagerung in eine Funktion. Zu beachten ist dass nicht immer alle Werte zurück gegeben werden, im Beispiel fehlt zB road und city, du siehst in der Ausgabe des Gesamtergebnisses was tatsächlich zurück kommt. Nicht schön ist das Warten auf das Ende der callback Funktion mittels wait(), aber mir fällt so spät nichts Besseres ein. In JS würde ich es mit axios machen und await nutzen, ginge hier natürlich auch aber erfordert dann die extra Installation von axios
-
Vielen Dank erstmal für Deine schnelle Rückmeldung, aber ich scheitere aktuell mal wieder daran, dass JS nicht wirklich meins ist, ich Dein Script und Blockly Vorlage nicht zum Laufen bekomme:
Hmm? Komme da gerade nicht wirklich weiter...
-
@lemuba es braucht keine Kenntnisse, importieren und laufen lassen. Evtl. kopierst du nochmal neu, sonst fällt mir nichts ein
-
: Das war Zu Einfach!
Ich hatte nicht geschnallt, das der ganze Code das Blockly Script zum Import ist...läuft!
Vielen Dank nochmal!
Gruß,
Matthias
-
-
Hier noch ein kleines Update, welches ohne das lästige wait() auskommt. request() wird in eine Funktion gepackt, welche ein Promise zurück gibt auf das man mit await warten kann.
-
Hey,
läuft bei euch das Script noch?
Seit heute bekomme ich20:12:05.729 error javascript.0 (5273) script.js.Eigene_Scripte.Tests.Loschen: Cannot get address of undefined
Im Log.
(muss das Skript noch umbenennen ^^).Hab gestern ein Update des Javascript Adapters gemacht. Zusammen mit Admin 5.
Die Koordinaten sind sauber.
-
@david-g läuft hier
-
Komisch.
Hat OSM ein Limit für Anfragen?
Grage minütlich ab. Läuft aber bestimmt schon seit 3 Wochen ohne Probleme.....Setzte die Adresse nochmal selber zusammen. OSM sendet die was komisch....
EDIT:
Hab grad mal das Internet neu verbunden um eine neue IP zu bekommen.
Siehe da, es klappt wieder. -
Das Ganze läuft jetzt auch super mit dem Awtrix Adapter, bzw. Ausgabe auf dem Ulanzi Matrix Display:
Hier mal die Visualisierung der Adressdaten, plus aktuellen Geschwindigkeit - nun aber mit unserem Tesla M3.Blockly Export/Import:
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="2]3hGy$Na|L2qX#+=;E8">lat</variable> <variable id=".hv$JjjT(QY(0c2!/tuc">lon</variable> <variable id="InM51wH+hhRZ1K}Uo6R:">result</variable> <variable id=",v4l/N^bA;j*N;f.7`GF">text</variable> </variables> <block type="procedures_defcustomreturn" id="?;wMWdJ!vB8:m#;$39f@" x="-337" y="-212"> <mutation statements="false"> <arg name="lat" varid="2]3hGy$Na|L2qX#+=;E8"></arg> <arg name="lon" varid=".hv$JjjT(QY(0c2!/tuc"></arg> </mutation> <field name="NAME">OSM</field> <field name="SCRIPT">dmFyIHJlcXVlc3QgPXJlcXVpcmUoJ3JlcXVlc3QnKTsNCmxldCByZXN1bHQ7DQpjb25zdCBvcHRpb25zID0gew0KICAgIHVybDogJ2h0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnL3JldmVyc2UucGhwP2Zvcm1hdD1qc29uJmxhdD0nICsgbGF0ICsgJyZsb249JyArIGxvbiArICcmem9vbT0xOCcsDQogICAgbWV0aG9kOiAnR0VUJywNCiAgICBoZWFkZXJzOiB7DQogICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsDQogICAgICAgICdBY2NlcHQtQ2hhcnNldCc6ICd1dGYtOCcsDQogICAgICAgICdVc2VyLUFnZW50JzogJ2lvYnJva2VyIHNjcmlwdCcNCiAgICB9DQp9DQoNCnJlcXVlc3Qob3B0aW9ucywgZnVuY3Rpb24oZXJyLHJlc3BvbnNlLGJvZHkpew0KICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoYm9keSk7DQp9KQ0KYXdhaXQgd2FpdCgyMDAwKTsNCnJldHVybiByZXN1bHQ7</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> </block> <block type="variables_set" id="wR~~7^?!0{b~ZWJW2z2Y" x="-337" y="-187"> <field name="VAR" id="2]3hGy$Na|L2qX#+=;E8">lat</field> <value name="VALUE"> <block type="get_value" id="!@Mxm]aCD#|[2(1,`7LA"> <field name="ATTR">val</field> <field name="OID">tesla-motors.0.LRW3E7FS7PC682851.drive_state.latitude</field> </block> </value> <next> <block type="variables_set" id="|i,e7-xsVZtwL,YE9Pns"> <field name="VAR" id=".hv$JjjT(QY(0c2!/tuc">lon</field> <value name="VALUE"> <block type="get_value" id="6)]4V(MA}[}Y#gCg?g7^"> <field name="ATTR">val</field> <field name="OID">tesla-motors.0.LRW3E7FS7PC682851.drive_state.longitude</field> </block> </value> <next> <block type="variables_set" id="_]-UxYH%D~}#l6DWPyqA"> <field name="VAR" id="InM51wH+hhRZ1K}Uo6R:">result</field> <value name="VALUE"> <block type="procedures_callcustomreturn" id="E6q6k3RA-DSW4n:wbmt5" inline="true"> <mutation name="OSM"> <arg name="lat"></arg> <arg name="lon"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="O~3vjlaQApGabQ#KZ_Np"> <field name="VAR" id="2]3hGy$Na|L2qX#+=;E8">lat</field> </block> </value> <value name="ARG1"> <block type="variables_get" id=";6In%LVgU8c~ZW=V^#!+"> <field name="VAR" id=".hv$JjjT(QY(0c2!/tuc">lon</field> </block> </value> </block> </value> <next> <block type="debug" id="=kG9Q3BHtv,N12i)o/cd"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="ik1UI0{#imdw4QxI,wuq"> <field name="TEXT">test</field> </shadow> <block type="variables_get" id="ZJbVSK}WTjai..N)v+^}"> <field name="VAR" id="InM51wH+hhRZ1K}Uo6R:">result</field> </block> </value> <next> <block type="debug" id="bXiZr_w6h{,9I,J|QFQm"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="29,6%MJ)T!m#9$n(HA(,"> <field name="TEXT">test</field> </shadow> <block type="get_attr" id="4BRp8)RL(Z,ya1V7L%,k"> <value name="PATH"> <shadow type="text" id="@+Kn.LF%vkB35cm%To%G"> <field name="TEXT">address.road</field> </shadow> </value> <value name="OBJECT"> <block type="variables_get" id="/rsi@S]q*[hct$N@3[U^"> <field name="VAR" id="InM51wH+hhRZ1K}Uo6R:">result</field> </block> </value> </block> </value> <next> <block type="debug" id="dAc9;C;}EM{;795yOx+x"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="/40n%p9iOr{j;fjVE}z7"> <field name="TEXT">test</field> </shadow> <block type="get_attr" id="LpeSM|-_`@#YwXXZj!J@"> <value name="PATH"> <shadow type="text" id="Z^$s~_s3A]lS:_m9AjB("> <field name="TEXT">display_name</field> </shadow> </value> <value name="OBJECT"> <block type="variables_get" id="O[`[O5l$sBBY(*B]Rh9U"> <field name="VAR" id="InM51wH+hhRZ1K}Uo6R:">result</field> </block> </value> </block> </value> <next> <block type="variables_set" id=":iDZr5UyCe,ivtP9v0(}"> <field name="VAR" id=",v4l/N^bA;j*N;f.7`GF">text</field> <value name="VALUE"> <block type="text_join" id="XSLUXB!wN!-ae:pl;O8B"> <mutation items="11"></mutation> <value name="ADD0"> <block type="text" id=")D7vowpY0M+s6mmej`e~"> <field name="TEXT">Location: </field> </block> </value> <value name="ADD1"> <block type="get_attr" id="g3uOcVu;z8aYAY7;8Kti"> <value name="PATH"> <shadow type="text" id="KArLdm/6uO2yf.]RJDW["> <field name="TEXT">address.road</field> </shadow> <block type="text" id="DMfj]B1V*c^r*po?FozS"> <field name="TEXT">address.road</field> </block> </value> <value name="OBJECT"> <block type="variables_get" id="YOh=_SwF-z[BN^8PV(1:"> <field name="VAR" id="InM51wH+hhRZ1K}Uo6R:">result</field> </block> </value> </block> </value> <value name="ADD2"> <block type="text" id="nOZuc!aD}_`wjoaU4!(#"> <field name="TEXT"> </field> </block> </value> <value name="ADD3"> <block type="get_attr" id="eYJy`^;WpK9z`(0#QkYu"> <value name="PATH"> <shadow type="text" id="KArLdm/6uO2yf.]RJDW["> <field name="TEXT">address.road</field> </shadow> <block type="text" id="Faux=fGpEPkIBk=EH[=d"> <field name="TEXT">address.house_number</field> </block> </value> <value name="OBJECT"> <block type="variables_get" id="BQ6I:3SHB|S1AGrNGYIt"> <field name="VAR" id="InM51wH+hhRZ1K}Uo6R:">result</field> </block> </value> </block> </value> <value name="ADD4"> <block type="text" id="A(Z{jjQopfoSud(d$_*C"> <field name="TEXT">, </field> </block> </value> <value name="ADD5"> <block type="get_attr" id="G}a6d%(Qn2WrACG:Ch7|"> <value name="PATH"> <shadow type="text" id="KArLdm/6uO2yf.]RJDW["> <field name="TEXT">address.road</field> </shadow> <block type="text" id="fK{+kZLKFfv~KDF:GIcA"> <field name="TEXT">address.postcode</field> </block> </value> <value name="OBJECT"> <block type="variables_get" id="7!aEUv#yfH7G0qqNh{fh"> <field name="VAR" id="InM51wH+hhRZ1K}Uo6R:">result</field> </block> </value> </block> </value> <value name="ADD6"> <block type="text" id="QDwYvut3T+?ypaI-Qc~q"> <field name="TEXT"> </field> </block> </value> <value name="ADD7"> <block type="get_attr" id="#Qg=qhE{]!C9HFrHH#ER"> <value name="PATH"> <shadow type="text" id="KArLdm/6uO2yf.]RJDW["> <field name="TEXT">address.road</field> </shadow> <block type="text" id="/KcU}U$/=t_c2ob{O_}}"> <field name="TEXT">address.village</field> </block> </value> <value name="OBJECT"> <block type="variables_get" id="O_tQk;@av+BHgqb@VfHp"> <field name="VAR" id="InM51wH+hhRZ1K}Uo6R:">result</field> </block> </value> </block> </value> <value name="ADD8"> <block type="text" id="NenM{G|=MkLu:Y3BXF7?"> <field name="TEXT">: </field> </block> </value> <value name="ADD9"> <block type="get_value" id=":$dM7(mWFkX;dm?xlo_t"> <field name="ATTR">val</field> <field name="OID">tesla-motors.0.LRW3E7FS7PC682851.drive_state.speed_km</field> </block> </value> <value name="ADD10"> <block type="text" id="_WW=xep+.FfqH/kPAHHO"> <field name="TEXT"> km/h</field> </block> </value> </block> </value> <next> <block type="awtrix-light" id="1JNb12R1PMS^CFOxV:hZ"> <field name="INSTANCE"></field> <field name="RAINBOW">TRUE</field> <field name="STACK">TRUE</field> <field name="WAKEUP">TRUE</field> <value name="MESSAGE"> <shadow type="text" id="Upc}*ndVB5vPx7%#%,f?"> <field name="TEXT">haus-automatisierung.com</field> </shadow> <block type="variables_get" id="4@]t:R3T*_K_fnc8;i+?"> <field name="VAR" id=",v4l/N^bA;j*N;f.7`GF">text</field> </block> </value> <value name="COLOR"> <shadow type="colour_picker" id="ZO]ra7*|K.7]$apWfB4c"> <field name="COLOUR">#ffffff</field> </shadow> </value> <value name="SOUND"> <shadow type="logic_null" id="dc-@fFGA7vT5Z[bTy@aO"></shadow> </value> <value name="ICON"> <shadow type="logic_null" id=",u10)OQ,z.E.;7+eAK9:"></shadow> <block type="text" id="n1bTp(7]W[8#UVSbGQcl"> <field name="TEXT">54394</field> </block> </value> <value name="REPEAT"> <shadow type="math_number" id="ldph$rS`hpmxt,B756f!"> <field name="NUM">2</field> </shadow> </value> <value name="DURATION"> <shadow type="math_number" id="8Wgsv0!pZUT@Mg*n?w6y"> <field name="NUM">20</field> </shadow> </value> <next> <block type="control" id="T#!W2tOCAiMZT)Do_^[%"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="true"></mutation> <field name="OID">javascript.0.scriptEnabled.common.Tesla_Position</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">2</field> <field name="UNIT">sec</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="]yXqp^C@1w9a^uyTmw}6"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </xml>
-
@fastfoot
ist es auch möglich über die API eine Adresse abzufragen und die Koordinate zu erhalten? -
-
@oli
Das hier ist für die Richtung "Koordinaten => Adresse".const axios = require('axios'); // Reverse-Geocoding anhand der aktuellen Koordinaten async function getLocation(latitude, longitude) { const url = `https://nominatim.openstreetmap.org/reverse?lat=${latitude}&lon=${longitude}&format=json`; const response = await axios.get(url); if (response.data && response.data.display_name) { log('Standort: ' + response.data.display_name); } }
-
@codierknecht sagte in Lösung für GPS-Koordinaten nach Ortsnamen aufschlüsseln?:
Das hier ist für die Richtung "Koordinaten => Adresse
Das ist doch das was wir schon können oder? Er wollte doch Adresse => Koordinaten oder?
-
So z.B.
https://nominatim.openstreetmap.org/search?format=json&q=Berlin, Alexanderplatz 10
Du musst nur schauen, ob du das "Zentrum" der jeweiligen Adresse haben willst oder die Boundingbox.
-
@david-g sagte in Lösung für GPS-Koordinaten nach Ortsnamen aufschlüsseln?:
Das ist doch das was wir schon können oder? Er wollte doch Adresse => Koordinaten oder?
Naja - wenn man Deinen Link und meinen Code kombiniert, könnte man auf sowas kommen:
const axios = require('axios'); // Geocoding anhand einer gegebenen Adresse async function getLocation(address) { const url = `https://nominatim.openstreetmap.org/search?format=json&q=${encodeURI(address)}`; const response = await axios.get(url); if (response.data && response.data.length > 0) { log(`Latitude: ${response.data[0].lat}, Longitude: ${response.data[0].lon}`); } }
-
@codierknecht, @Marc-Berg , @David-G
vielen Dank für eure Unterstützung es funktioniert