如何在 mysql 中存储 gps 坐标,然后在没有时间延迟的情况下检索它?

Posted

技术标签:

【中文标题】如何在 mysql 中存储 gps 坐标,然后在没有时间延迟的情况下检索它?【英文标题】:How to store a gps coordinates in mysql, and then retrieve it without time lag? 【发布时间】:2013-12-07 18:38:00 【问题描述】:

我已经完成了一个 phonegap 应用程序,它每 10 秒将 gps 坐标数据汇集到服务器。现在根据 8 小时的跟踪计算,每个用户将存储大约 8*60*6=2880 条记录。我目前的要求仅限于使用 20 个用户。 (基本上它会跟踪用户的路线)

问题分为两部分:

存储数据并尽快检索数据的最佳方式是什么。 是否可以在 google maps API v3 上一次显示 2880 个坐标?如果不是,显示路线的最佳方式是什么?

对于我的一个演示,我获得了 90 分左右的好成绩,但每 8 小时每位用户 2880 条记录让我担心。

谢谢


编辑 1 虽然这是一个老问题,但我最近在做一个项目,我在地图上显示了大约 10K 点,我希望我的观察对未来的访问者有所帮助: 谷歌地图好像现在对您可以在客户端显示的点数没有硬性限制。 您可以在客户端显示的点数完全取决于客户端的“硬件”,使用 jpeg 或 gif 标记的点数越大,渲染越慢,当移动或放大时出去 要在地图上拥有大量指针且性能影响最小,预先计算平移或缩放发生前后需要渲染的点数会有很大帮助。

【问题讨论】:

不会是 8*60*6=2,880,因为它只有每 10 秒而不是每秒?? 您是在地图上显示大量的大头针还是仅显示一条连接大头针的线?您可以尝试平滑线,删除所有其他引脚,如果它们不在视图中,则从地图中删除一些。我会将 GPS 坐标乘以 1E6 后存储,大多数地图 API 都希望它们为 long 而不是 double。 是的,你是对的 :) 我会继续编辑我的愚蠢错误,你对问题的第二部分有什么想法吗? 不,我不想显示 TON 的图钉,我想从所有这些坐标中画一条线...developers.google.com/maps/documentation/javascript/examples/… @HarshWardhan 我的回答有帮助吗? 【参考方案1】:

所以这里有一个可能的解决方案:

首先,您需要了解 Google Maps API 可以处理多少点并且仍然显示该线。我认为这需要一些测试或研究。无论如何,一旦您找到要显示的神奇点数来绘制路径,然后取该数字并将其乘以 2/3

例如,如果一个好的路径需要说90 点然后计算90*2/3

2/3 的原因是以下循环将返回最大点数,平均等于3/2 乘以我们使用的变量。 60 会给我们平均90 的情节。在某些情况下,返回最多的地块是(2 * (magical number of points)) - 1,例如说我们想要平均90 点,那么在极少数情况下我们可以有(2*(90*2/3))-1 = 119 points 您只需要在实施后进行一些测试以确保您的魔法点数适用于具有 2/3 点魔法点数和 2 * 魔法点数 -1 的地图。我希望这不会太令人困惑......我尽力解释了。

剩下的就是 sudo 代码。您必须将其调整为您连接到 mysql 的任何语言:

//get the total number of rows returned
var total_rows = mysql->num_rows;
//calculate max to be 2/3 times your magic number for max plots, i.e. 90
var max_plots = 90*2/3;
//define empty plots array to fill with coordinates
var plots = array();
//check if total_rows is less than max_plots then:
if(total_rows > max_plots)
  //find the quotient of the the divident total_rows and the divisor max_plots rounded down to the nearest whole int
  var quotient = floor(total_rows/max_plots);
  //define variable i to use in loop
  var i = 1;
  //loop through returned rows
  while(row = mysql->fetch_row())
    //return only rows that are the first, last, or are dividable by the quotient evenly; Note: if your language supports it, use the Modulus operator like (i % quotient) == 0 for the last or statement.
    if(i == 1 || 1 == total_rows || (i - (i * (floor(i/quotient)))) == 0)
      //set plots to use on map
      plots[] = array(
        'lat' => row['lat'],
        'lon' => row['lon'],
      );
    
    //increment counting variable
    i++;
  
// else if total_rows less than or equal to max_plots retrieve all plots
 else 
  while(row = mysql->fetch_row())
    plots[] = array(
      'lat' => row['lat'],
      'lon' => row['lon'],
    );
  

这可能不是最好的方法,因为它仍然需要从数据库中检索所有行,但它确实解决了如何仅在 Google 地图上均匀打印选定的最大数量。

注意:确保您的查询通过自动递增键或其他方式对行进行排序,以便绘图按照输入数据库的顺序排列。

最详细的地图将是带有(2 * magic_plot_number) - 1 的地图,而您最不详细的地图将包含magic_plot_number,或者如果更低,则为total_plots 的数量。话虽如此,8 小时的跟踪将使用魔术图号90 在 8 小时内每 7 分 51 秒绘制一个点,总共 61 个点。地块越多,点数越接近2/3 * the magic plot number

我希望这可以帮助您解决这种情况。

【讨论】:

感谢 amaster507 的帮助,发现 google API 现在一次可以处理超过 1500 个点。您的解决方案帮助很大。虽然我还没有在 gmap 上测试过我的 2880 点。但我预计这不会花费太多时间在谷歌地图上绘制。我测试了大约 1000 个点在慢速连接上大约需要 10-20 秒。问候 @HarshWardhan 谢谢,我真的很高兴想到解决这个问题。我喜欢数学,这在逻辑上挑战了我 :) 很高兴我能帮助你。当你完成后,我会对你完成的应用感兴趣。 当然,过几天(一两天)我会有一个工作演示,另外有一个像你这样热爱数学的人会很好,我怎么联系你呢?问候

以上是关于如何在 mysql 中存储 gps 坐标,然后在没有时间延迟的情况下检索它?的主要内容,如果未能解决你的问题,请参考以下文章

在数据库中存储 GPS 坐标的最佳方法

获取 GPS 位置坐标并存储在数组中 [重复]

GPS已知首尾坐标 如何求距离

在 MySQL 中使用 GPS 坐标快速检索 SELECT 语句

iOS Swift将GPS坐标存储到数组中

PHP / MySQL - 从实际 gps 坐标查找半径 500 米内的所有项目