Получить координаты GPS Garmin в переменную JavaScript

Я хотел бы удалить маркер и создать новый маркер в openlayers (javascript). Я могу сделать это, но хитрость заключается в том, что я хочу поместить новый маркер в текущее положение широты / долготы, о котором сообщает мой GPS-приемник garmin etrex. Я могу получить новую позицию от получателя, используя gpsbabel, и я могу сделать это в python, используя подпроцесс. Единственный способ представить эти данные в переменную javascript - использовать подстановку строк в CGI-скрипте Python. Проблема в том, что единственный способ получить свежие данные из GPS-приемника - это обновить страницу, из-за чего карта на короткое время исчезает, текущий уровень масштабирования теряется, и это не совсем чистый способ. делать это. Я ищу любые идеи о том, как я могу получить координаты из GPS в переменную javascript.

Будет ли работать Jython для получения координат из сценария Python в Javascript? Я не знаком с этим, но чтение, которое я сделал сегодня, казалось, предполагало, что это потребовало бы работы на порте 8080, что не идеально, так как я хотел бы использовать скрипт Python CGI. Может быть, это все еще возможно.

Я искал API, но предложения Garmin, похоже, привязаны к их веб-сайту, и они довольно излишни, если вы просто хотите текущие координаты.

Я посмотрел на gpsd, но у меня были проблемы с базовым взаимодействием, и в дальнейшем я не смог найти связь с демоном через tcp порт 2947 из javascript.

Я использую Gentoo Linux.

Спасибо Джон

2 ответа

Установите таймер в клиенте (используя функцию javascript setTimeout), чтобы обновлять местоположение маркера каждые 10 секунд или около того. для этого вы должны использовать ajax для получения последнего местоположения с сервера (на котором выполняется код Python или что-то подобное).

Итак, как предположил @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 (для этого примера он должен быть сохранен как ajax3.py в 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)

Я попытался смоделировать координаты сообщения GPS, просто добавив одну тысячную градуса к широте и долготе в сценарии cgi. Затем отправка этого результата обратно на исходную страницу через скрытые типы ввода. Что было интересно, так это то, что мне по сути нужно вызывать moveMarker() с удвоенной частотой, о которой мне нужно сообщать координаты. Это не проблема, но я хотел бы понять, почему это так. С моей наивной точки зрения я понял, что

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

команда будет выполнена и завершена до следующей команды

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

был выполнен. Это, однако, не так. Таким образом, первая команда завершается только через определенное время или не завершается до завершения moveMarker()?

Другие вопросы по тегам