Friday, May 17, 2024
 Popular · Latest · Hot · Upcoming
116
rated 0 times [  123] [ 7]  / answers: 1 / hits: 16865  / 11 Years ago, fri, february 7, 2014, 12:00:00

I have a script showing a Google map I've implemented into my page, currently it shows a series of markers generated by a radar-search. I think I may have put these generated markers in to an array but I am not sure how to do this. I have also looked up the haversine formula as this seems to be one way of calculating the distance between the Geolocation and points in the array. I want to be able to use the tag Id #findMe to perform the search, so clicking it will find the nearest marker to my geolocation and then print an alert with it. I have had a crack at doing the google api built in method but I think again I need to put the markers in an array.



AMENDED CODE - Is this right Dr.Molle?



    jQuery(function($){

var $overlay = $('.overlay'),
resize = true,
map;
var service;
var marker = [];
var pos;
var infowindow;
var placeLoc


function initialize() {
/*var mapOptions = {
zoom: 8,
center: new google.maps.LatLng(-34.397, 150.644),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);

}*/
var mapOptions = {
zoom: 15
};
map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);

// Try HTML5 geolocation
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {

var pos = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);

var request = {
location:pos,
radius:1000,

};

infowindow = new google.maps.InfoWindow();
var service = new google.maps.places.PlacesService(map);
service.nearbySearch(request,callback);
pos = new google.maps.LatLng(position.coords.latitude,
position.coords.longitude);


infowindow = new google.maps.InfoWindow({
map: map,
position: pos,
content: 'You Are Here'
});
$('#findMe').data('pos',pos);

map.setCenter(pos);
}, function() {
handleNoGeolocation(true);
});
} else {
// Browser doesn't support Geolocation
handleNoGeolocation(false);
}



function callback(results, status) {
var markers = [];
if (status == google.maps.places.PlacesServiceStatus.OK) {
for (var i = 0; i < results.length; i++) {
markers.push(createMarker(results[i]));
}
}
$('#findMe').data('markers',markers);
}
}

function createMarker(place) {
placeLoc = place.geometry.location;
var marker = new google.maps.Marker({
map: map,
position: place.geometry.location,
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: 8,
fillColor:'00a14b',
fillOpacity:0.3,
fillStroke: '00a14b',
strokeWeight:4,
strokeOpacity: 0.7
},



});


google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent(place.name);
infowindow.open(map, this);
});
return marker;
}

function handleNoGeolocation(errorFlag) {
if (errorFlag) {
var content = 'Error: The Geolocation service failed.';
} else {
var content = 'Error: Your browser doesn't support geolocation.';
}

var options = {
map: map,
position: new google.maps.LatLng(60, 105),
content: content
};

var infowindow = new google.maps.InfoWindow(options);
map.setCenter(options.position);
}

google.maps.event.addDomListener(window, 'load', initialize);

$('#show').click(function(){

$overlay.show();

if ( resize ){
google.maps.event.trigger(map, 'resize');
resize = false;
}

});

$('.overlay-bg').click(function(){

$overlay.hide();

});

$( #findMe ).click(function() {

var pos = $(this).data('pos'),
markers = $(this).data('markers'),
closest;

if(!pos || !markers){
return;
}

$.each(markers,function(){
var distance=google.maps.geometry.spherical
.computeDistanceBetween(this.getPosition(),pos);
if(!closest || closest.distance > distance){
closest={marker:this,
distance:distance}
}
});
if(closest){
//closest.marker will be the nearest marker, do something with it
//here we simply trigger a click, which will open the InfoWindow
google.maps.event.trigger(closest.marker,'click')
}
});


});

More From » google-maps

 Answers
34

Populating an array with these markers:




  1. let the createMarker-function return the marker, add this at the end of the function:



    return marker;

  2. store the array (e.g. as data-property of #findMe )



    function callback(results, status) {
    var markers=[];
    if (status == google.maps.places.PlacesServiceStatus.OK) {
    for (var i = 0; i < results.length; i++) {
    markers.push(createMarker(results[i]));
    }
    }
    $('#findMe').data('markers',markers);
    }



also store the position returned by geolocation somewhere, (e.g. also as data of #findMe):



  //add this after defining pos in the success-callback of geolocation
$('#findMe').data('pos',pos);


To find the nearest marker you may use the method computeDistanceBetween-method of the geometry-library(don't forget to load the library, it's not loaded by default)



$( #findMe ).click(function() {

var pos = $(this).data('pos'),
markers = $(this).data('markers'),
closest;

if(!pos || !markers){
return;
}

$.each(markers,function(){
var distance=google.maps.geometry.spherical
.computeDistanceBetween(this.getPosition(),pos);
if(!closest || closest.distance > distance){
closest={marker:this,
distance:distance}
}
});
if(closest){
//closest.marker will be the nearest marker, do something with it
//here we simply trigger a click, which will open the InfoWindow
google.maps.event.trigger(closest.marker,'click')
}
});

[#72663] Thursday, February 6, 2014, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
kieraelsies

Total Points: 718
Total Questions: 103
Total Answers: 104

Location: England
Member since Sun, May 21, 2023
1 Year ago
kieraelsies questions
Tue, Aug 3, 21, 00:00, 3 Years ago
Tue, Feb 23, 21, 00:00, 3 Years ago
Thu, Nov 12, 20, 00:00, 4 Years ago
Wed, Sep 9, 20, 00:00, 4 Years ago
Mon, Sep 16, 19, 00:00, 5 Years ago
;