Question

I’m having problems upgrading to Google Maps v3 from v2. In particular with MarkerManager. I haven’t worked with maps before and am helping out someone whose developer abandoned them who developed the maps in v2.

The map is to show a maximum of 100 markers that when clicked on show an infobox. (There is also a telerik RadGrid bound to with the results.) It all seems to work until it gets into DisplayAllMarkers() mgr.addMarkers() (see below). It fails in ProjectionHelperOverlay.prototype.LatLngToPixel with Uncaught TypeError: Cannot call method ‘lng’ of undefined. I’ve tried putting in alerts in AddMarker if lat or lng are undefined, but none were alerted. The previous calls to MarkerManager.prototype.addMarkerBatch_ set mPoint to undefined which was then passed to getTilePoint which calls LatLngToPixel where it fails.

I’m thinking it’s a problem with listeners, but have tried various listeners without success. I would really appreciate some help with this as I have been unable to make progress for some time and am letting down the client and don’t know what to try next.

Select SearchResult.js snippet of code:

$(document).ready(function () {
    InitializeMap(originalScale);
});

var map;
var batch = [];
var mgr;
var geocoder = null;

function InitializeMap(scale) {
    map = new google.maps.Map(
        document.getElementById('MapContainer'), {
            center: new google.maps.LatLng(Latitude, Longitude),
            zoom: scale,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            scrollwheel: false
        });

    var listener = google.maps.event.addListener(map, "bounds_changed", function () {
        MapMoved();
        google.maps.event.removeListener(listener);
    });
}

var south, west, north, east, zoom;

function MapMoved() {
    zoom = map.getZoom();
    //zoom = map.setZoom();

    var bounds = map.getBounds();
    var sw = bounds.getSouthWest();
    var ne = bounds.getNorthEast();

    south = sw.lat();
    west = sw.lng();
    north = ne.lat();
    east = ne.lng();

    Search();
}

The Search(); loads up the search parameters (including the north, south, east, west co-ordinates) and calls a telerik ajax request.

C# snippet:

if (Properties.Count >= 1 || zoom == "0")    //display properties
{
    RadAjaxManager1.ResponseScripts.Add("ClearAll();");

    Properties.ForEach(p =>
    {
        string script = "AddMarker(" + p.ID.ToString() + "," + p.LatitudeShort.ToString() + "," + p.LongitudeShort.ToString() + ");";
        RadAjaxManager1.ResponseScripts.Add(script);
    });

    RadAjaxManager1.ResponseScripts.Add("DisplayAllMarkers();");
}
else //zoom out map – which will start the search process all over again.
{
    string delta = "1";
    RadAjaxManager1.ResponseScripts.Add("ZoomOut(" + delta + ");");
}

SearchResult.js snippet continued:

function ClearAll() {
    batch = [];
}

function AddMarker(id, lat, lng) {
    batch.push(CreatePropertyMarker(lat, lng, id));
}  

function DisplayAllMarkers() {
    mgr = new MarkerManager(map, { trackMarkers: true });

    google.maps.event.addListener(mgr, 'loaded', function () {
        mgr.clearMarkers();
        mgr.addMarkers(batch, 3, 17); // **Failing in here!!!**
        mgr.refresh();
    });
}

function CreatePropertyMarker(lat, lng, id) {    
    var redIcon3 = {
        url: '../images/HouseIcon_ForGoogleMap.png',
        size: new google.maps.Size(22, 22),
        origin: new google.maps.Point(0, 0),
        anchor: new google.maps.Point(0, 22)
    };

    var marker3 = new google.maps.Marker(new google.maps.LatLng(lat, lng), redIcon3);

    google.maps.event.addListener(marker3, 'click', function () {

        var data = "{'Id': '" + id + "'}";
        $.ajax({
            type: "POST",
            dataType: "json",
            contentType: "application/json",
            url: 'searchresult.aspx/GetPropertyPopOut',
            data: data,
            success: function (data) {
                var popout = data.d;
                marker3.openExtInfoWindow(map, "custom_info_window_red", popout, { beakOffset: -1 });
            },
            error: function (result) {
                alert('status:' + result.status + '    statusText:' + result.statusText);
            }
         });
    });
    return marker3;
}

Script order and versions:

  • jquery-ui-1.9.1.custom.min.css
  • Google Maps: v3 (I have also tried specifying particular version 3 numbers e.g. v=3.12 http://maps.googleapis.com/maps/api/js?key=MY_KEY&sensor=false
  • jquery-1.8.2.js
  • jquery-ui-1.9.1.custom.min.js
  • extinfowindow.js v2.0
  • MarkerManager.js v1.1
  • SearchResult.js
  • jquery-ui-1.8.16.custom.min.js
  • jquery-1.6.2.min.js
Was it helpful?

Solution

After tying a load of different things I eventually found out the problem was when creating the marker it needed position set. I changed the line in CreatePropertyMarker from:

var marker3 = new google.maps.Marker(new google.maps.LatLng(lat, lng), redIcon3);

to:

var marker3 = new google.maps.Marker({
    position: new google.maps.LatLng(lat, lng),
    icon: redIcon3
});
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top