【问题标题】:get garmin gps coordinates into javascript variable将 garmin gps 坐标转换为 javascript 变量
【发布时间】:2012-03-08 06:21:56
【问题描述】:

我想删除一个标记并在 openlayers (javascript) 中创建一个新标记。我可以这样做,但诀窍是我想将新标记放置在我的 garmin etrex gps 接收器报告的当前纬度/经度位置。我可以使用 gpsbabel 从接收器获取新位置,我可以使用子进程在 python 中执行此操作。我能想到的将这些数据放入 javascript 变量的唯一方法是在 python CGI 脚本中使用字符串替换。问题是从 gps 接收器获取新数据的唯一方法是刷新页面,这会导致地图在短时间内消失,丢失当前缩放级别,而且这不是一个非常干净的方法这样做。我正在寻找有关如何将 gps 中的坐标转换为 javascript 变量的任何想法。

jython 是否可以将坐标从 python 脚本获取到 javascript 中?我不熟悉它,但我今天所做的阅读似乎表明这需要在端口 8080 上运行,这并不理想,因为我想使用 python cgi 脚本。也许这仍然是可能的。

我一直在寻找 api,但 garmin 的产品似乎与他们的网站相关联,如果你只想要当前坐标,它们就有点矫枉过正了。

我查看了 gpsd,但在基本通信方面遇到了问题,并且无法通过 javascript 的 tcp 端口 2947 与守护进程通信。

我正在使用 gentoo linux。

谢谢, 约翰

【问题讨论】:

    标签: javascript jython openlayers garmin gpsd


    【解决方案1】:

    在客户端设置一个计时器(使用 setTimeout javascript 函数)以每 10 秒左右更新一次标记位置。 为此,您应该使用 ajax 从服务器(运行 python 代码或类似的东西)获取最后一个位置。

    【讨论】:

    • 感谢您的回答。昨晚我偶然发现了有关 ajax 工作原理的解释。你对这个想法的附议是我研究它的足够动力。从昨晚开始,我一直在尝试熟悉如何创建插件。我想这两种方法都行。
    【解决方案2】:

    所以,正如@sahmad 所建议的那样,AJAX 似乎是要走的路。就像我之前说的,我开始尝试使用浏览器插件解决问题。我为此使用了喷火。一路上学到了一些艰难的教训。最重要的是,当您对插件进行更改时,您要么需要使插件崩溃并重新加载页面,要么需要重新启动浏览器。我浪费了很多时间,对这个简单的事实一无所知。这个插件方向对我来说也花了更长的时间,因为我的 C++ 技能还处于开发的早期阶段。

    AJAX 路由很容易学习。我以此页面为起点:http://www.degraeve.com/reference/simple-ajax-example.php

    我以为我会完成我的示例并报告我的解决方案,然后这件事就全部结束了。但是,在创建示例的过程中,我提出了另一个问题。以下是文件:

    我像这样修改了html文件:

    <html>
    <head>
    <title>Simple Ajax Example</title>
    <script language="Javascript">
    function xmlhttpPost(strURL) {
        var xmlHttpReq = false;
        var self = this;
        // Mozilla/Safari
        if (window.XMLHttpRequest) {
            self.xmlHttpReq = new XMLHttpRequest();
        }
        // IE
        else if (window.ActiveXObject) {
            self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
        }
        self.xmlHttpReq.open('POST', strURL, true);
        self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        self.xmlHttpReq.onreadystatechange = function() {
            if (self.xmlHttpReq.readyState == 4) {
                updatepage(self.xmlHttpReq.responseText);
            }
        }
        self.xmlHttpReq.send(getquerystring());
    }
    
    function getquerystring() {
        qstr = 'latLon=' + escape(document.forms['f1'].lat.value + ':' + document.forms['f1'].lon.value);
        return qstr;
    }
    
    function updatepage(str){
        document.getElementById("result").innerHTML = str;
    }
    
    function moveMarker(){
        document.getElementById("timer").innerHTML= parseFloat(document.getElementById("timer").innerHTML) + 1
        xmlhttpPost("/cgi-bin/ajax3.py")
    
        var latFromGPS = document.forms["f1"]["gpsLat"].value;
        var lonFromGPS = document.forms["f1"]["gpsLon"].value;
    
        document.forms["f1"]["lat"].value=latFromGPS;
        document.forms["f1"]["lon"].value=lonFromGPS;
    
    }    
    window.setInterval('moveMarker()', 2000);
    
    </script>
    </head>
    <body>
    <form name="f1">
        <p id=timer>0</p>
        <p><input type="text" id="lat" name="lat" value="35.0"> </p>
        <!-- <input type="hidden" name="gpsLat" value="35.0"> -->
        <p><input type="text" id="lon" name="lon" value="-106.0"> </p>
      <div id="result"></div>
    </form>
    </body>
    </html>
    

    这是我的python cgi脚本(对于这个例子,它应该在cgi-bin中保存为ajax3.py):

    #! /usr/bin/python
    
    import cgi
    
    import cgitb; cgitb.enable() # for troubleshooting
    
    print "Content-type: text/html"
    print ""
    
    # Create instance of FieldStorage 
    form = cgi.FieldStorage()
    
    gpsLat = float(form.getvalue("latLon").split(":")[0])
    gpsLon = float(form.getvalue("latLon").split(":")[1])
    
    print '<input type="hidden" name="gpsLat" value="%s">' % (gpsLat + 0.001)
    print '<input type="hidden" name="gpsLon" value="%s">' % (gpsLon + 0.001)
    

    我尝试通过在 cgi 脚本中的纬度和经度上简单地添加千分之一度来模拟 GPS 报告坐标。然后通过隐藏的输入类型将此结果发送回原始页面。有趣的是,我实际上必须以两倍于我希望报告坐标的频率调用 moveMarker()。这不是问题,但我想了解为什么会这样。从我幼稚的角度来看,我认为

    xmlhttpPost("/cgi-bin/ajax3.py") 
    

    命令将在下一个命令之前执行并完成

    var latFromGPS = document.forms["f1"]["gpsLat"].value;
    

    被执行。然而,情况并非如此。那么第一个命令是在一定时间后才完成,还是直到 moveMarker() 完成后才完成?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多