【问题标题】:Location Search for Database位置搜索数据库
【发布时间】:2013-08-07 13:16:15
【问题描述】:

我正在尝试为我的网站设置一个 MySQL 数据库,该数据库将包含不同位置的列表。是否可以为此列表设置基于位置的搜索?例如,如果有人搜索“Albany, NY, USA”,那么如果数据库没有来自 Albany 的结果,则应该有来自附近“New York, NY”的结果。

我认为一种巧妙的方法是使用纬度和经度坐标。但是,如果用户进入一个随机城市,有没有办法为我的网站获取该城市的地理坐标?

另外,如果用户的查询拼写错误,是否还有一种巧妙的方法来处理信息?

【问题讨论】:

  • 我想你需要结合某种类型的地理位置来实现这一点。
  • 您如何存储有关 nerby 位置的数据?

标签: php mysql search web


【解决方案1】:

对于第一个选项,您可以在 php 中使用如下查询:

$sql = "SELECT DISTINCT * FROM (`yourtable`)
WHERE (`cityname` LIKE '%".$_POST('search')."%')"

此查询将使用您在名为“搜索”的搜索字段中输入的词进行搜索

例如:

<input type="search" name="search">

对于问题的第二部分,您可以对搜索词使用更复杂的查询。

例如,你匹配前两个字符。

如果您想搜索附近的位置,您可以使用 google geolocation api 来计算数据库中两行之间的距离。

https://developers.google.com/maps/documentation/business/geolocation/

【讨论】:

    【解决方案2】:

    我使用这个函数来获取地址的纬度/经度。

    function buildGeocode($address_1, $address_2, $city, $state, $zip_code, $country){
    
        $base_url = "http://maps.googleapis.com/maps/api/geocode/json";
    
        $address = $address_1 . ' ' . $address_2 . ', ' . $city . ' ' . $state . ' ' . $zip_code . ' ' . $country;
    
        $request_url = $base_url . "?address=" . urlencode($address) . "&sensor=false";
    
        $data = json_decode(file_get_contents($request_url), true);
    
        return array('lat' => $data['results'][0]['geometry']['location']['lat'], 'lng' => $data['results'][0]['geometry']['location']['lng']);
    
    }
    

    这个 sql 用于获取 lat/lng 一定距离(英里)内的行(这应该更新为使用 pdo 或正确转义)。

    SELECT SQL_CALC_FOUND_ROWS *
        FROM (SELECT location_tbl.*, ( 3959*(2*ASIN(SQRT(POW(SIN(((location_tbl.lat-" . $lat . ")*(PI()/180))/2),2)+COS(location_tbl.lat*0.017453293)*COS(" . $lat . "*0.017453293)*POW(SIN(((location_tbl.lng-" . $lng . ")*(PI()/180))/2),2)))) ) AS distance
                FROM location_tbl
            WHERE location_tbl.active = 1) AS tmp_tbl
        WHERE distance <= '" . $dis . "'
        ORDER BY distance ASC
    

    【讨论】:

    • 您需要修改它,将函数更改为buildGeocode($city, $state, $country)$address = $city . ' ' . $state . ' ' . $country;,它应该可以工作。这是其请求的 URL maps.googleapis.com/maps/api/geocode/…
    • 谢谢,开始工作了!根据许可协议,如果我要使用 Google API 服务,我想我必须在地图上显示结果...
    【解决方案3】:

    由于 google api 不允许将地理编码用于地图以外的目的,您必须在数据库中创建一个表,其中包含美国所有城市及其邮政编码。这里有一个很棒的免费资源:

    http://federalgovernmentzipcodes.us/

    至于城市名称的拼写,我会使用 jquery 根据数据库中的可用城市创建一个自动完成字段。这样您就可以确保您的用户始终输入可查找的项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      相关资源
      最近更新 更多