получить 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.

Я использую генту линукс.

Спасибо, Джон


person nomadicME    schedule 08.03.2012    source источник


Ответы (2)


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

person sahmad    schedule 09.03.2012
comment
Спасибо за ваш ответ. Вчера вечером я наткнулся на объяснение того, как работает ajax. Ваша поддержка этой идеи является достаточной мотивацией для меня, чтобы изучить ее. Со вчерашнего вечера пытаюсь ознакомиться с тем, как создать плагин. Я думаю, оба метода будут работать. - person nomadicME; 10.03.2012

Итак, как предложил @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>

и вот мой скрипт cgi на python (для этого примера он должен быть сохранен как 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()?

person nomadicME    schedule 13.03.2012