speider13
Goto Top

Geotagging via SMS und UMTS-Stick

Hallo,

ich hätte eine frage und komme im momment nicht so ganz klar damit.

Ich habe ein "Gerät" das sendet die aktuelle Position via SMS als "Google Maps URL" an meinen Windows PC an dem ein UMTS-Stick dran ist.
Jetzt hätte ich aber die Postionen gerne in Google Earth oder in einem ähnlichen Programm, hätte jemand eine Idee für eine Batch Datei?

Die Text Datei in der die SMS gespeichert wird sieht so aus:

2013-01-27 13:06:15'43 SMS: +49100000000 2013-01-27 13:05:49 [04]  
27.01.2013 13:05
https://maps.google.de/maps?q=+48%C2%B024'10.25%22N+++9%C2%B058'18.83%22E&hl=de&ie=UTF8&ll=48.401742,9.97683&spn=0.013063,0.033023&sll=48.661847,9.003665&sspn=6.654792,16.907959&t=h&z=16 


Oder wen das nicht klappen sollte, dann hätte ich wenigstens gerne eine schöne Sicherungsdatei, in der die URLs stehen.


Vielleicht weiß es ja jemand.


Viele Grüße
Robin

Content-Key: 197712

Url: https://administrator.de/contentid/197712

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: MrNetman
MrNetman 27.01.2013 um 14:53:12 Uhr
Goto Top
Hi Speider,

ich sehe keinerlei Geoinformation in der Zeile.
Anosonsten macht man das in etwa so, dass man die empfangene Zeile an eine vorhandene Datei anhängt. Das geht mit nahezu allen BATCH Kommandos.
In der Batch ist das das Zeichen ">>"getagt.txt oder .CSV. Dann kann man das Zeilenweise wieder abarbeiten.

Gruß
Netman
Mitglied: Speider13
Speider13 27.01.2013 aktualisiert um 17:28:18 Uhr
Goto Top
Hallo Netman,

die URL sollte dann praktisch der google Maps Link sein.

Wie in etwa müsste die Batch datei dann aussehen?
also praktisch muss man ja Zeile "3" kopieren und irgendwie so umwandeln das es Google Earth oder ein anderes Programm lesen kann umändern, oder?

Gruß
Robin
Mitglied: rubberman
rubberman 27.01.2013 aktualisiert um 18:13:32 Uhr
Goto Top
Hallo Speider13, willkommen im Forum.

Zitat von @Speider13:
Die Text Datei in der die SMS gespeichert wird sieht so aus:
2013-01-27 13:06:15'43 SMS: +49100000000 2013-01-27 13:05:49 [04]
URL

also praktisch muss man ja Zeile "3" kopieren

Wenn du uns nun noch erzählst, wo du eine Zeil 3 siehst (gepostet hast du 2) und wie diese aussieht, könnte man vielleicht auch was daraus machen. Aus deinen Informationen kann ich diesbezüglich nichts nützliches entnehmen (und offensichtlich bin ich da nicht der einzige).

Grüße
rubberman
Mitglied: Speider13
Speider13 27.01.2013 aktualisiert um 18:40:15 Uhr
Goto Top
Hallo danke,

sorry, zwischen dem Datum und der URL ist noch eine Leerzeile, dass hat das aber nicht angezeigt, tut aber ja auch nichts zur Sache denke ich :D

so ne google Maps URL sieht so aus:
https://maps.google.de/maps?q=+48%C2%B024'10.25%22N+++9%C2%B058'18.83%22E&hl=de&ie=UTF8&ll=48.401742,9.97683&spn=0.013063,0.033023&sll=48.661847,9.003665&sspn=6.654792,16.907959&t=h&z=16 

Also nochmal zusammengefasst:
1. Zeile Zeit und Datum vom SMS Programm
2. Zeile Zeit und Datum vom Absender
3. Zeile die Google Maps URL

2013-01-27 13:06:15'43 SMS: +49100000000 2013-01-27 13:05:49 [04]  
27.01.2013 13:05
https://maps.google.de/maps?q=+48%C2%B024'10.25%22N+++9%C2%B058'18.83%22E&hl=de&ie=UTF8&ll=48.401742,9.97683&spn=0.013063,0.033023&sll=48.661847,9.003665&sspn=6.654792,16.907959&t=h&z=16 

