0

マーカーを削除して、openlayers(javascript)に新しいマーカーを作成したいと思います。私はこれを行うことができますが、トリックは、新しいマーカーを、ガーミンetrexgpsレシーバーによって報告された現在の緯度/経度の位置に配置したいということです。gpsbabelを使用してレシーバーから新しい位置を取得でき、サブプロセスを使用してPythonでこれを実行できます。このデータをjavascript変数に取り込むために私が考えることができる唯一の方法は、PythonCGIスクリプトで文字列置換を使用することです。問題は、GPSレシーバーから最新のデータを取得する唯一の方法は、ページを更新することです。これにより、マップが短時間消え、現在のズームレベルが失われますが、これはあまりクリーンな方法ではありません。これを行うことの。GPSからJavaScript変数に座標を取得する方法についてのアイデアを探しています。

PythonスクリプトからJavaScriptに座標を取得するために、jythonは機能しますか?私はそれに精通していませんが、今日私が読んだことは、これにはポート8080での操作が必要であることを示唆しているようでした。これは、Pythoncgiスクリプトを使用したいので理想的ではありません。多分これはまだ可能です。

私はAPIを探しましたが、garminの製品は彼らのウェブサイトに結びついているようで、現在の座標が必要な場合はかなりやり過ぎです。

gpsdを調べましたが、基本的な通信に問題があり、さらにjavascriptからtcpポート2947を介してデーモンと通信する方法を見つけることができませんでした。

私はgentoolinuxを使用しています。

ありがとう、ジョン

4

2 に答える 2

2

クライアントでタイマーを設定して (setTimeout javascript 関数を使用)、10 秒ごとにマーカーの位置を更新します。このためには、ajax を使用して、サーバー (python コードなどを実行しているサーバー) から最後の場所を取得する必要があります。

于 2012-03-09T21:43:41.243 に答える
0

So, as @sahmad suggested, it looks like AJAX is the way to go. Like I said earlier, I started out trying to solve the problem with a browser plugin. I used firebreath for this. A couple of hard lessons learned along the way. Most important, you either need to crash your plugin and reload the page or restart your browser when you make changes to your plugin. I wasted many hours ignorant to this simple fact. This plugin direction also took longer for me because my C++ skills are in the early stages of development.

The AJAX route was quite simple to learn. I used this page as my starting point: http://www.degraeve.com/reference/simple-ajax-example.php

I thought I would complete my example and report back my solution then this matter would be all finished. However, in the process of creating my example, I came up with another question. Here are files:

I modified the html file like so:

<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>

and here is my python cgi script (for this example it should be saved as ajax3.py in cgi-bin):

#! /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)

I tried to simulate the GPS reporting coordinates by simply adding one-thousandth of a degree to both the latitude & longitude in the cgi script. Then sending this result back to the original page via hidden input types. What was interesting, was that I essentially have to call moveMarker() at twice the frequency that I want coordinates reported back. This isn't a problem, but I would like to understand why this is. From my naive standpoint, I figured that the

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

command would execute and complete before then next command

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

was executed. This is not, however, the case. So does the first command complete only after a certain amount of time or does it not complete until after moveMarker() completes?

于 2012-03-13T05:32:23.947 に答える