Python 将gpxlogger数据写入同一文件

Python 将gpxlogger数据写入同一文件,python,gps,gpx,gpsd,Python,Gps,Gpx,Gpsd,我有一些非常基本的gpxlogger代码,可以很好地将所有数据写入文件。(下文) 但是,我希望这段代码始终写入同一个文件,而不覆盖它。因此,如果可能的话,当它开始记录时,它会转到文件的底部,并开始记录那里的数据,在已经记录的数据下面 谢谢, 丹 读取xml文件的Javascript <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA7_kD1t_m22HBF9feCaDPZ

我有一些非常基本的gpxlogger代码,可以很好地将所有数据写入文件。(下文)

但是,我希望这段代码始终写入同一个文件,而不覆盖它。因此,如果可能的话,当它开始记录时,它会转到文件的底部,并开始记录那里的数据,在已经记录的数据下面

谢谢, 丹

读取xml文件的Javascript

  <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA7_kD1t_m22HBF9feCaDPZxQwcATY4FXmxYwkk9LNWGtAQdNKTBS1kBsTEqrRPg2kWxuNdmf2JVCIkQ" type="text/javascript"></script>
    <script src="http://gmaps-utility-library.googlecode.com/svn/trunk/markermanager/release/src/markermanager.js">   </script><script>
     var map;

     function initialize () {  
      if (GBrowserIsCompatible()) {
         map = new GMap2(document.getElementById("map_canvas"));
         map.setCenter(new GLatLng(53.423027, -1.523462), 10);  
     map.addControl(new GLargeMapControl());
         map.addControl(new GMapTypeControl());
         map.addMapType(G_PHYSICAL_MAP);
     map.setMapType(G_PHYSICAL_MAP);

     addMarkersFromXML();

      }

      }

      function addMarkersFromXML(){
       var batch = [];
       mgr = new MarkerManager(map); 

       var request = GXmlHttp.create();
       request.open('GET', 'gpslog.xml', true);
       request.onreadystatechange = function() {
       if (request.readyState == 4 && request.status == 200) {
        var xmlDoc = request.responseXML;
        var xmlrows = xmlDoc.documentElement.getElementsByTagName("trkpt");

        for (var i = 0; i < xmlrows.length; i++) {
            var xmlrow = xmlrows[i];

            var xmlcellLatitude = parseFloat(xmlrows[i].getAttribute("lat"));
          var xmlcellLongitude = parseFloat(xmlrows[i].getAttribute("lon"));
          var point = new GLatLng(xmlcellLatitude,xmlcellLongitude);

          //get the time of the pin plot
            var xmlcellplottime = xmlrow.getElementsByTagName("time")[0];
            var celltextplottime = xmlcellplottime.firstChild.data;

          //get the elevation of the pin plot
            var xmlcellplotelevation = xmlrow.getElementsByTagName("ele")[0];
            var celltextplotelevation = xmlcellplotelevation.firstChild.data;

          //get the number of satellites at the time of the pin plot
            var xmlcellplotsat = xmlrow.getElementsByTagName("sat")[0];
            var celltextplotsat = xmlcellplotsat.firstChild.data;


            var htmlString = "Time: " + celltextplottime + "<br>" + "Elevation: " + celltextplotelevation + "<br>" + "Satellites: " + celltextplotsat;
            //var htmlString = 'yes'

            var marker = createMarker(point,htmlString);
            batch.push(marker);

        }

        mgr.addMarkers(batch,10);
        mgr.refresh();

      }
        }
    request.send(null);

      }

     function createMarker(point,html) {
           var marker = new GMarker(point);
           GEvent.addListener(marker, "click", function() {
             marker.openInfoWindowHtml(html);
           });
           return marker;
     }

    </script>
  </head>
  <body onload="initialize()" onunload="GUnload()">
    <div id="map_canvas" style="width: 1350px; height: 800px"></div>
    <div id="message"></div>
  </body>
</html>

