Google Maps API v3 と JavaScript を使用してウェブサイトに地図を追加しようとしています。
私は住所のリストを持っており、それらを地図上にうまくプロットしました。ユーザーが郵便番号を入力すると、マップはその場所を中心に再配置され、その地点に最も近いマーカーが表示されます。ここで、郵便番号に最も近い 3 つまたは 5 つの場所のリスト ビューを作成し、ルート案内のリンクを作成する必要があります。私は立ち往生しています...そして提案をお待ちしています。
Google Maps API v3 と JavaScript を使用してウェブサイトに地図を追加しようとしています。
私は住所のリストを持っており、それらを地図上にうまくプロットしました。ユーザーが郵便番号を入力すると、マップはその場所を中心に再配置され、その地点に最も近いマーカーが表示されます。ここで、郵便番号に最も近い 3 つまたは 5 つの場所のリスト ビューを作成し、ルート案内のリンクを作成する必要があります。私は立ち往生しています...そして提案をお待ちしています。
通常の解決策は、google.maps.geometry.spherical ライブラリのcomputeDistanceBetween(from:LatLng, to:LatLng, radius?:number) メソッドを使用して数を約 10 に減らし、距離行列を使用してそれらまでの走行距離を返すことです。結果を運転距離 (実際の移動距離) で並べ替え、リクエスト制限内で実際の移動距離に最も近い 3 ~ 5 か所に絞り込むことができます。
例 (リストから最も近い 3 つの場所を検索します) (データは FusionTables の「ピザ店」の例から借用)
function codeAddress() {
var address = document.getElementById('address').value;
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
if (customerMarker) customerMarker.setMap(null);
customerMarker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
closest = findClosestN(results[0].geometry.location,10);
// get driving distance
closest = closest.splice(0,3);
calculateDistances(results[0].geometry.location, closest,3);
} else {
alert('Geocode was not successful for the following reason: ' + status);
}
});
}
function findClosestN(pt,numberOfResults) {
var closest = [];
document.getElementById('info').innerHTML += "processing "+gmarkers.length+"<br>";
for (var i=0; i<gmarkers.length;i++) {
gmarkers[i].distance = google.maps.geometry.spherical.computeDistanceBetween(pt,gmarkers[i].getPosition());
document.getElementById('info').innerHTML += "process "+i+":"+gmarkers[i].getPosition().toUrlValue(6)+":"+gmarkers[i].distance.toFixed(2)+"<br>";
gmarkers[i].setMap(null);
closest.push(gmarkers[i]);
}
closest.sort(sortByDist);
return closest;
}
function sortByDist(a,b) {
return (a.distance- b.distance)
}
function calculateDistances(pt,closest,numberOfResults) {
var service = new google.maps.DistanceMatrixService();
var request = {
origins: [pt],
destinations: [],
travelMode: google.maps.TravelMode.DRIVING,
unitSystem: google.maps.UnitSystem.METRIC,
avoidHighways: false,
avoidTolls: false
};
for (var i=0; i<closest.length; i++) request.destinations.push(closest[i].getPosition());
service.getDistanceMatrix(request, function (response, status) {
if (status != google.maps.DistanceMatrixStatus.OK) {
alert('Error was: ' + status);
} else {
var origins = response.originAddresses;
var destinations = response.destinationAddresses;
var outputDiv = document.getElementById('side_bar');
outputDiv.innerHTML = '';
var results = response.rows[0].elements;
for (var i = 0; i < numberOfResults; i++) {
closest[i].setMap(map);
outputDiv.innerHTML += "<a href='javascript:google.maps.event.trigger(closest["+i+"],\"click\");'>"+closest[i].title + '</a><br>' + closest[i].address+"<br>"
+ results[i].distance.text + ' appoximately '
+ results[i].duration.text + '<br><hr>';
}
}
});
}
郵便番号の緯度経度ペアがある場合は、harversine 式を使用して現在地からの距離を見つけることができます。