我每 5-7 秒将 gps 信号保存到数据库。当我“汇总”数据库中的所有 lat 和 lng 值时,我如何才能看到到目前为止我已经走了多远。我怎样才能每天看到这些结果?
例如。当我在实时预览中跟踪汽车时,我希望有一段距离作为当天的实时数据。当我在寻找某些卡车的一个月公里数时?
我正在查看THIS链接,但我不知道如何动态填充数据,因为它们已经在数组中有数据。
如果你已经实现了同样的事情,你能给我一些想法和例子吗?
如果已经制造了轮子,为什么还要制造它:)
谢谢
我每 5-7 秒将 gps 信号保存到数据库。当我“汇总”数据库中的所有 lat 和 lng 值时,我如何才能看到到目前为止我已经走了多远。我怎样才能每天看到这些结果?
例如。当我在实时预览中跟踪汽车时,我希望有一段距离作为当天的实时数据。当我在寻找某些卡车的一个月公里数时?
我正在查看THIS链接,但我不知道如何动态填充数据,因为它们已经在数组中有数据。
如果你已经实现了同样的事情,你能给我一些想法和例子吗?
如果已经制造了轮子,为什么还要制造它:)
谢谢
一些三角函数会让你到达那里。
我希望 Lat/Lng 像 2D 表面上的 X/Y 坐标一样简单。不幸的是,由于我们生活在一个称为地球的(非常美妙的)球体上,因此纬度和经度指的是三角形相对于地球中心(纬度)的角度或我们在地球上绘制的假想线(经度)。历史的东西很整洁,但这不是重点。
我使用 Haversine forumla 计算球体上的距离,如果您愿意,可以阅读更多信息。
为简单起见,我将在这里发布代码。我是用 Javascript 编写的,这就是你得到的 :) 给定两个 lat/lng 点 A 和 B,然后:
// units can be english (miles) or metric (km)
var units = "english";
function calculate_distance(a, b) {
var R = (units == "english") ? 3958.7558 : 6371;
var dLat = (a.lat - b.lat) * Math.PI / 180;
var dLon = (a.lng - b.lng) * Math.PI / 180;
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(a.lat * Math.PI / 180) * Math.cos(b.lat * Math.PI / 180) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return R * c;
}
如果你在你的点对之间迭代地应用这个函数并求和距离......宾果游戏。
function get_distance(list_of_points) {
if (list_of_points.length == 0) return 0;
var sum = 0;
var last_point = list_of_points.shift();
while (list_of_points.length > 0) {
var next_point = list_of_points.shift();
sum += calculate_distance(last_point, next_point);
last_point = next_point;
}
return sum;
}
或者,您可以使用 Google Maps API 的几何库来做同样的事情:
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false"></script>
<script type="text/javascript">
function initialize() {
var myLatLng = new google.maps.LatLng(0, -180);
var myOptions = {
zoom: 3,
center: myLatLng,
mapTypeId: google.maps.MapTypeId.TERRAIN
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
var coordinates = [
new google.maps.LatLng(37.772323, -122.214897),
new google.maps.LatLng(21.291982, -157.821856),
new google.maps.LatLng(-18.142599, 178.431),
new google.maps.LatLng(-27.46758, 153.027892)
];
console.log(google.maps.geometry.spherical.computeLength(coordinates));
}
</script>