Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 选择具有最小距离的随机GPS点_Php_Mysql_Google Maps_Gps - Fatal编程技术网

Php 选择具有最小距离的随机GPS点

Php 选择具有最小距离的随机GPS点,php,mysql,google-maps,gps,Php,Mysql,Google Maps,Gps,我想写一个php程序,从数据库中的400个点中随机选择16个gps点 (点表:id-标题-纬度-经度) 纬度37.9824 lon-87.5781547 唯一的要求是16个随机点,每个点距离其他点至少1km(找到1km范围内的点) 这是一个选择药房的系统,每个药房之间的最小距离为1公里。数据库中有400家药店,每周我必须选择16家药店。我不能选择两个非常接近的药房 例如: 如果程序返回3家药店A、B和C 药房之间的差异必须是: A和B=1公里 A和C=1公里 B和C=1公里让我们努力尝试一下,因

我想写一个php程序,从数据库中的400个点中随机选择16个gps点

(点表:id-标题-纬度-经度)

纬度37.9824
lon-87.5781547

唯一的要求是16个随机点,每个点距离其他点至少1km(找到1km范围内的点)

这是一个选择药房的系统,每个药房之间的最小距离为1公里。数据库中有400家药店,每周我必须选择16家药店。我不能选择两个非常接近的药房

例如:

如果程序返回3家药店A、B和C

药房之间的差异必须是:

A和B=1公里

A和C=1公里


B和C=1公里

让我们努力尝试一下,因为您只有400条记录,可能只需要几个小时。。。我没试过,但它可能会给你一个主意

$min =1;
$n =16;

$pharmas = fillUp();

// main function 
function fillUp(){
   $points = array();
   while(count($points)< $n){
      $tmp = getRandomPoint();
      if(checkAll($tmp, $points){
         $points[] = $tmp;
      }
}
return $points;  // after a few hours ??
 }

// get a random point
// after all we might get lucky
function getRandomPoint(){
//...
// return array with ['latitude'] & ['longitude']
}

// check that all points meet the requirements
function checkAll($pt, $points){
    foreach($points as $point){
         if(distance($point, $pt) < $min {
              return false;
          }
    }
    return true;
}

// calculate the distance between 2 points
function distance ($point1, $point2, $uom='km') {
    //  Use Haversine formula to calculate the great circle distance
    //      between two points identified by longitude and latitude
    switch (strtolower($uom)) {
        case 'km' :
            $earthMeanRadius = 6371.009; // km
            break;
        case 'm' :
            $earthMeanRadius = 6371.009 * 1000; // km
            break;
        case 'miles' :
            $earthMeanRadius = 3958.761; // miles
            break;
        case 'yards' :
        case 'yds' :
            $earthMeanRadius = 3958.761 * 1760; // miles
            break;
        case 'feet' :
        case 'ft' :
            $earthMeanRadius = 3958.761 * 1760 * 3; // miles
            break;
        case 'nm' :
            $earthMeanRadius = 3440.069; // miles
            break;
    }
    $deltaLatitude = deg2rad($point2['latitude'] - $point1['latitude']);
    $deltaLongitude = deg2rad($point2['longitude'] - $point1['longitude']);
    $a = sin($deltaLatitude / 2) * sin($deltaLatitude / 2) +
            cos(deg2rad($point1['latitude'])) * cos(deg2rad($point2['latitude'])) *
            sin($deltaLongitude / 2) * sin($deltaLongitude / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $distance = $earthMeanRadius * $c;
    return $distance;
}
$min=1;
$n=16;
$pharmas=fillUp();
//主要功能
函数fillUp(){
$points=array();
while(计数($points)<$n){
$tmp=getRandomPoint();
如果(全选($tmp,$points){
$points[]=$tmp;
}
}
返回$points;//几个小时后??
}
//得到一个随机点
//毕竟我们可能会走运
函数getRandomPoint(){
//...
//返回带有['latitude']和['latitude']的数组
}
//检查所有点是否符合要求
函数checkAll($pt,$points){
foreach($points作为$point){
如果(距离($point,$pt)<$min{
返回false;
}
}
返回true;
}
//计算两点之间的距离
函数距离($point1、$point2、$uom='km')){
//用哈弗公式计算大圆距离
//由经度和纬度确定的两点之间
开关(strtolower($uom)){
案例“km”:
$earthMeanRadius=6371.009;//公里
打破
案例“m”:
$earthMeanRadius=6371.009*1000;//公里
打破
“迈尔斯”一案:
$earthMeanRadius=3958.761;//英里
打破
案例“码”:
案例“yds”:
$earthMeanRadius=3958.761*1760;//英里
打破
“脚”一案:
案例“ft”:
$earthMeanRadius=3958.761*1760*3;//英里
打破
案例“nm”:
$earthMeanRadius=3440.069;//英里
打破
}
$deltaLatitude=deg2rad($point2['latitude']-$point1['latitude']);
$deltalongites=deg2rad($point2['longitude']-$point1['longitude']);
$a=sin($deltaLatitude/2)*sin($deltaLatitude/2)+
cos(deg2rad($point1['纬度])*cos(deg2rad($point2['纬度]))*
sin($deltalongity/2)*sin($deltalongity/2);
$c=2*atan2(sqrt($a),sqrt(1-$a));
$distance=$earthMeanRadius*$c;
返回$distance;
}

这里有一个现成的答案:

我将首先使用笛卡尔距离公式创建一个视图,其中包含尽可能接近您感兴趣的点的对象列表,然后应用PHP代码计算实际的球面距离

@MY_LAT = 37.9824;
@MY_LONG = -87.5781547;

SELECT *, SQRT(
              ABS((latitude - @MY_LAT) * (latitude - @MY_LAT) + 
                  (longitude - @MY_LONG) * (longitude - @MY_LONG))) 
          AS DIST
FROM POINT_TABLE
ORDER BY DIST ASC
从该视图中选择前n行,以获取距离“兴趣点”最近的16个点。要检查这些点是否在参考点1公里范围内,可以在获得结果后编写一个小PHP代码段。这将有助于您处理代码段:


在这里,我在查询中使用了笛卡尔距离公式,其目的只是为了减少在PHP.x中应用球面距离公式得到的记录数。deceze、jeroen、Dagon、Perception、doug在2小时前将其作为非真实问题关闭了。对不起,伙计们,我以为这是一个问题,我忘了这只是一个brea国王新闻