如何准备现有数据库进行位置感知搜索?

时间:2013-03-10 14:12:44

标签: php geolocation reverse-geocoding haversine

要求:我目前正在开发一款拥有超过30000条记录的应用。要求是基于位置/感知搜索。例如。距离我现在的位置5mi以内。

如何访问此服务:将从Web和iOS访问此服务 应用程序。

开发平台

  • Web:Cakephp,php和python
  • DB:MySql
  • iOS:objective-c
  • 目前正在使用的外部库:Google Maps Javascript Api v3

基于位置的搜索

我一直在研究这个问题,我将使用Haversine Formula来做这件事。但是对于Haversine公式有效,我需要为我的数据库中的所有记录提供反向地理代码。 我曾经使用的唯一反向地理编码服务来自谷歌,我知道他们不允许这样做而不在地图上显示结果。

  

注意:地理编码API只能与Google地图结合使用;禁止在地图上显示地理编码结果。

  1. 我可以使用其他API或服务来反转所有这些记录的地理代码吗?
  2. 30000是一个很大的数字。我显然会在一段时间内使用cron作业,但由于这个请求来自同一个IP,这可能是一个问题吗?
  3. 对此的任何帮助都将受到高度赞赏。

    更新1#

    我发现this SO question推荐OpenStreetMap Nominatim

2 个答案:

答案 0 :(得分:1)

您可以使用各种地理编码服务,但您很可能需要付费。查看Cloudmate。他们可能会为你的情况而努力。如果这是一个商业投资,花一点钱并确保获得良好的数据可能会更好。

30,000条记录根本不会花那么长时间。如果没有速率限制,应该可以在10-20分钟内完成。我一次一页地对2000条记录进行地理编码(每页100条),花了5分钟。

前段时间我建立了一个位置管理界面。它没有完成,代码不是最好的,但它可能会给你一个起点。它使用谷歌进行地理编码,但可以很容易地换掉任何其他服务。

http://galengrover.com/projects/Store-Locator-Admin/

https://github.com/galen/Store-Locator-Admin

答案 1 :(得分:1)

    $result = mysql_query("SELECT * FROM abc  ORDER BY id DESC ") or die(mysql_error());  

    while($row = mysql_fetch_array( $result )){


      $lat=$row['latitude'];
      $long=$row['longitude'];

    $url  = "http://maps.googleapis.com/maps/api/geocode/json?latlng=".$lat.",".$long."&sensor=false";
      $json = @file_get_contents($url);
      $data = json_decode($json);
      $status = $data->status;
      $address = '';
      if($status == "OK")
      {
         $address = $data->results[0]->formatted_address;
      }
      else
      {
        echo "No Data Found Try Again";
      }

    mysql_query("UPDATE abc SET location='$address' WHERE id=".$row['id']."") or die(mysql_error());



    printf( $address."%d\n", mysql_affected_rows());
    echo "<br/><br/>";
    }