Ich denke jetzt sieht es besser aus ;)

Viele Grüße
Robin
Mitglied: rubberman
rubberman 27.01.2013 um 19:07:15 Uhr
Goto Top
Hallo Speider13,

ja jetzt wird das was.
Bei mir heißt die Textdatei test.txt, musst du entsprechend anpassen.
@echo off &setlocal
for /f "usebackq skip=2 delims=" %%i in ("test.txt") do if not defined url set "url=%%i"  
start "" "%url%"  

Alternativ drag/drop Textdatei auf das Script:
@echo off &setlocal
for /f "usebackq skip=2 delims=" %%i in ("%~1") do if not defined url set "url=%%i"  
start "" "%url%"  

Grüße
rubberman
Mitglied: Speider13
Speider13 27.01.2013 aktualisiert um 19:39:38 Uhr
Goto Top
Wow super!

das funktioniert echt super!
leider ohne Google Earth funktion, aber ist aber auch so ganz gut


Und nochmals vielen Dank!
Mitglied: rubberman
rubberman 28.01.2013 aktualisiert um 00:29:07 Uhr
Goto Top
Hallo Speider13.

Das Spielchen mit Google Earth zu betreiben, ist noch mal eine andere Liga. Hier kommst du mit Batch nicht weit, JScript würde sich da eher anbieten.
Um die Sache nicht unnötig zu verkomplizieren, gehe ich davon aus, dass die Koordinaten immer in Grad, Minuten und Sekunden Nord bzw. Ost angegeben sind und dass die Dateiendung *.kml mit Google Earth assoziiert ist.

Speichere folgenden Code als *.js Datei ab und ziehe deine Textdatei auf des Script.
if (WScript.arguments.count() != 1) {WScript.quit();}

var oFSO = new ActiveXObject('Scripting.FileSystemObject');  
var oWShell = new ActiveXObject('WScript.Shell')  
oWShell.CurrentDirectory = oFSO.GetParentFolderName(WScript.ScriptFullName);

var oFile = oFSO.OpenTextFile(WScript.arguments(0));
var url;
var s = '';  
while (!oFile.AtEndOfStream) {
  url = oFile.ReadLine();
  if (url.substr(0, 4) == 'http') {  
    var query = url.split('?');  
    var vars = query[1].split('&');  
    for (var i = 0; i < vars.length; ++i) {
      var pair = vars[i].split('=');  
      if (decodeURIComponent(pair) == 'q') {  
        s = decodeURIComponent(pair[1]);
      }
    }
  }
}
oFile.close();
oFile = null;

if (s == '') {WScript.quit();}  

var oRepl = new RegExp('[+°\'"NE]', 'g');  
s = s.replace(oRepl, ' ');  
for (var i = 0; i < 20; ++i) {s = s.replace('  ', ' ');}  
if (s.charAt(0) == ' ') {s = s.substr(1);}  

var a = s.split(' ');  
var north = parseFloat(a) + parseFloat(a[1]) / 60 + parseFloat(a[2]) / 3600;
var east = parseFloat(a[3]) + parseFloat(a[4]) / 60 + parseFloat(a[5]) / 3600;

oFile = oFSO.OpenTextFile('location.kml', 2, true);  
oFile.WriteLine('<?xml version="1.0" encoding="Windows-1252"?>');  
oFile.WriteLine('<kml xmlns="http://www.opengis.net/kml/2.2">');  
oFile.WriteLine('  <Placemark>');  
oFile.WriteLine('    <name>Position</name>');  
oFile.WriteLine('    <description>Koordinaten via SMS.</description>');  
oFile.WriteLine('    <Point>');  
oFile.WriteLine('      <coordinates>' + east + ',' + north + ',0</coordinates>');  
oFile.WriteLine('    </Point>');  
oFile.WriteLine('  </Placemark>');  
oFile.WriteLine('</kml>');  
oFile.close();

oWShell.run('location.kml');  

