【问题标题】:How to prepare existing database for location aware searching?如何为位置感知搜索准备现有数据库?
【发布时间】:2013-03-10 14:12:44
【问题描述】:

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

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

开发平台

  • 网页:Cakephp、php 和 python
  • 数据库:MySql
  • iOS:objective-c
  • 当前使用的外部库:Google Maps Javascript Api v3

基于位置的搜索

我一直在对这个主题进行一些研究,我将为此雇用Haversine Formula。但是要使 Haversine 公式有效,我需要为我的数据库中的所有记录提供反向地理代码。 我曾经使用过的唯一反向地理编码服务来自 Google,而且我知道他们不允许在未在地图上显示结果的情况下执行此操作。

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

  1. 我是否可以使用其他 API 或服务对所有这些记录进行反向地理编码?
  2. 30000 是一个很大的数字。我显然会在一段时间内为此使用 cron 工作,但由于此请求将来自同一个 IP,这会是一个问题吗?

对此的任何帮助将不胜感激。

更新 1 #

我找到了推荐OpenStreetMap Nominatimthis SO question

【问题讨论】:

    标签: php geolocation reverse-geocoding haversine


    【解决方案1】:

    您可以使用各种地理编码服务,但您很可能需要付费。查看Cloudmate。他们可能会解决你的情况。如果这是一项商业冒险,最好花一点钱并确保您获得良好的数据。

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

    不久前,我构建了一个位置管理界面。它还没有完成,代码也不是最好的,但它可能会给你一个起点。它使用 google 进行地理编码,但可以轻松换成任何其他服务。

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

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

    【讨论】:

      【解决方案2】:
          $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/>";
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 2015-06-08
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        相关资源
        最近更新 更多