我想为我的网站建立一个MySQL数据库,它将包含各种位置的列表。是否可以为此列表设置基于位置的搜索?例如,如果有人搜索“美国纽约州奥尔巴尼”,那么如果数据库没有奥尔巴尼的结果,则应该从附近的“纽约州纽约市”得到结果。位置搜索数据库
我认为一个简单的方法是使用经度和纬度坐标。但是,如果用户进入随机城市,是否有办法为我的网站获取该城市的地理坐标?
此外,如果用户拼错了他们的查询,是否有一个干净的方式来处理信息?
我想为我的网站建立一个MySQL数据库,它将包含各种位置的列表。是否可以为此列表设置基于位置的搜索?例如,如果有人搜索“美国纽约州奥尔巴尼”,那么如果数据库没有奥尔巴尼的结果,则应该从附近的“纽约州纽约市”得到结果。位置搜索数据库
我认为一个简单的方法是使用经度和纬度坐标。但是,如果用户进入随机城市,是否有办法为我的网站获取该城市的地理坐标?
此外,如果用户拼错了他们的查询,是否有一个干净的方式来处理信息?
对于第一种选择,你可以在你的PHP使用查询类似如下:
$sql = "SELECT DISTINCT * FROM (`yourtable`)
WHERE (`cityname` LIKE '%".$_POST('search')."%')"
该查询将与词搜索你键入到名为searchfield“搜索”
所以对于例如:
<input type="search" name="search">
对于问题的第二部分,您可以对searchterm使用更复杂的查询。
所以你匹配前两个字符为例。
如果你想搜索附近的位置,你可以使用谷歌地理定位API来计算数据库中两行之间的距离。
https://developers.google.com/maps/documentation/business/geolocation/
我用这个函数来获取纬度/经度的地址。
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得到与纬度/经度的一定距离(英里)行(这应该更新为使用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。 ''。 $状态。 ''。 $ country;'它应该可以工作。这是其请求的URL http://maps.googleapis.com/maps/api/geocode/json?address=New+York+NY+USA&sensor=false – cmorrissey
谢谢,它得到它的工作!根据许可协议,如果我打算使用Google API服务,我想我必须在地图上显示结果... – user2660845
因为谷歌的API不使用地理编码比映射时,将在所有的城市中你的数据库中创建一个表中的其他用途允许诠释,他的美国和他们的邮政编码。有可用的一个伟大的免费资源在这里:
http://federalgovernmentzipcodes.us/
对于城市名称的拼写,我可以使用jQuery基于数据库中可用城市创建自动完整场。这样你就可以确定你的用户总是输入一个可以查看的项目。
我想你将需要纳入一些类型的地理定位来实现这一点。 – Malkus
您如何存储有关nerby位置的数据? – jaczes