Grüße
rubberman
Mitglied: Speider13
Speider13 28.01.2013 um 02:07:46 Uhr
Goto Top
Wow, das ist ein Monster! Danke ;)

Nur habe ich noch drei Probleme:
1. Wen ich mit dem Befehl eine .txt erstelle, steht der Text dort drin nur mit "Text" also mit Anführungszeichen. echo "%url%" >> %Earth%\%Nr%\%Datum::=.%.txt
was ist falsch?

2. Wie ist es möglich die .js Datei von einer Batch Datei zu starten?
Also so funktioniert es nicht:
start "%Quelle%\%Nr%\%Datum%.txt" "D:\SMS\Earth.js"

3. Kann man die .js auch so umschreiben das es mehrere Koordinaten aus einer Textdatei in der mehrere Links drin sind rausliest? Weil im Momment nimmt es immer nur eine URL.

Viele Grüße
Robin
Mitglied: rubberman
rubberman 28.01.2013 um 19:36:39 Uhr
Goto Top
Hallo Speider 13

1. Wen ich mit dem Befehl eine .txt erstelle, steht der Text dort drin nur mit "Text" also mit Anführungszeichen.
echo "%url%" >> %Earth%\%Nr%\%Datum::=.%.txt
was ist falsch?
Falsch ist erst mal dass du es aus dem Zusammenhang gerissen hast. So kann ich dir das auch nicht beantworten. Im ganzen Batch bitte face-wink


2. Wie ist es möglich die .js Datei von einer Batch Datei zu starten?
Also so funktioniert es nicht:
start "%Quelle%\%Nr%\%Datum%.txt" "D:\SMS\Earth.js"
So ähnlich.
start "" wscript "D:\SMS\Earth.js" "%Quelle%\%Nr%\%Datum%.txt"


3. Kann man die .js auch so umschreiben das es mehrere Koordinaten aus einer Textdatei in der mehrere Links drin sind rausliest?
Weil im Momment nimmt es immer nur eine URL.
Kann man.
if (WScript.arguments.count() != 1) {WScript.quit();}

var oFSO = new ActiveXObject('Scripting.FileSystemObject');  
var oWShell = new ActiveXObject('WScript.Shell')  
var oRepl = new RegExp('[+°\'"NE]', 'g');  
oWShell.CurrentDirectory = oFSO.GetParentFolderName(WScript.ScriptFullName);

var oFile2 = oFSO.OpenTextFile('location.kml', 2, true);  
oFile2.WriteLine('<?xml version="1.0" encoding="Windows-1252"?>');  
oFile2.WriteLine('<kml xmlns="http://www.opengis.net/kml/2.2">');  
oFile2.WriteLine('  <Document>');  

var oFile1 = oFSO.OpenTextFile(WScript.arguments(0));
var url, s, n = 0;
while (!oFile1.AtEndOfStream) {
  url = oFile1.ReadLine();
  if (url.substr(0, 4) == 'http') {  
    var query = url.split('?');  
    var vars = query[1].split('&');  
    for (var i = 0; i < vars.length; ++i) {
      var pair = vars[i].split('=');  
      if (decodeURIComponent(pair) == 'q') {  
        n += 1;
        s = decodeURIComponent(pair[1]);
        s = s.replace(oRepl, ' ');  
        for (var i = 0; i < 20; ++i) {s = s.replace('  ', ' ');}  
        if (s.charAt(0) == ' ') {s = s.substr(1);}  
        var a = s.split(' ');  
        var north = parseFloat(a) + parseFloat(a[1]) / 60 + parseFloat(a[2]) / 3600;
        var east = parseFloat(a[3]) + parseFloat(a[4]) / 60 + parseFloat(a[5]) / 3600;
        oFile2.WriteLine('    <Placemark>');  
        oFile2.WriteLine('      <name>Position ' + n + '</name>');  
        oFile2.WriteLine('      <description>Koordinaten via SMS.</description>');  
        oFile2.WriteLine('      <Point>');  
        oFile2.WriteLine('        <coordinates>' + east + ',' + north + ',0</coordinates>');  
        oFile2.WriteLine('      </Point>');  
        oFile2.WriteLine('    </Placemark>');  
      }
    }
  }
}
oFile1.close();

