Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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
Php 分割地理编码任务_Php_Mysql_Split_Geocode - Fatal编程技术网

Php 分割地理编码任务

Php 分割地理编码任务,php,mysql,split,geocode,Php,Mysql,Split,Geocode,我目前正在做一个项目,需要对存储在mySQL数据库中的位置进行地理编码 我编写了一个小脚本,将CSV导入mySQL数据库,并自动将每行的经度和纬度字段填充为“0.000000” 现在,我找到了一个脚本,它可以检查数据库中是否有丢失的地理代码,并对其进行更新。因为我才几岁,刚刚和谷歌合作,所以我把它安装到了我的需要上(应该和Wordpress和提名一起工作,而不是谷歌地图) 导入CSV工作正常,但是当运行此脚本更新大约5200个位置时,我会得到一个超时。不幸的是,我不能增加任何超时设置,所以我需要

我目前正在做一个项目,需要对存储在mySQL数据库中的位置进行地理编码

我编写了一个小脚本,将CSV导入mySQL数据库,并自动将每行的经度和纬度字段填充为“0.000000”

现在,我找到了一个脚本,它可以检查数据库中是否有丢失的地理代码,并对其进行更新。因为我才几岁,刚刚和谷歌合作,所以我把它安装到了我的需要上(应该和Wordpress和提名一起工作,而不是谷歌地图)

导入CSV工作正常,但是当运行此脚本更新大约5200个位置时,我会得到一个超时。不幸的是,我不能增加任何超时设置,所以我需要将任务分成多个步骤

我怎样才能做到这一点

说到PHP,我还是有点生疏,所以任何帮助都将不胜感激。我已经尝试过通过增加一个计数器变量来拆分循环,该变量与需要更新的mySQL行数成平方。它现在应该每100行刷新一次页面,但不幸的是它没有真正工作。它适用于大约500个位置,但在此之后-超时

有人知道解决办法吗

// Opens a connection to a MySQL server
$connection = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$connection) {
die("Not connected : " . mysql_error());
}

// Set the active MySQL database
$db_selected = mysql_select_db(DB_NAME, $connection);
if (!$db_selected) {
die("Can\'t use db : " . mysql_error());
}

// Select all the rows in the markers table
$query = "SELECT * FROM locations WHERE 1";
$result = mysql_query($query);

if (!$result) {
die("Invalid query: " . mysql_error());
}

// Initialize delay in geocode speed
$delay = 0;
function getLnt($address){
    $request_url = "http://nominatim.openstreetmap.org/search?q=".urlencode($address)."&format=json&addressdetails=1";
    $result_string = file_get_contents($request_url);
    $result_json = json_decode($result_string, true);
    return $result_json[0];
}


// Iterate through the rows, geocoding each address


    while ($row = @mysql_fetch_assoc($result)) {

        $geocode_pending = true;

        while ($geocode_pending) {

            $street = $row["address"];
            $zip = $row["zip"];
            $city = $row["city"];
            $id = $row["id"];

            $address = $street.', '.$zip.' '.$city;

            $details = getLnt($address);
            $lat = $details[lat];
            $lng = $details[lon];
            $state = $details[address][state];
            $country_iso = $details[address][country_code];

            if (http_response_code() == 200) {     

                // successful geocode
                $geocode_pending = false;

                $query = sprintf("
                    UPDATE locations SET lat = '%s', lng = '%s', state = '%s', country_iso = '%s' WHERE lat = '0.000000' AND lng = '0.000000' AND id = '%s' LIMIT 1;",
                    mysql_real_escape_string($lat), mysql_real_escape_string($lng), mysql_real_escape_string(utf8_decode($state)),mysql_real_escape_string($country_iso),mysql_real_escape_string($id)
                );

                $update_result = mysql_query($query);

                if (!$update_result) {
                   die("Invalid query: " . mysql_error());
                }

        } else if(http_response_code() == 620) {

                // sent geocodes too fast
                $delay += 100000;

            } else if($details == NULL) {

                // failure to geocode
                $geocode_pending = false;
                echo "Address " . $address . " failed to geocoded. ";
                echo "Received status " . $status . "
                \n";

            }
            usleep($delay);

        }

}

您必须将分页添加到位置查询:

// Select all the rows in the markers table
$offset = intval($_GET['offset'];
$query = "SELECT * FROM locations WHERE 1 LIMIT $offset, 100";
然后在浏览器中重复浏览页面。您可以手动执行,也可以在另一个页面上使用javascript/jquery来查询目标:

var locations_count = 1000000;
var offset = 0;
var func = function(){
    $.get('update-location.php', {offset: offset}, function(){
            document.write('<br/>Processed ' + offset + ' records');
            offset += 100;
            if( offset < locations_count )
                setTimeout(func, 100);
            else
                document.write('<br/>Update finished');
    });
};
func();
var位置\u计数=1000000;
var偏移=0;
var func=函数(){
$.get('update-location.php',{offset:offset},function(){
文件。写入(“
已处理”+偏移量+“记录”); 偏移量+=100; if(偏移量<位置\计数) setTimeout(func,100); 其他的 编写(“
更新完成”); }); }; func();
(不要忘记将
位置\u count
更新为您的实际位置数)

和其他解决方案:


将表转储到本地计算机,然后在本地更新,然后在服务器上更新生成的表。

毫秒似乎有问题<代码>$delay+=100000基本上是指每次发送“太多请求…”
620
响应时延迟1/10秒。这不会是问题,否则我会在剩余的一天被阻止。是否可以完全使用PHP并完全自动执行此操作?正如我所说的-复制到本地机器,进行更新,然后将结果上传回来-这将只是php。将其复制到本地计算机不是一个选项-它必须在服务器上工作。伙计,你看到它根本不像在浏览器中那样工作,你应该同意一些妥协。我为您提供了一个JS前端,它可以消除大量的问题,因为您有时间限制,无法在一次调用中完成。所以你必须把你的工作分成许多电话。在浏览器中,您只能使用javascript执行许多调用。