Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将大查询拆分为谷歌地图_Javascript_Php_Mysql_Google Maps Api 3 - Fatal编程技术网

Javascript 将大查询拆分为谷歌地图

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

我有一张有超过百万个位置的桌子

身份证件 住址 经度 纬度 用户可以输入一个地址,然后在谷歌地图上以5公里半径找到最近的位置

我的选择查询:

$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;