oFile2.WriteLine('  </Document>');  
oFile2.WriteLine('</kml>');  
oFile2.close();

if (n == 0) {WScript.quit();}

oWShell.run('location.kml', 3);  


Grüße
rubberman
Mitglied: Speider13
Speider13 28.01.2013 um 21:47:59 Uhr
Goto Top
Super danke!
Die beiden Sachen funktionieren super!

Und um ersten Problem:

@echo off &setlocal
set "Quelle=D:\Benutzer\smstest.txt"  
set "Earth=D:\Benutzer\Earth"  

for /f "usebackq skip=2 delims=" %%i in ("test.txt") do if not defined url set "url=%%i"  
start "" "%url%"  
for /f "usebackq skip=1 tokens=2 delims=h" %%i in (%Quelle%) do if not defined url set "url=%%i"  
start "" "h%url%"  

if not exist "%Earth%\%Nr%" md "%Earth%\%Nr%"  
echo "h%url%" >> %Earth%\%Nr%\%Datum::=.%.txt  

Bei der leitzen Zeile wird die txt erstellt, nur sieht die dann so aus
"https://maps.google.de/maps?q=+48%C2%B024'10.25%22N+++9%C2%B058'18.83%22E&"   
Also es sind immer " dabei, die sollten aber weg.

Viele Grüße
Robin
Mitglied: rubberman
rubberman 28.01.2013 um 22:09:25 Uhr
Goto Top
Hallo Speider13.

Um nicht alle möglichen Zeichen maskieren zu müssen, würde ich auf die verzögerte Variablenerweiterung zurück greifen.
Für deine Zeile 11 die folgenden drei:
setlocal EnableDelayedExpansion
>>"!Earth!\!Nr!\!Datum::=.!.txt" echo h!url!  
endlocal


Grüße
rubberman
Mitglied: Speider13
Speider13 28.01.2013 um 22:53:06 Uhr
Goto Top
Super funktioniert!

Also jetzt habe ich es dann :D
wird auch Zeit, ich glaube ich nerve ziemlich xD


Falls doch noch jemand Lust hat, würde das gehen das die Punkte noch mit Linien nacheinander verbunden werden in Google Earth, also praktisch eine Route.

Viele Grüße
Mitglied: rubberman
rubberman 28.01.2013, aktualisiert am 29.01.2013 um 00:20:49 Uhr
Goto Top
Hallo Speider13.

Bin mit Google Earth nicht vertraut (konkret habe ich es nur installiert, um das .js zu testen). Hast du so etwas schon mal in GE gesehen? Falls ja, wird das auch irgendwie funktionieren. Kannst ja mithelfen eine Vorlage für eine .kml Datei zu finden, die so etwas beispielhaft beschreibt. Die Umsetzung im Script sollte dann vermutlich nicht mehr das Problem sein.

Grüße
rubberman

PS: Wenn du mit "Route" meinst, dass einem Straßenverlauf gefolgt werden soll, dann nein. Dazu wäre eine Datenbank nötig, die sämtliche Straßenverläufe beinhaltet. So wie bspw. Navigationssysteme solche Datenbanken haben oder auf solche zurück greifen.
Mitglied: Speider13
Speider13 29.01.2013 aktualisiert um 16:54:52 Uhr
Goto Top
Hallo,

ne ich meinte nur das die Punkte zusammen verbunden werden, ist aber nicht so wichtig.
Das passt so schon. Auf jedefall funktioniert fast alles so wie es soll, echt super von euch!

Nur habe ich jetzt ein Problem, ist mir ziemlich peinlich, aber die URLs sehen doch etwas anderst aus, sodas das Script die nicht mehr verarbeiten kann. :O

http://maps.google.com/maps?f=q&q=68.498772,20.020090&z=16
Also sind die Koordinaten in dem Fall: 68.498772,20.020090

in der .kml Datei steht nur "NaN,NaN,0"

Sorry nochmal face-sad

