Khi tôi nhấp vào bản đồ, cách tốt nhất để tìm điểm đánh dấu hoặc điểm đánh dấu gần nhất? có một số chức năng trong api sẽ giúp tôi làm điều đó?
đó là google map api v3.
Khi tôi nhấp vào bản đồ, cách tốt nhất để tìm điểm đánh dấu hoặc điểm đánh dấu gần nhất? có một số chức năng trong api sẽ giúp tôi làm điều đó?
đó là google map api v3.
Câu trả lời:
Đầu tiên bạn phải thêm eventlistener
google.maps.event.addListener(map, 'click', find_closest_marker);
Sau đó, tạo một hàm lặp qua mảng đánh dấu và sử dụng công thức hasrsine để tính toán khoảng cách của mỗi điểm đánh dấu từ lần nhấp chuột.
function rad(x) {return x*Math.PI/180;}
function find_closest_marker( event ) {
var lat = event.latLng.lat();
var lng = event.latLng.lng();
var R = 6371; // radius of earth in km
var distances = [];
var closest = -1;
for( i=0;i<map.markers.length; i++ ) {
var mlat = map.markers[i].position.lat();
var mlng = map.markers[i].position.lng();
var dLat = rad(mlat - lat);
var dLong = rad(mlng - lng);
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
distances[i] = d;
if ( closest == -1 || d < distances[closest] ) {
closest = i;
}
}
alert(map.markers[closest].title);
}
Điều này theo dõi các điểm đánh dấu gần nhất và cảnh báo tiêu đề của nó.
Tôi có các điểm đánh dấu của mình dưới dạng một mảng trên đối tượng bản đồ của tôi
Bạn có thể sử dụng phương thức computeDistanceBetween () trong không gian tên google.maps.geometry.spherical .
Tôi muốn mở rộng đề xuất của Leor cho bất kỳ ai còn bối rối về cách tính toán vị trí gần nhất và thực sự cung cấp một giải pháp hiệu quả:
Tôi đang sử dụng các điểm đánh dấu trong một markers
mảng, ví dụ var markers = [];
.
Sau đó, chúng ta hãy xác định vị trí của mình như là var location = new google.maps.LatLng(51.99, -0.74);
Sau đó, chúng tôi chỉ cần giảm các điểm đánh dấu của chúng tôi so với vị trí chúng tôi có như vậy:
markers.reduce(function (prev, curr) {
var cpos = google.maps.geometry.spherical.computeDistanceBetween(location.position, curr.position);
var ppos = google.maps.geometry.spherical.computeDistanceBetween(location.position, prev.position);
return cpos < ppos ? curr : prev;
}).position
Những gì bật ra là LatLng
đối tượng đánh dấu gần nhất của bạn .
Công thức trên không phù hợp với tôi, nhưng tôi đã sử dụng công thức này mà không gặp bất kỳ vấn đề gì. Chuyển vị trí hiện tại của bạn đến hàm và lặp qua một loạt các điểm đánh dấu để tìm vị trí gần nhất:
function find_closest_marker( lat1, lon1 ) {
var pi = Math.PI;
var R = 6371; //equatorial radius
var distances = [];
var closest = -1;
for( i=0;i<markers.length; i++ ) {
var lat2 = markers[i].position.lat();
var lon2 = markers[i].position.lng();
var chLat = lat2-lat1;
var chLon = lon2-lon1;
var dLat = chLat*(pi/180);
var dLon = chLon*(pi/180);
var rLat1 = lat1*(pi/180);
var rLat2 = lat2*(pi/180);
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(rLat1) * Math.cos(rLat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
distances[i] = d;
if ( closest == -1 || d < distances[closest] ) {
closest = i;
}
}
// (debug) The closest marker is:
console.log(markers[closest]);
}
markers
mảng? Đó là bằng cách tạo một điểm đánh dấu bằng cách sử dụng var marker1 = new google.maps.Marker({ ... })
?
map.markers = map.markers || [];
sau đó cho mỗi điểm đánh dấumap.markers.push(marker);
Bạn có biết về phần mở rộng Mysql Spatial không ?
Bạn có thể sử dụng một cái gì đó như MBRContains (g1, g2) .
Đây là một chức năng khác hoạt động hiệu quả đối với tôi, trả về khoảng cách tính bằng km:
function distance(lat1, lng1, lat2, lng2) {
var radlat1 = Math.PI * lat1 / 180;
var radlat2 = Math.PI * lat2 / 180;
var radlon1 = Math.PI * lng1 / 180;
var radlon2 = Math.PI * lng2 / 180;
var theta = lng1 - lng2;
var radtheta = Math.PI * theta / 180;
var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
dist = Math.acos(dist);
dist = dist * 180 / Math.PI;
dist = dist * 60 * 1.1515;
//Get in in kilometers
dist = dist * 1.609344;
return dist;
}
Sử dụng phương thức API bản đồ computeDistanceBetween () của Google để tính toán điểm đánh dấu gần giữa vị trí của bạn và danh sách điểm đánh dấu trên bản đồ google.
Các bước: -
Tạo điểm đánh dấu trên bản đồ google.
function addMarker(location) {
var marker = new google.maps.Marker({
title: 'User added marker',
icon: {
path: google.maps.SymbolPath.BACKWARD_CLOSED_ARROW,
scale: 5
},
position: location,
map: map
});
}
Khi nhấp chuột, hãy tạo sự kiện để xác định độ dài, độ dài của vị trí của bạn và chuyển nó đến find_closest_marker ().
function find_closest_marker(event) {
var distances = [];
var closest = -1;
for (i = 0; i < markers.length; i++) {
var d = google.maps.geometry.spherical.computeDistanceBetween(markers[i].position, event.latLng);
distances[i] = d;
if (closest == -1 || d < distances[closest]) {
closest = i;
}
}
alert('Closest marker is: ' + markers[closest].getTitle());
}
truy cập liên kết này theo các bước. Bạn sẽ có thể đến gần điểm đánh dấu hơn đến vị trí của mình.