Javascript 将大查询拆分为谷歌地图
我有一张有超过百万个位置的桌子 身份证件 住址 经度 纬度 用户可以输入一个地址,然后在谷歌地图上以5公里半径找到最近的位置 我的选择查询:Javascript 将大查询拆分为谷歌地图,javascript,php,mysql,google-maps-api-3,Javascript,Php,Mysql,Google Maps Api 3,我有一张有超过百万个位置的桌子 身份证件 住址 经度 纬度 用户可以输入一个地址,然后在谷歌地图上以5公里半径找到最近的位置 我的选择查询: $result = mysql_query("SELECT *, ( 6371 * acos( cos( radians(".$lat1.") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(".$lng1.") ) + sin( radians(".$lat1.") ) * sin( r
$result = mysql_query("SELECT *, ( 6371 * acos( cos( radians(".$lat1.") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(".$lng1.") ) + sin( radians(".$lat1.") ) * sin( radians( lat ) ) ) ) AS distance FROM star HAVING distance < ".$rad." ORDER BY distance");
我的问题是当它超过10个位置时,它不会显示谷歌地图。。我不想使用限制0,10,我想显示所有结果
如何将查询拆分,以便每次从大表中搜索10%
在页面加载后将标记放在运行时。关于在页面加载后将标记放在运行时的事情
一种简单的方法是通过http端点和使用AJAX的查询公开搜索功能,而不是用结果重新加载页面
# search.php
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$locations = search_for_close_locations($lat, $lng);
echo json_encode($locations);
谢谢你的澄清。这是我经过编辑的答案 问题似乎在于,您需要一种高效的方法将查询结果分解为更小的部分,而不必重新查询数据库。在您提供的示例中,基于位置的查询将生成一个包含10000个结果的列表,您希望将这些结果进一步细分为10个块,每个块1000个,而无需返回数据库。我认为这是因为返回10000个结果的原始查询开始时很慢,一次查询1000个结果也同样慢 对于这个问题有几种可能的解决方案,您选择哪种解决方案取决于数据在应用程序中的使用方式。此查询是应用程序的单个用户所独有的,还是数十个、数百个或数千个用户所使用的不同版本的查询 如果应用程序的所有用户都使用相同的查询,那么我将使用cron作业将整个查询的结果选择到一个准临时表中。此表仅用于存储缓存数据。当您一次翻阅1000个结果时,您将查询缓存的表。这会快得多,因为所有的距离都是预先计算的,你不必再次运行哈弗森公式 如果应用程序的所有用户都在使用同一查询的多个变体,则还可以将整个查询结果作为序列化数组存储在用户会话中。然后,每次需要遍历结果时,每次读取1000个,从会话中存储的有序数组中读取,并生成相应的结果 如果您在整个应用程序中面临数千种或数百万种不同的查询,那么提高查询速度的最佳方法是重新考虑数据的存储方式/位置和/或访问方式。我知道这项方案在短期内可能不可行,但有时需要作出这样的改变,才能在效率上产生巨大的变化。我希望这能有所帮助 我失败的尝试1: 尝试从大表中每次选择1000条记录,然后使用JS计算每条记录是否在5km半径内,如果在5km半径内,则在地图上显示。。发生的是源代码是由很多JS开发的 这在google地图初始化功能中:
$q = "select MAX(id) from table";
$res1 = mysql_query($q);
$data1 = mysql_fetch_array($res1);
$max = $data1[0];
$start = 1;
$end = 1000;
while($end < $max) {
$result = mysql_query("SELECT * FROM table WHERE id > ".$start." AND id < ".$end);
while ($row = mysql_fetch_array($result)) {
?>
if(getDistanceFromLatLonInKm(<?php echo $lat1." , ".$lng1." , ".$row{'lat'}." , ".$row{'lng'} ?>) < 5) {
addMarker(<?php echo $row{'lat'}.",".$row{'lng'}; ?>);
}
<?php
}
$start = $start + 1000;
$end = $end + 1000;
你有错误吗?当您尝试检索超过10个位置时,您的JS控制台会说什么?没有错误,JS代码在页面的源代码中,但没有显示地图。您可以显示或链接到这种简单方式的示例吗?正如您在我的问题示例中看到的,我的select SQL语句得到了结果,它检查大表中的每个id,查看位置是否在给定地址的5公里半径内,我想使其更具可伸缩性,如何编辑代码,每次搜索表的10%,当页面打开时,显示10%的结果,然后在运行时搜索10%,类似于:id为1到10000的表,页面加载>在谷歌地图上显示id 1到1000的最近位置,然后在运行时将id:1001到id:2000Hi Jim的结果添加到地图中。我编辑了我的原始答案。我希望这会更有帮助。首先谢谢杰伊·谢斯!我在一个表中有一个随机位置,所以无法更改,我只是认为每次查询1000并用jQuery检查它会比用MySql检查所有10000更快,在页面加载后仍然不知道如何做。。现在就开始阅读并尝试跟随这个图坦卡蒙:
# your_page.js
// attache event handler to the lat/lng input
$('#lat_lng_input_form').submit(function() {
$.getJSON('/search.php', function(response) {
// clear all previous markers
// place new markers
});
});
$q = "select MAX(id) from table";
$res1 = mysql_query($q);
$data1 = mysql_fetch_array($res1);
$max = $data1[0];
$start = 1;
$end = 1000;
while($end < $max) {
$result = mysql_query("SELECT * FROM table WHERE id > ".$start." AND id < ".$end);
while ($row = mysql_fetch_array($result)) {
?>
if(getDistanceFromLatLonInKm(<?php echo $lat1." , ".$lng1." , ".$row{'lat'}." , ".$row{'lng'} ?>) < 5) {
addMarker(<?php echo $row{'lat'}.",".$row{'lng'}; ?>);
}
<?php
}
$start = $start + 1000;
$end = $end + 1000;