Viele Grüße
Robin
Mitglied: rubberman
rubberman 29.01.2013 um 18:36:23 Uhr
Goto Top
Hallo Speider13.

Wenn die URL so aussieht, vereinfacht das die Verarbeitung sogar. Letztlich werden Längen- und Breitengrad als Dezimalzahl benötigt.
Wie man die Punkte verbindet, habe ich mittlerweile auch heraus gefunden.
if (WScript.arguments.count() != 1) {WScript.quit();}

var oFSO = new ActiveXObject('Scripting.FileSystemObject');  
var oWShell = new ActiveXObject('WScript.Shell')  
oWShell.CurrentDirectory = oFSO.GetParentFolderName(WScript.ScriptFullName);

var oFile2 = oFSO.OpenTextFile('location.kml', 2, true);  
oFile2.WriteLine('<?xml version="1.0" encoding="Windows-1252"?>');  
oFile2.WriteLine('<kml xmlns="http://www.opengis.net/kml/2.2">');  
oFile2.WriteLine('  <Document>');  
oFile2.WriteLine('    <Style id="lineStyle">');  
oFile2.WriteLine('      <LineStyle>');  
oFile2.WriteLine('        <color>80ff0000</color>');  
oFile2.WriteLine('        <width>6</width>');  
oFile2.WriteLine('      </LineStyle>');  
oFile2.WriteLine('    </Style>');  

var oFile1 = oFSO.OpenTextFile(WScript.arguments(0));
var url, s, pt, line = '', n = 0;  
while (!oFile1.AtEndOfStream) {
  url = oFile1.ReadLine();
  if (url.substr(0, 4) == 'http') {  
    var query = url.split('?');  
    var vars = query[1].split('&');  
    for (var i = 0; i < vars.length; ++i) {
      var pair = vars[i].split('=');  
      if (decodeURIComponent(pair) == 'q') {  
        n += 1;
        s = decodeURIComponent(pair[1]);
        pt = s.split(',');  
        oFile2.WriteLine('    <Placemark>');  
        oFile2.WriteLine('      <name>Position ' + n + '</name>');  
        oFile2.WriteLine('      <description>Koordinaten via SMS.</description>');  
        oFile2.WriteLine('      <Point>');  
        oFile2.WriteLine('        <coordinates>' + pt[1] + ',' + pt + ',0</coordinates>');  
        oFile2.WriteLine('      </Point>');  
        oFile2.WriteLine('    </Placemark>');  
        line += pt[1] + ',' + pt + ',0 ';  
      }
    }
  }
}
oFile1.close();

oFile2.WriteLine('    <Placemark>');  
oFile2.WriteLine('      <name>Verbindungslinie</name>');  
oFile2.WriteLine('      <description>Linie zwischen den Einzelpositionen</description>');  
oFile2.WriteLine('      <styleUrl>#lineStyle</styleUrl>');  
oFile2.WriteLine('      <GeometryCollection>');  
oFile2.WriteLine('        <LineString>');  
oFile2.WriteLine('          <coordinates>' + line + '</coordinates>');  
oFile2.WriteLine('        </LineString>');  
oFile2.WriteLine('      </GeometryCollection>');  
oFile2.WriteLine('    </Placemark>');  
oFile2.WriteLine('  </Document>');  
oFile2.WriteLine('</kml>');  
oFile2.close();

if (n == 0) {WScript.quit();}

oWShell.run('location.kml', 3);  

Grüße
rubberman
Mitglied: Speider13
Speider13 29.01.2013 aktualisiert um 20:57:26 Uhr
Goto Top
WOW du bist unglaublich!
Das funktioniert super!!

Nur kam jetzt mal wieder ein Problem...

die bat wird sobald ich sie ausführ 3 mal! ausgeführt?!

Es muss ja was mit dem URL Teil zutun haben ab Zeile 25

@echo off & setlocal
:set "Quelle=C:\Dokumente und Einstellungen\Benutzer\Startmenü\Programme\MWconn\sms1.txt" 
set "Quelle=D:\SMS\sms1.txt"  
set "Ziel=D:\SMS\Sicherung"  
set "Main=D:\SMS"  

