100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > php 附近商家 微信公众平台消息接口开发地理位置查询附近商家实例

php 附近商家 微信公众平台消息接口开发地理位置查询附近商家实例

时间:2019-04-07 20:32:49

相关推荐

php 附近商家 微信公众平台消息接口开发地理位置查询附近商家实例

一、获取用户地址位置消息

用户发送位置时的消息及格式如下

后台格式:

1359036619

22.539968

113.954980

16

5837017832671832047

XML格式讲解

ToUserName 消息接收方微信号,一般为公众平台账号微信号

FromUserName 消息发送方微信号

CreateTime 消息创建时间

MsgType 消息类型,地理位置为location

Location_X 地理位置纬度

Location_Y 地理位置经度

Scale 地图缩放大小

Label 地理位置信息

MsgId 消息ID号

二、获取周边区域信息

百度地图Place API 是一类简单的HTTP接口,用于返回查询某个区域的某类POI数据,且提供单个POI的详情查询服务,用户可以使用C#、C++、Java等开发语言发送HTTP请求且接收json、xml的数据。

Place API 提供区域检索POI服务、POI详情服务与团购信息检索服务、商家团购详情查询。区域检索POI服务提供三种区域检索方法:城市内检索、矩形检索、圆形区域检索。

我们使用圆形区域检索来实现附近搜索功能。

place区域检索POI服务接口如下:

http://api./place/v2/search参数是否必须默认值格式举例含义

location是无38.76623,116.43213

lat,lng周边检索中心点,不支持多个点

radius(r)否无2000周边检索半径,单位为米

q(query)是无中关村、ATM、百度大厦检索关键字,周边检索和矩形区域内检索支持多个关键字并集检索,不同关键字间以$符号分隔,最多支持10个关键字检索。如:”银行$酒店”。

tag否无日式烧烤/铁板烧、朝外大街标签项,与q组合进行检索

output否xmljson或xml输出格式为json或者xml

scope是11、2检索结果详细程度。取值为1 或空,则返回基本信息;取值为2,返回检索POI详细信息

filter否无filter=industry_type:cater

|sort_name:price

|sort_rule:0

|price_section:100,200

|groupon:0

|discount:0检索过滤条件,当scope取值为2时,可以设置filter进行排序。

industry_type:行业类型

sort_name:排序字段

sort_rule:排序规则,取值如下:0:从高到低,1:从低到高;

price_section:价格区间;

groupon:是否有团购,1为有团购,0为无团购;

discount:是否打折,1为有打折,0为无打折;

page_size否1010范围记录数量,默认为10条记录,最大返回20条。多关键字检索时,返回的记录数为关键字个数*page_size。

page_num否00、1、2分页页码,默认为0,0代表第一页,1代表第二页,以此类推。

ak是无E4805d16520de693a3fe707cdc962045用户的访问密钥,必填项。v2之前该属性为key。

sn否无用户的权限签名。

timestamp否无设置sn后该值必填。

调用举例如下:

http://api./place/v2/search?ak=MgBALVVeCd8THVBi6gPdvsvG&output=json&query=%E9%93%B6%E8%A1%8C&page_size=5&page_num=0&scope=2&location=39.915,116.404&radius=2000&filter=sort_name:distance

三、程序实现

百度地图类定义如下class baiduMapClient

{

private $api_server_url;

private $auth_params;

public function __construct()

{

$this->api_server_url = "http://api./";

$this->auth_params = array();

$this->auth_params['key'] = "401f9a693dd267dd9a4661ec0895fb20";

$this->auth_params['output'] = "json";

}

public function Geocoding_coordinate_address($location)

{

return $this->call("geocoder", array("location" => $location));

}

//http://api./place/search?&query=眼镜&location=39.915,116.404&radius=3000&output=json&key=37492c0ee6f924cb5e934fa08c6b1676

public function Place_search($query, $location, $radius)

{

return $this->call("place/search", array("query" => $query, "location" => $location, "radius" => $radius));

}

protected function call($method, $params = array())

{

$headers = array(

"User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/0101 Firefox/14.0.1",

"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",

"Accept-Language: en-us,en;q=0.5",

//"Accept-Encoding: gzip, deflate",

"Referer: /"

);

$params = array_merge($this->auth_params, $params);

$url = $this->api_server_url . "$method?".http_build_query($params);

if (DEBUG_MODE){echo "REQUEST: $url" . "\n";}

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$data = curl_exec($ch);

curl_close($ch);

$result = null;

if (!empty($data)){

if (DEBUG_MODE){

echo "RETURN: " . $data . "\n";

}

$result = json_decode($data);

}

else{

echo "cURL Error:". curl_error($ch);

}

return $result;

}

}

获取附近的调用代码如下:function catchEntitiesFromLocation($entity, $x, $y, $radius)

