Ответ 1
Вы можете попробовать один, который более тонкий, чем то, что предложил Джеймс, но моя точка зрения просто находит путь между A и D, затем найдите точку "p" (которая является avg/n [maxN] * 100) в декодированном пути.
ex: если p равно 73, то найдите путь между декодированием A и D, например, он имеет 235 точек (Math.round((235/100) * 73) = 172). Выберите ширину и долготу позиции 178 на декодированном пути A, D) и повторный процесс.
let arrOfMid = [];
//Distance Matrix Api
function getDistanceMatrix(a, b, c, d, timeStamp, i) {
clientMap.post(config_KEYS.DISTANCE_MATRIX_API + a + "|" + b + "|" + c + "&destinations=" + d.lat + "," + d.lng + "+&key=" + config_KEYS.GOOGLE_API_KEY + "&departure_time=" + timeStamp + "", function (gotDistanceResp, err) {
if (gotDistanceResp.status == "OVER_QUERY_LIMIT" | gotDistanceResp.status == "REQUEST_DENIED") {
res.status(400).json(gotDistanceResp)
}
else {
let n1 = gotDistanceResp.rows[0].elements[0].duration_in_traffic.value
let n2 = gotDistanceResp.rows[1].elements[0].duration_in_traffic.value
let n3 = gotDistanceResp.rows[2].elements[0].duration_in_traffic.value
let maxValue = Math.max(n1, n2, n3)
let minTime = Math.abs(n2 - n1)
let avg = Math.round((n3 + n2 + n1) / 3)
let value = (avg / maxValue) * 100
if (n1 >= n2 && n1 >= n3) {
if (arrOfMid.includes(gotDistanceResp.destination_addresses[0]) == true) {
res.send(gotDistanceResp)
}
else {
arrOfMid.push(d)
i++;
let arrayForTenPerc = getDirectionApi(a, d, timeStamp, value, i)
}
}
else {
if (n2 >= n1 && n2 >= n3) {
if (arrOfMid.includes(gotDistanceResp.destination_addresses[0]) == true) {
res.send(gotDistanceResp)
}
else {
arrOfMid.push(gotDistanceResp.destination_addresses[0])
j++;
let arrayPoints = getDirectionApi(b, d, timeStamp, value, j)
}
}
else {
if (n3 >= n1 && n3 >= n1) {
if (arrOfMid.includes(gotDistanceResp.destination_addresses[0]) === true) {
res.send(gotDistanceResp)
}
else {
arrOfMid.push(gotDistanceResp.destination_addresses[0])
z++;
let arrayPoints = getDirectionApi(c, d, timeStamp, value, z)
}
}
else {
res.send(gotDistanceResp)
}
}
}
}
})
}
//Get Direction Api
function getDirectionApi(a, b, timeStamp, r, i) {
clientMap.post(config_KEYS.DIRECTION_API + a + "&destination=" + b.lat + "," + b.lng + "&key=" + config_KEYS.GOOGLE_API_KEY + "&departure_time=" + timeStamp + "", function (route, error) {
if (route.geocoder_status == "ZERO_RESULTS" | route.status == "INVALID_REQUEST") {
res.status(400).send(route)
}
else {
let polyline = route.routes[0].overview_polyline.points
let decoded = decode(polyline)
let x = Math.round(decoded.length / 100 * r)
let midPointCha = getDistanceMatrix(Location1, Location2, Location3, decoded[x], timeStamp, i)
}
})
}