2015-03-03 90 views
0

我有一个MySQL数据库,它包含我的客户名称以及他们业务的相应经度/纬度。我有一些代码是从互联网派生出来的,并且调整为在一个邮政编码的半径范围内进行搜索以找到它们,但它不在附近的某些地方。有谁知道API会搜索半径并只返回我的数据库中的POI?我可以想出10个这样做不起作用的原因,但我认为它不会受到伤害。提前致谢!寻找我的兴趣点在半径内?

- EDIT-- 这是我的工作代码。我的数据库具有lat/lng的正确数据。这就像乌鸦苍蝇一样,所以我正在寻找一些更具体的东西。思考?再次感谢!

session_start(); 
$MyID = $_SESSION['UserID']; 
$MyZip = $_SESSION['HomeZip']; 

function getCityData(){ 
    $MyZip = $GLOBALS['MyZip']; 
    $db = $GLOBALS['db']; 
    $Qry = $db->query("SELECT * FROM 02_driver_geodata WHERE zip = $MyZip"); 
    $Res = $Qry->fetch(PDO::FETCH_ASSOC); 
    $MyLat = $Res['Lat']; 
    $MyLng = $Res['Lng']; 
    return array('Lat' => $MyLat, 'Lng' => $MyLng); 
} 

function getRestData($SearchRadius = 25, $CreateDate = 'ALL'){ 
    $db = $GLOBALS['db']; 

    //$R = 6371; // earth's mean radius, km 
    $R = 3959; //earth's mean radius, miles 

    $Specs = getCityData(); 

    $lat = $Specs['Lat']; 
    $lon = $Specs['Lng']; 
    $rad = $SearchRadius; 

    // first-cut bounding box (in degrees) 
    $maxLat = $lat + rad2deg($rad/$R); 
    $minLat = $lat - rad2deg($rad/$R); 
    // compensate for degrees longitude getting smaller with increasing latitude 
    $maxLon = $lon + rad2deg($rad/$R/cos(deg2rad($lat))); 
    $minLon = $lon - rad2deg($rad/$R/cos(deg2rad($lat))); 

    $sql = "Select *, (acos(sin(:lat)*sin(radians(Lat)) + cos(:lat)*cos(radians(Lat))*cos(radians(Lng)-:lon)) * :R) As D 
      From 04_rest_00_locations 
      Where (acos(sin(:lat)*sin(radians(Lat)) + cos(:lat)*cos(radians(Lat))*cos(radians(Lng)-:lon)) * :R) < :rad 
      AND Lat Between :minLat And :maxLat 
      AND Lng Between :minLon And :maxLon 
      AND CreateDate > 01/01/2015 AND CreateDate <= NOW() 
      Order by D"; 
    $params = array(
     'lat' => deg2rad($lat), 
     'lon' => deg2rad($lon), 
     'minLat' => $minLat, 
     'minLon' => $minLon, 
     'maxLat' => $maxLat, 
     'maxLon' => $maxLon, 
     'rad' => $rad, 
     'R'  => $R, 
    ); 
    $points = $db->prepare($sql); 
    $points->execute($params); 
    $Return['Data'] = $points->fetchAll(PDO::FETCH_ASSOC); 
    $Return['Count'] = $points->rowCount(); 
    return $Return; 
} 
+1

您需要将每个邮政编码与(纬度,经度)对关联。完成之后,您可以尝试使用Haversine公式来查找每个邮政编码和每个业务之间的距离。请在此阅读有关Haversine公式的更多信息:http://en.wikipedia.org/wiki/Haversine_formula – 2015-03-03 03:45:01

+0

谢谢。我已经这样做了。它实际上工作,我有lats/lngs,但它是像乌鸦飞,而不是确切的里程。这就是为什么我暂时在寻找一个API。谢谢! – b3tac0d3 2015-03-03 04:31:18

回答

1

我做了类似的事情。以下是我如何做到的:

1)为了帮助快速搜索数据库,我制作了一个列,它的纬度四舍五入到最接近的0.0025,经度四舍五入到相同的数量。我们称之为“平铺钥匙”。对于(40.274415,-111.711326),平铺键是“40.275,-111.7125”。

2)然后,要找到位置附近的地方,我会计算附近的“瓷砖键”。因此,如果我在附近搜索(40.274415,-111.711326),我会在所有“y,x”集合中搜索“tile键”,其中y是40.275 +/- 0.0025,x是-111.7125 +/- 0.0025。

3)然后我查询所有行WHERE tilekey IN(设置我在步骤2中计算)。这会找到所有可能位于目标范围内的附近地点。

4)一旦我收集到所有可能足够接近的行,我将使用Haversine公式来测量距离我的位置的距离,并丢弃那些不是我的位置的距离。我使用Python代码而不是SQL语句来完成这一步。但是,您可能只需在WHERE子句中添加AND子句就可以使用SQL执行此操作。