2015-09-16 1 views
1

У меня есть список кандидатов со своим пригородом, штатом и почтовым индексом в нашей базе данных. По запросу мы найдем ближайший пригород в соответствии с пригородом, который дал нам наш клиент.Искать ближайших кандидатов по данному местоположению

Проблема заключается в том, что текущий алгоритм рассчитывает только расстояние между авиакомпаниями (означает линейное расстояние между двумя точками). В реальной жизни у нас была бы река или гора. Например.

Real Life example of calculate distance

Клиент находится в точке А, В, С в нашей базе данных. Расстояние между авиакомпаниями A и B короче, но в реальной жизни вам нужно пройти через мост, чтобы добраться до B. Таким образом, C является самым коротким кандидатом в этом примере.

Мне интересно, можно ли это сделать с помощью стороннего api (Google Map?). Пожалуйста, имейте в виду, что у нас более 3000 кандидатов в нашей базе данных, поэтому прохождение каждого из них и сравнение с местоположением клиента нецелесообразно.

+0

Может быть, вы можете искать направления между двумя пунктами и получить весь возможный транспорт (метро, ​​автобус, автомобиль, авиакомпания). Google Map может предоставить примерное время, а затем выбрать самое низкое время. –

+0

Спасибо за ваш комментарий, но на данный момент мы заботимся только о расстоянии вождения, так как все они на месте техников с фургонами или ute. –

+0

Для вашего второго вопроса поиск подходящего кандидата во всех кандидатах не будет эффективным. Я бы предложил создать структуру данных, которая хранит соседнее местоположение в данном месте. Или используйте карту google и запрос для заданного диапазона, например (в пределах 50 миль), и проверьте, является ли возвращенное местоположение одним из местоположений в вашей базе данных. –

ответ

0

Это - Google Maps Distance API обеспечивает то, что вы хотите, вождение (или любые другие режимы) расстояние между местоположениями.

Но интересная проблема заключается в том, что есть 3000 точек, которые необходимо сравнить с конкретным пунктом назначения. Возможным решением было бы использовать комбинацию вашего текущего алгоритма и функции множественного происхождения google maps api. ( расстояние API Google Maps позволяет несколько Origins/назначения должны быть указаны.)

Итак:
- использовать текущий алгоритм, чтобы найти ближайший 10 или 30 пригородов от расстояния авиакомпании.
- отправьте все эти местоположения в качестве параметра источника в одном запросе в API карт Google.

Api вернет расстояние между пунктом назначения и всем происхождением. Это может не дать правильного результата в 100% случаев , если ближайший пригород НЕ находится в ближайшем пригороде 10 или 20, который мы рассчитали, используя дистанционное расстояние авиакомпании. Но это должно быть очень маловероятно ....

Примечание:

Пожалуйста, смотрите точные ограничения на использование для Google Maps API. Как для количества запросов в день, так и количества пунктов происхождения, которые вы можете дать. Все его документально зафиксировано

0

API Карт Google предоставляет службу маршрутов, к которой можно получить доступ через объект google.maps.DirectionsService (here is the official documentation).

При отправке запроса в службу маршрутов вы можете указать режим поездки (один из велосипедов, вождение, транзит, прогулка), так что это позаботится о дополнительном расстоянии относительно расстояния от авиакомпании.

Описание: Демо-версия (Jsfiddle). Надеюсь, поможет.

