/** * @file 微信小程序JSAPI * @author 崔健 cuijian03@baidu.com 2017.01.10 * @update 邓淑芳 623996689@qq.com 2019.07.03 */ /** * 百度地图微信小程序API类 * * @class */ class BMapWX { /** * 百度地图微信小程序API类 * * @constructor */ constructor(param) { this.ak = param["ak"]; } /** * 使用微信接口进行定位 * * @param {string} type 坐标类型 * @param {Function} success 成功执行 * @param {Function} fail 失败执行 * @param {Function} complete 完成后执行 */ getWXLocation(type, success, fail, complete) { type = type || 'gcj02', success = success || function() {}; fail = fail || function() {}; complete = complete || function() {}; // wx.getLocation({ // type: type, // success: success, // fail: fail, // complete: complete // }); wx.getFuzzyLocation({ type: type, success: success, fail: fail, complete: complete }) } /** * POI周边检索 * * @param {Object} param 检索配置 * 参数对象结构可以参考 * http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi */ search(param) { var that = this; param = param || {}; let searchparam = { query: param["query"] || '生活服务$美食&酒店', scope: param["scope"] || 1, filter: param["filter"] || '', coord_type: param["coord_type"] || 2, page_size: param["page_size"] || 10, page_num: param["page_num"] || 0, output: param["output"] || 'json', ak: that.ak, sn: param["sn"] || '', timestamp: param["timestamp"] || '', radius: param["radius"] || 2000, ret_coordtype: 'gcj02ll' }; let otherparam = { iconPath: param["iconPath"], iconTapPath: param["iconTapPath"], width: param["width"], height: param["height"], alpha: param["alpha"] || 1, success: param["success"] || function() {}, fail: param["fail"] || function() {} }; let type = 'gcj02'; let locationsuccess = function(result) { searchparam["location"] = result["latitude"] + ',' + result["longitude"]; wx.request({ url: 'https://api.map.baidu.com/place/v2/search', data: searchparam, header: { "content-type": "application/json" }, method: 'GET', success(data) { let res = data["data"]; if (res["status"] === 0) { let poiArr = res["results"]; // outputRes 包含两个对象, // originalData为百度接口返回的原始数据 // wxMarkerData为小程序规范的marker格式 let outputRes = {}; outputRes["originalData"] = res; outputRes["wxMarkerData"] = []; for (let i = 0; i < poiArr.length; i++) { outputRes["wxMarkerData"][i] = { id: i, latitude: poiArr[i]["location"]["lat"], longitude: poiArr[i]["location"]["lng"], title: poiArr[i]["name"], iconPath: otherparam["iconPath"], iconTapPath: otherparam["iconTapPath"], address: poiArr[i]["address"], telephone: poiArr[i]["telephone"], alpha: otherparam["alpha"], width: otherparam["width"], height: otherparam["height"] } } otherparam.success(outputRes); } else { otherparam.fail({ errMsg: res["message"], statusCode: res["status"] }); } }, fail(data) { otherparam.fail(data); } }); } let locationfail = function(result) { otherparam.fail(result); }; let locationcomplete = function(result) {}; if (!param["location"]) { that.getWXLocation(type, locationsuccess, locationfail, locationcomplete); } else { let longitude = param.location.split(',')[1]; let latitude = param.location.split(',')[0]; let errMsg = 'input location'; let res = { errMsg: errMsg, latitude: latitude, longitude: longitude }; locationsuccess(res); } } /** * sug模糊检索 * * @param {Object} param 检索配置 * 参数对象结构可以参考 * http://lbsyun.baidu.com/index.php?title=webapi/place-suggestion-api */ suggestion(param) { var that = this; param = param || {}; let suggestionparam = { query: param["query"] || '', region: param["region"] || '全国', city_limit: param["city_limit"] || false, output: param["output"] || 'json', ak: that.ak, sn: param["sn"] || '', timestamp: param["timestamp"] || '', ret_coordtype: 'gcj02ll' }; let otherparam = { success: param["success"] || function() {}, fail: param["fail"] || function() {} }; wx.request({ url: 'https://api.map.baidu.com/place/v2/suggestion', data: suggestionparam, header: { "content-type": "application/json" }, method: 'GET', success(data) { let res = data["data"]; if (res["status"] === 0) { otherparam.success(res); } else { otherparam.fail({ errMsg: res["message"], statusCode: res["status"] }); } }, fail(data) { otherparam.fail(data); } }); } /** * rgc检索(逆地理编码:经纬度->地点描述) * * @param {Object} param 检索配置 * 参数对象结构可以参考 * https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad * */ regeocoding(param) { var that = this; param = param || {}; let regeocodingparam = { coordtype: param["coordtype"] || 'gcj02ll', ret_coordtype: 'gcj02ll', radius: param["radius"] || 1000, ak: that.ak, sn: param["sn"] || '', output: param["output"] || 'json', callback: param["callback"] || function() {}, extensions_poi: param["extensions_poi"] || 1, extensions_road: param["extensions_road"] || false, extensions_town: param["extensions_town"] || false, language: param["language"] || 'zh-CN', language_auto: param["language_auto"] || 0 }; let otherparam = { iconPath: param["iconPath"], iconTapPath: param["iconTapPath"], width: param["width"], height: param["height"], alpha: param["alpha"] || 1, success: param["success"] || function() {}, fail: param["fail"] || function() {} }; let type = 'gcj02'; let locationsuccess = function(result) { regeocodingparam["location"] = result["latitude"] + ',' + result["longitude"]; wx.request({ url: 'https://api.map.baidu.com/reverse_geocoding/v3', data: regeocodingparam, header: { "content-type": "application/json" }, method: 'GET', success(data) { let res = data["data"]; if (res["status"] === 0) { let poiObj = res["result"]; // outputRes 包含两个对象: // originalData为百度接口返回的原始数据 // wxMarkerData为小程序规范的marker格式 let outputRes = {}; outputRes["originalData"] = res; outputRes["wxMarkerData"] = []; outputRes["wxMarkerData"][0] = { id: 0, latitude: result["latitude"], longitude: result["longitude"], address: poiObj["formatted_address"], iconPath: otherparam["iconPath"], iconTapPath: otherparam["iconTapPath"], desc: poiObj["sematic_description"], business: poiObj["business"], alpha: otherparam["alpha"], width: otherparam["width"], height: otherparam["height"] } otherparam.success(outputRes); } else { otherparam.fail({ errMsg: res["message"], statusCode: res["status"] }); } }, fail(data) { otherparam.fail(data); } }); }; let locationfail = function(result) { otherparam.fail(result); } let locationcomplete = function(result) {}; if (!param["location"]) { that.getWXLocation(type, locationsuccess, locationfail, locationcomplete); } else { let longitude = param.location.split(',')[1]; let latitude = param.location.split(',')[0]; let errMsg = 'input location'; let res = { errMsg: errMsg, latitude: latitude, longitude: longitude }; locationsuccess(res); } } /** * gc检索(地理编码:地点->经纬度) * * @param {Object} param 检索配置 * 参数对象结构可以参考 * https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding * */ geocoding(param) { var that = this; param = param || {}; let geocodingparam = { address: param["address"] || '', city: param["city"] || '', ret_coordtype: param["coordtype"] || 'gcj02ll', ak: that.ak, sn: param["sn"] || '', output: param["output"] || 'json', callback: param["callback"] || function() {} }; let otherparam = { iconPath: param["iconPath"], iconTapPath: param["iconTapPath"], width: param["width"], height: param["height"], alpha: param["alpha"] || 1, success: param["success"] || function() {}, fail: param["fail"] || function() {} }; if (param["address"]) { wx.request({ url: 'https://api.map.baidu.com/geocoding/v3', data: geocodingparam, header: { "content-type": "application/json" }, method: 'GET', success(data) { let res = data["data"]; if (res["status"] === 0) { let poiObj = res["result"]; // outputRes 包含两个对象: // originalData为百度接口返回的原始数据 // wxMarkerData为小程序规范的marker格式 let outputRes = res; outputRes["originalData"] = res; outputRes["wxMarkerData"] = []; outputRes["wxMarkerData"][0] = { id: 0, latitude: poiObj["location"]["lat"], longitude: poiObj["location"]["lng"], iconPath: otherparam["iconPath"], iconTapPath: otherparam["iconTapPath"], alpha: otherparam["alpha"], width: otherparam["width"], height: otherparam["height"] } otherparam.success(outputRes); } else { otherparam.fail({ errMsg: res["message"], statusCode: res["status"] }); } }, fail(data) { otherparam.fail(data); } }); } else { let errMsg = 'input address!'; let res = { errMsg: errMsg }; otherparam.fail(res); } } /** * 天气检索 * * @param {Object} param 检索配置 */ weather(param) { var that = this; param = param || {}; let weatherparam = { coord_type: param["coord_type"] || 'gcj02', output: param["output"] || 'json', ak: that.ak, sn: param["sn"] || '', timestamp: param["timestamp"] || '' }; let otherparam = { success: param["success"] || function() {}, fail: param["fail"] || function() {} }; let type = 'gcj02'; let locationsuccess = function(result) { weatherparam["location"] = result["longitude"] + ',' + result["latitude"]; wx.request({ url: 'https://api.map.baidu.com/telematics/v3/weather', data: weatherparam, header: { "content-type": "application/json" }, method: 'GET', success(data) { let res = data["data"]; if (res["error"] === 0 && res["status"] === 'success') { let weatherArr = res["results"]; // outputRes 包含两个对象, // originalData为百度接口返回的原始数据 // wxMarkerData为小程序规范的marker格式 let outputRes = {}; outputRes["originalData"] = res; outputRes["currentWeather"] = []; outputRes["currentWeather"][0] = { currentCity: weatherArr[0]["currentCity"], pm25: weatherArr[0]["pm25"], date: weatherArr[0]["weather_data"][0]["date"], temperature: weatherArr[0]["weather_data"][0]["temperature"], weatherDesc: weatherArr[0]["weather_data"][0]["weather"], wind: weatherArr[0]["weather_data"][0]["wind"] }; otherparam.success(outputRes); } else { otherparam.fail({ errMsg: res["message"], statusCode: res["status"] }); } }, fail(data) { otherparam.fail(data); } }); } let locationfail = function(result) { otherparam.fail(result); } let locationcomplete = function(result) {} if (!param["location"]) { that.getWXLocation(type, locationsuccess, locationfail, locationcomplete); } else { let longitude = param.location.split(',')[0]; let latitude = param.location.split(',')[1]; let errMsg = 'input location'; let res = { errMsg: errMsg, latitude: latitude, longitude: longitude }; locationsuccess(res); } } } module.exports.BMapWX = BMapWX;