set Kopf=True
for /f "usebackq delims=" %%i in ("%Quelle%") do set "Zeile=%%i" & call :ProcessLine  
goto :eof

:ProcessLine
set "Zeile=%Zeile:>=^>%"  
set "Zeile=%Zeile:<=^<%"  
if not defined Kopf (echo %Zeile%)>>"%Datei%" & set Kopf=True & goto :eof  

for /f "usebackq tokens=2 delims=+" %%l in ('echo %Zeile:'=%') do for /f "tokens=1-3" %%a in ('echo %%l') do set "Nr=%%a" & set "Datum=%%b" & set "Zeit=%%c"  
if not exist "%Ziel%\%Nr%" md "%Ziel%\%Nr%"  
set "Datei=%Ziel%\%Nr%\%Datum::=.%.csv"  
set Kopf=


FOR /F "tokens=1,2,3 delims=/: " %%a in ('Time/T') do set CTIME=%%a%%b%%c  


for /f "usebackq skip=2 tokens=2 delims=h" %%i in (%Quelle%) do if not defined url set "url=%%i"  
start "" "h%url%"  
if not exist "%Earth%\%Nr%" md "%Earth%\%Nr%"  
setlocal EnableDelayedExpansion
>>"!Earth!\!Nr!\!Datum::=.!.txt" echo h!url!  
endlocal

Und das ist die Nachricht

2013-01-28 20:06:15'43 SMS: +49 2013-01-28 20:05:49 [04]  

2013-01-28 20:06:15
speed:1.57
T:13/01/29 16:32
bat:100% 395711031304228
 http://maps.google.com/maps?f=q&q=48.498772,10.020090&z=16

aber warum wird die bat 3mal ausgeführt?! seltsam!
Wen ich z.B. nur ne 2 Zeilige Nachricht habe funktioniert sie einwandfrei! face-sad

Es ist zum verrückt werden!!!! face-sad face-sad
Mitglied: rubberman
rubberman 29.01.2013 um 21:30:01 Uhr
Goto Top
Hallo Speider13.

Wie kommst du darauf, dass die Batchdatei 3x ausgeführt wird face-surprise ?
Du rufst für jede Zeile in sms1.txt die Subroutine :ProcessLine auf. Je mehr Zeilen, um so öfter wird sie aufgerufen. Da ich aber nicht weiß, welches Verhalten du von deinem Batchscript erwartest (welche Logik steckt dahinter und was soll dabei heraus kommen), weiß ich nicht wo ich dir helfen kann.
Ein paar Sachen die mir unabhängig davon aufgefallen sind:
  • Wo nutzt du Variable Main?
  • Woher kommt der Wert der Variablen Earth?
  • Warum maskierst du < und > in den Zeilen 12 und 13? Kommen die irgendwo vor?

Grüße
rubberman
Mitglied: rubberman
rubberman 30.01.2013 um 21:31:39 Uhr
Goto Top
Schau mal, ob du mit diesem Ansatz bei allen Möglichkeiten die richtigen Ausgaben bekommst.
@echo off &setlocal
set "quelle=D:\SMS\sms1.txt"  

set /p "firstLine="<"%quelle%"  
echo %firstLine%

for /f "tokens=2 delims=+" %%i in ("%firstLine%") do (  
  for /f "tokens=1-3" %%j in ("%%i") do (  
    set "nr=%%j"  
    set "datum=%%k"  
    for /f "tokens=1-3 delims=:" %%m in ("%%l") do (  
      set "hh=%%m"  
      set "mm=%%n"  
      set "ss=%%o"  
    )
  )
)
echo %nr%
echo %datum%
echo %hh%
echo %mm%
echo %ss%

for /f "tokens=*" %%i in ('findstr "\<http" "%quelle%"') do set "url=%%i"  
setlocal EnableDelayedExpansion
echo !url!
endlocal

pause

Grüße
rubberman
Mitglied: Speider13
Speider13 03.02.2013 um 12:33:17 Uhr
Goto Top
Hey,

sorry hat etwas länger gedauert mit dem Antworten, aber so funktioniert es!

Vielen Dank nochmal!