我正在尝试为我的网站设置一个MySQL数据库,该数据库将包含各种位置的列表。是否可以为此列表设置基于位置的搜索?例如,如果有人搜索“奥尔巴尼,纽约,美国”,那么如果数据库没有来自奥尔巴尼的结果,则附近的“纽约,纽约”会有结果。
我认为这样做的一个简洁方法是使用纬度和经度坐标。但是,如果用户进入随机城市,是否有办法获取该网站的地理坐标?
此外,如果用户拼写错误的查询,是否还有一种处理信息的简洁方法?
答案 0 :(得分:0)
对于第一个选项,您可以在php中使用查询,如下所示:
$sql = "SELECT DISTINCT * FROM (`yourtable`)
WHERE (`cityname` LIKE '%".$_POST('search')."%')"
此查询将使用您输入的单词搜索到名为“search”的搜索字段
例如:
<input type="search" name="search">
对于问题的第二部分,您可以对searchterm使用更复杂的查询。
所以你匹配前两个字符,例如。
如果您想搜索附近的位置,可以使用google geolocation api计算数据库中两行之间的距离。
https://developers.google.com/maps/documentation/business/geolocation/
答案 1 :(得分:0)
我使用此函数来获取地址的纬度/经度。
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
答案 2 :(得分:0)
由于google api不允许将地理编码用于映射以外的目的,因此您必须在数据库中创建一个包含美国所有城市及其邮政编码的表格。这里有一个很好的免费资源:
http://federalgovernmentzipcodes.us/
至于城市名称的拼写,我会使用jquery根据数据库中的可用城市创建一个自动完成字段。这样,您就可以确保用户始终输入可以查找的项目。