{

$mapObj = new baiduMapClient();

$search = $mapObj->Place_search($entity, $x.",".$y, $radius);

$results = $search->results;

for ($i = 0; $i < count($results); $i++) {

$distance = getDistance($x, $y, $results[$i]->location->lat, $results[$i]->location->lng);

$shopSortArrays[$distance] = array(

"Title"=>"【".$results[$i]->name."】".$results[$i]->address.(isset($results[$i]->telephone)?" ".$results[$i]->telephone:""),

"Description"=>"",

"PicUrl"=>"",

"Url"=>"");

}

ksort($shopSortArrays);//排序

$shopArray = array();

foreach ($shopSortArrays as $key => $value) {

$shopArray[] = array(

"title" => $value["Title"],

"description" => $value["Description"],

"pic" => $value["PicUrl"],

"url" => $value["Url"],

);

if (count($shopArray) > 6){break;}

}

return $shopArray;

}

计算两坐标之间距离如下function getDistance($lat_a, $lng_a, $lat_b, $lng_b) {

//R是地球半径(米)

$R = 6366000;

$pk = doubleval(180 / 3.14169);

$a1 = doubleval($lat_a / $pk);

$a2 = doubleval($lng_a / $pk);

$b1 = doubleval($lat_b / $pk);

$b2 = doubleval($lng_b / $pk);

$t1 = doubleval(cos($a1) * cos($a2) * cos($b1) * cos($b2));

$t2 = doubleval(cos($a1) * sin($a2) * cos($b1) * sin($b2));

$t3 = doubleval(sin($a1) * sin($b1));

$tt = doubleval(acos($t1 + $t2 + $t3));

return round($R * $tt);

}

对于用户的坐标记录,我们使用数据库的方式来存储,

如果用户发送查询命令,则直接查询,function searchUserLocation($userWxid)

{

Global $mysql_host;

Global $mysql_host_s;

Global $mysql_port;

Global $mysql_user;

Global $mysql_password;

Global $mysql_database;

//查询使用从库,支持SAE

$mysql_table = "location";

$mysql_state = "SELECT * FROM ".$mysql_table." WHERE userWxid = \"".$userWxid."\"";

$con = mysql_connect($mysql_host.':'.$mysql_port, $mysql_user, $mysql_password);

if (!$con){

die('Could not connect: ' . mysql_error());

}

mysql_query("SET NAMES 'UTF8'");

mysql_select_db($mysql_database, $con);

$result = mysql_query($mysql_state);

$location = array();

while($row = mysql_fetch_array($result))

{

$location["x"] = $row["locationX"];

$location["y"] = $row["locationY"];

}

mysql_close($con);

if (isset($location["x"]) && $location["x"] != 0.0){

return $location;

}else{

return "系统中没有你的地理位置信息,请先发送位置给我!您不用担心你的行踪被泄漏,因为你可以滑动地图,把别处的地址发送过来。";

}

}

如果用户发了位置,则进行更新function updateOrInsert($weixinid, $locationX, $locationY)

{

if (isset($_SERVER['HTTP_APPNAME'])){

$mysql_host = SAE_MYSQL_HOST_M;

$mysql_host_s = SAE_MYSQL_HOST_S; //sae的从库

$mysql_port = SAE_MYSQL_PORT;

$mysql_user = SAE_MYSQL_USER;

$mysql_password = SAE_MYSQL_PASS;

$mysql_database = SAE_MYSQL_DB;

}else{

$mysql_host = "127.0.0.1";

$mysql_host_s = "127.0.0.1";

$mysql_port = "3306";

$mysql_user = "root";

$mysql_password = "root";

$mysql_database = "sae";

}

$mysql_table = "location";

//INSERT INTO location VALUES("23s2s", 1122.2, 366.2) ON DUPLICATE KEY UPDATE locationX = 1122.2, locationY = 366.2;

$mysql_state = "INSERT INTO ".$mysql_table." VALUES(\"".$weixinid."\", ".$locationX.", ".$locationY.") ON DUPLICATE KEY UPDATE locationX = ".$locationX.", locationY = ".$locationY.";";

var_dump($mysql_state);

//

$con = mysql_connect($mysql_host.':'.$mysql_port, $mysql_user, $mysql_password);

if (!$con){

die('Could not connect: ' . mysql_error());

}

mysql_query("SET NAMES 'UTF8'");

mysql_select_db($mysql_database, $con);

$result = mysql_query($mysql_state);

if ($result == true){

//return "你提交的位置为纬度:".$locationX.",经度:".$locationY."。\n现在可以发送“附近”加关键字的命令查询附近的目标,如“附近酒店”,“附近医院”。";

return "已经成功获取你的位置。您不用担心你的行踪被泄漏,因为你可以把千里之外的地址提交过来。\n现在可以发送“附近”加关键字的命令查询附近的目标,如“附近酒店”,“附近医院”。";

}else{

return "提交失败,请重试。如果一直出现这样的错误,请给我们留言。";

}

}

对于用户发送的内容,先提取坐标,然后进行组合查询

实现效果如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。