var映射;
函数初始化(){
if(GBrowserIsCompatible()){
map=newgmap2(document.getElementById(“map_canvas”);
赛特中心地图(新格拉特林(53.423027,-1.523462),10);
addControl(新的GlargeMappControl());
addControl(新的GMapTypeControl());
addMapType(G_PHYSICAL_map);
设置映射类型(G_物理_映射);
addMarkersFromXML();
}
}
函数addMarkersFromXML(){
var批=[];
mgr=新MarkerManager(map);
var request=GXmlHttp.create();
open('GET','gpslog.xml',true);
request.onreadystatechange=函数(){
if(request.readyState==4&&request.status==200){
var xmlDoc=request.responseXML;
var xmlrows=xmlDoc.documentElement.getElementsByTagName(“trkpt”);
对于(var i=0;i“+”高程:“+celltextplotelevation+”
“+”卫星:“+celltextplotsat; //var htmlString='是' var marker=createMarker(点,htmlString); 批量推送(标记); } 经理(第10批); 经理刷新(); } } 请求发送(空); } 函数createMarker(点,html){ var标记=新的GMarker(点); addListener(标记“单击”,函数(){ marker.openInfoWindowHtml(html); }); 返回标记; }
您遇到了一个问题,即后台监控的gpxlogger要求文件名使用
-f
标志,这将覆盖该文件。这你知道

我知道有两种选择。不作为守护进程运行
gpxlogger

gpxlogger >> /home/pi/Desktop/EPQ/temp_gps/gpslog
或者将其作为守护进程运行,并将文件添加到可追加的文件中

gpxlogger -d  -f /home/pi/Desktop/EPQ/temp_gps/gpslog & cat /home/pi/Desktop/EPQ/temp_gps/gpslog >> /home/pi/Desktop/EPQ/temp_gps/gpslog_concatenated

另一种方法是创建顺序日志,然后将它们与连接起来,但为了做到这一点,您需要有一个脚本和一个索引

使索引
echo 0>~/.gpxfilecount

打开收藏夹编辑器并创建一个包含以下内容的文件:

#! /usr/bin/bash

COUNT=`cat ~/.gpxfilecount`
echo $(($COUNT + 1 )) > ~/.gpxfilecount

filename="gpxlogfile${COUNT}.gpx"
exec  gpxlogger -d  -f $filename
标记脚本可执行文件
chmod+x~/bin/gpxer.sh
(或收藏夹名称)

每次启动gpxlogger时,都会创建一个递增的文件名。然后,可以通过gpsbable
gpsbabel-i geo-f gpxlogfile1.gpx-f gpxlogfile2.gpx-f gpxlogfile3.gpx-o gpx-f biglogcat.gpx将这些文件连接在一起,而无需撕裂,或者通过gpsbable工作。

这里有另一个选项

查看并将其放入目录,然后将以下脚本放入目录中

它从gpsd读取数据;创建gpx日志文件(如果不存在);当数据存在时,向其追加“轨迹点”数据;在重新启动后维护同一文件并附加“trackpoint”数据

将两者放在同一个目录中,然后让javascript读取文件..或将整个结构放在同一个脚本中

#!/usr/bin/env python
# coding=utf-8
""" gpx logger to create and append a gpx formatted log of gpsd data """ 
import os
import time
import gps3
from datetime import datetime

the_connection = gps3.GPSDSocket()
the_fix = gps3.Fix()
the_log = '/tmp/gpx3.gpx'  

creation = datetime.utcnow()
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
genesis = creation.strftime(fmt)

if not os.path.isfile(the_log):
    header = ('<?xml version = "1.0" encoding = "utf-8"?>\n'
              '<gpx version = "1.1" '
              'creator = "GPSD 3.9 - http://catb.org/gpsd" '
              'client = "gps3.py - http://github.com/wadda/gps3"'
              'xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"'
              'xmlns = "http://www.topografix.com/GPX/1/1"'
              'xsi:schemaLocation = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">\n '
              '<metadata>\n '
              '     <time>{}\n'
              '</metadata>\n').format(genesis)
    f = open(the_log, 'w')
    f.write(header)
    f.close()

try:
    for new_data in the_connection:
        if new_data:
            the_fix.refresh(new_data)
            if not isinstance(the_fix.TPV['lat'], str):  # lat determinate of when data is 'valid'                    
                latitude = the_fix.TPV['lat']
                longitude = the_fix.TPV['lon']
                altitude = the_fix.TPV['alt']
                time = the_fix.TPV['time']
                mode = the_fix.TPV['mode']
                tag = the_fix.TPV['tag']

                sats = the_fix.satellites_used()
                hdop = the_fix.SKY['hdop']
                vdop = the_fix.SKY['vdop']
                pdop = the_fix.SKY['pdop']

                trackpoint = ('<trkpt lat = {} lon = {}>\n'
                              '    <ele>{}</ele>\n'
                              '    <time>{}</time>\n'
                              '    <src>GPSD tag ="{}"</src>\n'
                              '    <fix>{}</fix >\n'
                              '    <sat>{}</sat>\n'
                              '    <hdop>{}</hdop>\n'
                              '    <vdop>{}</vdop>\n'
                              '    <pdop>{}</pdop>\n'
                              '</trkpt>\n').format(latitude, longitude, altitude, time, tag, mode, sats[1], hdop, vdop, pdop)
                addendum = open(the_log, 'a')
                addendum.write(trackpoint)
                addendum.close()


except Exception as error:
    print('Danger-Danger',error)
#/usr/bin/env python
#编码=utf-8
“”“用于创建和附加gpsd数据的gpx格式日志的gpx记录器”“”
导入操作系统
导入时间
导入gps3
从日期时间导入日期时间
_连接=gps3.GPSDSocket()
_fix=gps3.fix()
_log='/tmp/gpx3.gpx'
creation=datetime.utcnow()
fmt=“%Y-%m-%d%H:%m:%S%Z%Z”
genesis=creation.strftime(fmt)
如果不是os.path.isfile(日志):
标头=('\n'
“\n”
“\n”
“{}\n”
“\n')。格式(genesis)
f=打开(_日志“w”)
f、 写入(标题)
f、 关闭()
尝试:
对于\u连接中的新\u数据:
如果是新数据:
_fix.refresh(新的_数据)
如果不存在(_fix.TPV['lat'],str):#lat确定数据何时“有效”
纬度=_fix.TPV['lat']
经度=_fix.TPV['lon']
海拔高度=固定高度.TPV['alt']
时间=_fix.TPV['time']
mode=_fix.TPV['mode']
tag=_fix.TPV['tag']
sats=所使用的固定卫星()
hdop=固定天空['hdop']
vdop=固定天空['vdop']
pdop=天空['pdop']
轨迹点=('\n'
“{}\n”
“{}\n”
'GPSD tag=“{}”\n'
“{}\n”
“{}\n”
“{}\n”
“{}\n”
“{}\n”
“\n”)。格式(纬度、经度、海拔、时间、标记、模式、,
#!/usr/bin/env python
# coding=utf-8
""" gpx logger to create and append a gpx formatted log of gpsd data """ 
import os
import time
import gps3
from datetime import datetime

the_connection = gps3.GPSDSocket()
the_fix = gps3.Fix()
the_log = '/tmp/gpx3.gpx'  

creation = datetime.utcnow()
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
genesis = creation.strftime(fmt)

if not os.path.isfile(the_log):
    header = ('<?xml version = "1.0" encoding = "utf-8"?>\n'
              '<gpx version = "1.1" '
              'creator = "GPSD 3.9 - http://catb.org/gpsd" '
              'client = "gps3.py - http://github.com/wadda/gps3"'
              'xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"'
              'xmlns = "http://www.topografix.com/GPX/1/1"'
              'xsi:schemaLocation = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">\n '
              '<metadata>\n '
              '     <time>{}\n'
              '</metadata>\n').format(genesis)
    f = open(the_log, 'w')
    f.write(header)
    f.close()

try:
    for new_data in the_connection:
        if new_data:
            the_fix.refresh(new_data)
            if not isinstance(the_fix.TPV['lat'], str):  # lat determinate of when data is 'valid'                    
                latitude = the_fix.TPV['lat']
                longitude = the_fix.TPV['lon']
                altitude = the_fix.TPV['alt']
                time = the_fix.TPV['time']
                mode = the_fix.TPV['mode']
                tag = the_fix.TPV['tag']

                sats = the_fix.satellites_used()
                hdop = the_fix.SKY['hdop']
                vdop = the_fix.SKY['vdop']
                pdop = the_fix.SKY['pdop']

                trackpoint = ('<trkpt lat = {} lon = {}>\n'
                              '    <ele>{}</ele>\n'
                              '    <time>{}</time>\n'
                              '    <src>GPSD tag ="{}"</src>\n'
                              '    <fix>{}</fix >\n'
                              '    <sat>{}</sat>\n'
                              '    <hdop>{}</hdop>\n'
                              '    <vdop>{}</vdop>\n'
                              '    <pdop>{}</pdop>\n'
                              '</trkpt>\n').format(latitude, longitude, altitude, time, tag, mode, sats[1], hdop, vdop, pdop)
                addendum = open(the_log, 'a')
                addendum.write(trackpoint)
                addendum.close()


except Exception as error:
    print('Danger-Danger',error)
#! /usr/bin/python3
# coding=utf-8
"""banana"""
import xml.dom.minidom
import gps3
import time
from datetime import datetime, timezone, timedelta
import os
import sys

gps_connection = gps3.GPSDSocket()
gps_fix = gps3.Fix()

the_log = '/tmp/gpx3.gpx'


def start_time():
    """time in the beginning"""
    timestart = str(datetime.utcnow().replace(tzinfo=(timezone(timedelta(0)))))
    return timestart


def close(doc):
    """write file to disk and close"""
    log_write = open(the_log, "w")
    doc.writexml(log_write)
    log_write.close()


if os.path.isfile(the_log):
    doc = xml.dom.minidom.parse(the_log)  # opens the pre-existing
    gpx_element = doc.firstChild

else:
    doc = xml.dom.minidom.Document()
    gpx_element = doc.createElement("gpx")
    doc.appendChild(gpx_element)

trk_element = doc.createElement("trkseg")
trk_element.setAttribute("began", start_time())
gpx_element.appendChild(trk_element)
utc = alt = hdop = vdop = pdop = mode = sats = tag = 'n/a'
try:
    tpv_list = {'time': utc, 'ele': alt, 'tag': tag}
    sky_list = {'hdop': hdop, 'vdop': vdop, 'pdop': pdop}
    # misc_list = {'sat': sats, 'fix':mode}  # just an account
    element = {}
    x = 1  # for the 'is it working?'
    for new_data in gps_connection:
        if new_data:
            gps_fix.refresh(new_data)
        if not isinstance(gps_fix.TPV['lat'], str):
            trkpt_element = doc.createElement("trkpt")
            trk_element.appendChild(trkpt_element)
            trkpt_element.setAttribute('lat', str(gps_fix.TPV['lat']))
            trkpt_element.setAttribute('lon', str(gps_fix.TPV['lon']))

            # tpv_list[key]
            for key in tpv_list:
                if key == 'ele':
                    element[key] = '{}'.format(gps_fix.TPV['alt'])  # because consistency with labels is a horrible.
                else:
                    element[key] = '{}'.format(gps_fix.TPV[key])
            # sky_list[key]
            for key in sky_list:
                element[key] = '{}'.format(gps_fix.SKY[key])
            # Misc.
            element['sat'] = '{}'.format(gps_fix.satellites_used()[1])
            element['fix'] = '{}'.format(("ZERO", "NO_FIX", "2D", "3D")[gps_fix.TPV['mode']])

            for key in element:
                trkpt_data = doc.createElement(key)
                trkpt_element.appendChild(trkpt_data)

                new_value = doc.createTextNode(element[key])
                trkpt_data.appendChild(new_value)

            # print(doc.toprettyxml())
            close(doc)  # write to file with every trackpoint
            print('Cycle', x)  # Only an "is it working?"
            x += 1
            time.sleep(1)

except KeyboardInterrupt:
    gps_connection.close()
    print("\nTerminated by user\nGood Bye.\n")

if __name__ == '__main__':
    pass