Получить координаты 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()?