如何在 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 坐标,然后在没有时间延迟的情况下检索它?的主要内容,如果未能解决你的问题,请参考以下文章