node-red-contrib-gaode
Version:
node red node for gaode
240 lines (189 loc) • 8.35 kB
JavaScript
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);
}