function initMap() { 
 
    var pointA = new google.maps.LatLng(51.2750, 1.0870), 
 
    pointC = new google.maps.LatLng(50.7700, 0.28), 
 
    pointB = new google.maps.LatLng(51.5379, 0.7138), 
 
    airDistAB = google.maps.geometry.spherical.computeDistanceBetween(pointA, pointB), 
 
    airDistAC = google.maps.geometry.spherical.computeDistanceBetween(pointA, pointC), 
 
    myOptions = { 
 
     zoom: 5, 
 
     center: pointA, 
 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
 
    }, 
 
    map = new google.maps.Map(document.getElementById('map-canvas'), myOptions), 
 
    // Instantiate a directions service. 
 
    directionsService = new google.maps.DirectionsService, 
 
    directionsDisplay = new google.maps.DirectionsRenderer({ 
 
     map: map 
 
    }), 
 
    markerA = new google.maps.Marker({ 
 
     position: pointA, 
 
     title: "point A", 
 
     label: "A", 
 
     map: map 
 
    }), 
 
    markerB = new google.maps.Marker({ 
 
     position: pointB, 
 
     title: "point B", 
 
     label: "B", 
 
     map: map 
 
    }), 
 
    markerC = new google.maps.Marker({ 
 
     position: pointC, 
 
     title: "point C", 
 
     label: "C", 
 
     map: map 
 
    }), 
 
    outputAtoB = document.getElementById('a2b'), 
 
    outputAtoC = document.getElementById('a2c'); 
 
    // calculate routes 
 
    responseAB = calculateAndDisplayRoute(directionsService, directionsDisplay, pointA, pointB, outputAtoB, airDistAB, true); 
 
    responseAC = calculateAndDisplayRoute(directionsService, directionsDisplay, pointA, pointC, outputAtoC, airDistAC, false); 
 
    // click on marker B to get route from A to B 
 
    markerB.addListener('click', function() { 
 
    calculateAndDisplayRoute(directionsService, directionsDisplay, pointA, pointB, outputAtoB, airDistAB, true); 
 
    }); 
 
    markerC.addListener('click', function() { 
 
    calculateAndDisplayRoute(directionsService, directionsDisplay, pointA, pointC, outputAtoC, airDistAC, true); 
 
    }); 
 
    document.getElementById('mode').addEventListener('change', function() { 
 
    calculateAndDisplayRoute(directionsService, directionsDisplay, pointA, pointB, outputAtoB, airDistAB, true); 
 
    calculateAndDisplayRoute(directionsService, directionsDisplay, pointA, pointC, outputAtoC, airDistAC, false); 
 
    }); 
 

 
} 
 

 

 

 
function calculateAndDisplayRoute(directionsService, directionsDisplay, point1, point2, outputTxt, airDist, display) { 
 
    var selectedMode = document.getElementById('mode').value; 
 
    directionsService.route({ 
 
    origin: point1, 
 
    destination: point2, 
 
    travelMode: google.maps.TravelMode[selectedMode] 
 
    }, function(response, status) { 
 
    if (status == google.maps.DirectionsStatus.OK) { 
 
     if (display) { 
 
     directionsDisplay.setDirections(response); 
 
     } 
 
     outputTxt.innerHTML = "~" + Math.round(response.routes[0].legs[0].distance.value/1000) + " Km" + " (air: ~" + Math.round(airDist/1000) + "Km)"; 
 
     return response; 
 
    } else { 
 
     window.alert('Directions request failed due to ' + status); 
 
    } 
 
    }); 
 
} 
 

 
initMap();
html, 
 
     body { 
 
     height: 100%; 
 
     margin: 0; 
 
     padding: 0; 
 
     } 
 
     #map-canvas { 
 
     height: 100%; 
 
     width: 60%; 
 
     float: left; 
 
     } 
 
     #floating-panel { 
 
     position: float top; 
 
     top: 10px; 
 
     left: 25%; 
 
     z-index: 5; 
 
     background-color: #678; 
 
     padding: 5px; 
 
     border: 1px solid #123; 
 
     text-align: center; 
 
     font-family: 'Roboto', 'sans-serif'; 
 
     line-height: 30px; 
 
     padding-left: 10px; 
 
     } 
 
     #output { 
 
     padding: 6px; 
 
     width: 38%; 
 
     float: right; 
 
     }
<script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=false&v=3&libraries=geometry"></script> 
 

 
<div id="floating-panel"> <b>Mode of Travel: </b> 
 

 
    <select id="mode"> 
 
    <option value="DRIVING">Driving</option> 
 
    <option value="WALKING">Walking</option> 
 
    <option value="BICYCLING">Bicycling</option> 
 
    <option value="TRANSIT">Transit</option> 
 
    </select> 
 
</div> 
 
<div id="map-canvas"></div> 
 
<div id="out<put"> 
 
    <h3>Distances</h3> 
 
    <b> A to B: </b><span id="a2b"></span> 
 
    <p> <b> A to C: </b><span id="a2c"></span> 
 

 
</div>

Смежные вопросы