UNPKG

node-red-contrib-gaode

Version:
240 lines (189 loc) 8.35 kB
module.exports = function (RED) { var axios = require('axios'); const gcoord = require('gcoord'); function gaodeNode(config) { RED.nodes.createNode(this, config); // Retrieve the config node this.server = RED.nodes.getNode(config.server); var node = this; if (this.server) { } else { node.error("没有配置正确的gaode server", msg); return } let gaodeKey = this.server.gaodeKey node.on('input', function (msg) { var longitude = config.longitude || msg.payload.longitude var latitude = config.latitude || msg.payload.latitude var zoom = config.zoom || msg.payload.zoom || '14' let locations = `${longitude},${latitude}` if (config.convert) { locations = convert([longitude, latitude], config.srcCrs, config.toCrs) } var payload = {} var image_map = `https://restapi.amap.com/v3/staticmap?location=${locations}&zoom=${zoom}&size=750*500&markers=mid,,A:${locations}&key=${gaodeKey}` axios({ method: 'get', url: `http://restapi.amap.com/v3/geocode/regeo?key=${gaodeKey}&location=${locations}&poitype=&radius=1000&extensions=all&batch=false&roadlevel=0` }).then(function (response) { var data = response.data var status = data['status'] if (status != 1) { throw new Error(JSON.stringify(data)) } payload.status = 1 payload.location = data['regeocode']['formatted_address'] payload.image = image_map msg.payload = payload msg['data'] = data node.send(msg) }).catch(function (error) { payload.status = 0 payload = error.message msg.payload = payload msg['data'] = error node.send(msg) }) }); } RED.nodes.registerType("gaode", gaodeNode); function gaodeConvertNode(config) { RED.nodes.createNode(this, config); var node = this; node.on('input', function (msg) { var longitude = config.longitude || msg.payload.longitude var latitude = config.latitude || msg.payload.latitude let locations = convert([longitude, latitude], config.srcCrs, config.toCrs) let ls = locations.split(',') msg.payload = {} msg.payload.longitude = ls[0] msg.payload.latitude = ls[1] node.send(msg) }); } RED.nodes.registerType("gaode-convert", gaodeConvertNode); function gaodeDirection(config) { RED.nodes.createNode(this, config); // Retrieve the config node this.server = RED.nodes.getNode(config.server); var node = this; this.seqId = 0 if (this.server) { } else { node.error("没有配置正确的gaode server", msg); return } let gaodeKey = this.server.gaodeKey console.log(`key: ${gaodeKey}`) node.on('input', function (msg) { var longitude_source = config.longitude_source || msg.payload.longitude_source var latitude_source = config.latitude_source || msg.payload.latitude_source let locations_s = `${longitude_source},${latitude_source}` var longitude_direction = config.longitude_direction || msg.payload.longitude_direction var latitude_direction = config.latitude_direction || msg.payload.latitude_direction let locations_d = `${longitude_direction},${latitude_direction}` var city = config.city || msg.payload.city var payload = {} if (config.convert) { locations_s = convert([longitude_source, latitude_source], config.srcCrs, config.toCrs) } if (config.convertTo) { locations_d = convert([longitude_direction, latitude_direction], config.srcCrs, config.toCrs) } let locations = [locations_s, locations_d] let version = 'v3' let s3Version = 'v4' if (config.auto) { node.seqId ++ if (node.seqId > 100000000000) node.seqId = 1 if (node.seqId % 2 == 0) { version = 'v5' s3Version = 'v5' } } // console.log('api version: ', version) if (config.api2) { version = 'v5' s3Version = 'v5' } let real_url = getRequestUrl(config, gaodeKey, locations, city, version, s3Version) // node.log(real_url) axios({ method: 'get', url: real_url }).then(function (response) { var data = response.data let status = data['status'] || 1 let errcode = data['errcode'] || 0 if (status != 1 || errcode != 0) { throw new Error(JSON.stringify(data)) } let paths = null if (version === 'v3') { if (config.s2 || config.s1) { paths = data['route']['paths'][0] } else if (config.s3) { paths = data['data']['paths'][0] } else if (config.s4) { paths = {} paths['distance'] = data['route']['distance'] paths['duration'] = data['route']['transits'][0]['duration'] } }else { paths = data['route']['paths'][0] if (config.s3) { paths['cost'] = {} paths['cost']['duration'] = data['route']['paths'][0]['duration'] } } payload.status = 1 payload.distance = paths['distance'] try{ payload.duration = version === 'v5' ? paths['cost']['duration'] : paths['duration'] }catch(err) { console.log(err) } msg.payload = payload msg['data'] = data msg['version'] = version node.send(msg) }).catch(function (error) { console.log(error) payload.status = 0 payload = error.message msg.payload = payload msg['data'] = error node.send(msg) }) }); } function getRequestUrl(config, gaodeKey, locaions, city, version, s3Version) { if (config.s1) { return `https://restapi.amap.com/${version}/direction/driving?origin=${locaions[0]}&destination=${locaions[1]}&key=${gaodeKey}&show_fields=cost` } if (config.s2) { return `https://restapi.amap.com/${version}/direction/walking?origin=${locaions[0]}&destination=${locaions[1]}&key=${gaodeKey}&show_fields=cost` } if (config.s3) { return `https://restapi.amap.com/${s3Version}/direction/bicycling?origin=${locaions[0]}&destination=${locaions[1]}&key=${gaodeKey}&show_fields=cost` } if (config.s4) { return `https://restapi.amap.com/${version}/direction/transit/integrated?origin=${locaions[0]}&destination=${locaions[1]}&key=${gaodeKey}&city=${city}&cityd=${city}` } } function convert(location, srcCrs, toCrs) { let result = gcoord.transform( location, // 经纬度坐标 srcCrs, // 当前坐标系 toCrs // 目标坐标系 ); return result.join(',') } RED.nodes.registerType("gaode-direction", gaodeDirection); function RemoteServerNode(n) { RED.nodes.createNode(this, n); this.name = n.name; this.gaodeKey = n.gaodeKey; } RED.nodes.registerType("gaode-server", RemoteServerNode); }