const propertiesArray = [{id:"4-1542981494",pos:{lat:54.3497,lng:-5.652289}},{id:"20-cnj493955",pos:{lat:54.3300644,lng:-5.7138729}},{id:"1-17771096",pos:{lat:54.281303,lng:-5.580621}},{id:"1-17957548",pos:{lat:54.306015,lng:-5.729737}},{id:"1-18069992",pos:{lat:54.314762,lng:-5.71843}},{id:"1-17911961",pos:{lat:54.27222,lng:-5.808454}},{id:"1-17394771",pos:{lat:54.336284,lng:-5.582849}},{id:"19-ARFARF5292",pos:{lat:54.327183457993,lng:-5.6614948873438}},{id:"56-17486490",pos:{lat:54.307334,lng:-5.780585}},{id:"56-18910418",pos:{lat:54.372013,lng:-5.721193}},{id:"19-ARFARF5410",pos:{lat:54.3113917958312,lng:-5.55718411299954}},{id:"19-ARFARF5171",pos:{lat:54.3268008,lng:-5.7009501}},{id:"19-ARFARF5405",pos:{lat:54.3288359587822,lng:-5.71709060666331}},{id:"4-19408831",pos:{lat:54.252567,lng:-5.715824}},{id:"19-ARFARF5464",pos:{lat:54.3386684296347,lng:-5.65202986441818}},{id:"1-18164461",pos:{lat:54.298149,lng:-5.557406}},{id:"1-18170758",pos:{lat:54.391952,lng:-5.701316}},{id:"19-ARFARF5367",pos:{lat:54.3643854724509,lng:-5.64842000885009}},{id:"19-ARFARF5465",pos:{lat:54.3194012476956,lng:-5.68057925239995}},{id:"4-1684143964",pos:{lat:54.325347,lng:-5.712388}},{id:"19-ARFARF4779",pos:{lat:54.3583153775127,lng:-5.65068379325866}},{id:"19-ARFARF5493",pos:{lat:54.3382649924653,lng:-5.80065034793186}},{id:"19-ARFARF5530",pos:{lat:54.3451969086036,lng:-5.69536939544677}},{id:"1-18306652",pos:{lat:54.372013,lng:-5.721193}},{id:"19-ARFARF5592",pos:{lat:54.3125949201302,lng:-5.7851973066537}},{id:"1-10059537",pos:{lat:54.298459,lng:-5.557199}},{id:"70-GOCGOC11391",pos:{lat:54.3379869381043,lng:-5.69332868133963}},{id:"9-JMCJMC26084",pos:{lat:54.374225,lng:-5.702874}},{id:"18-CNRCJBE2884",pos:{lat:54.3355903,lng:-5.695447}},{id:"1-18368472",pos:{lat:54.338417,lng:-5.714982}},{id:"19-ARFARF5653",pos:{lat:54.3377228866094,lng:-5.70682779235839}},{id:"19-ARFARF5654",pos:{lat:54.3377228866094,lng:-5.70682779235839}},{id:"19-ARFARF5657",pos:{lat:54.3408799666868,lng:-5.70334628505706}},{id:"4-783466566",pos:{lat:54.3348,lng:-5.716189}},{id:"1-18446761",pos:{lat:54.324279,lng:-5.711846}},{id:"4-19564617",pos:{lat:54.368804,lng:-5.794525}},{id:"9-18608444",pos:{lat:54.318115,lng:-5.768895}},{id:"1-18452624",pos:{lat:54.344032,lng:-5.700441}},{id:"4-19574781",pos:{lat:54.37313,lng:-5.702163}},{id:"9-18621520",pos:{lat:54.34444,lng:-5.5799}},{id:"1-10059166",pos:{lat:54.323232,lng:-5.704472}},{id:"105-98a4421c76914aed84d70e4af2d577e5",pos:{lat:54.3246596,lng:-5.7131103}},{id:"1-18481611",pos:{lat:54.334365,lng:-5.709741}},{id:"4-19257173",pos:{lat:54.31192,lng:-5.603539}},{id:"113-CCOP0A3018",pos:{lat:54.3513268796438,lng:-5.8252231044075}},{id:"19-ARFARF5727",pos:{lat:54.3232525192424,lng:-5.65115681821504}},{id:"4-19526950",pos:{lat:54.325767,lng:-5.702377}},{id:"4-19264104",pos:{lat:54.302375,lng:-5.788096}},{id:"7-18490915",pos:{lat:54.25098,lng:-5.642905}},{id:"19-ARFARF5742",pos:{lat:54.3954301161962,lng:-5.76214834410146}},{id:"4-19639461",pos:{lat:54.313003,lng:-5.71681}},{id:"19-ARFARF5754",pos:{lat:54.3470296533036,lng:-5.6607430315499}},{id:"56-19573372",pos:{lat:54.334388,lng:-5.794869}},{id:"4-19622073",pos:{lat:54.37614,lng:-5.703281}},]; let map; let markersArray = []; let markersArrayAll = []; let markersArrayChanged = []; let clusterMarkersArray = []; const infoWindow = document.querySelector(".info-window-control"); async function initMap() { const { Map, InfoWindow } = await google.maps.importLibrary("maps","geometry"); const { AdvancedMarkerElement } = await google.maps.importLibrary("marker"); let sw = new google.maps.LatLng(54.019510, -8.349163); let ne = new google.maps.LatLng(55.343439, -5.438346); let bounds = new google.maps.LatLngBounds(sw, ne); // Map Options let mapOptions = { zoom: 14, mapTypeId: google.maps.MapTypeId.ROADMAP, mapId: "1c886fcb938b1123", disableDefaultUI: false, streetViewControl: true, streetViewControlOptions: { position: google.maps.ControlPosition.RIGHT_TOP, }, }; map = new Map(document.getElementById("area_map"), mapOptions); var _markerCluster = new markerClusterer.MarkerClusterer({map,algorithmOptions: { radius: 80}}); buildMakers(propertiesArray, AdvancedMarkerElement, bounds, InfoWindow); setMapBounds(map, markersArray); setMapMarkers( _markerCluster, markersArray, "add"); let ClusterChanged = "N"; google.maps.event.addListener(map, "idle", () => { markersArray.length = 0; markersArrayChanged.length = 0; markersArrayAll.map((property, i) => { let position = { lat:property.position.lat, lng: property.position.lng }; if(map.getBounds().contains(position)){ markersArray.push(property); } else { markersArrayChanged.push(property); } }); if(markersArrayChanged.length != 0 ){ ClusterChanged = "Y"; setMapMarkers( _markerCluster, markersArrayChanged, "remove"); setMapMarkers( _markerCluster, markersArray, "add"); } if(markersArrayChanged.length == 0 && ClusterChanged == "Y"){ ClusterChanged = "N"; setMapMarkers( _markerCluster, markersArrayAll, "add"); } }); google.maps.event.addListener(_markerCluster, 'click', function(cluster) { clusterMarkersArray = [] var markers = cluster.markers; for (let i in markers) { let position = { lat:markers[i].position.lat, lng: markers[i].position.lng }; var clusterMarkers = clusterMarkersArray; for (i = 0; i < clusterMarkers.length; i++) { var p1 = new google.maps.LatLng(clusterMarkers[i].lat, clusterMarkers[i].lng), p2 = new google.maps.LatLng(position.lat, position.lng); if(p1.equals(p2)){ var quot = 360.0 / clusterMarkersArray.length; var newLat = position.lat + -.00012 * Math.cos(+quot * i); //+ -.00008 * Math.cos((+quot * i) / 180 * Math.PI); //x var newLng = position.lng + -.00012 * Math.sin(+quot * i); //+ -.0008 * Math.sin((+quot * i) / 180 * Math.PI); //Y markers[i].position = {lat:newLat,lng:newLng}; } } clusterMarkersArray.push(position); } }); } function buildMakers(properties, AdvancedMarkerElement, bounds, InfoWindow){ const infoWindow = new InfoWindow(); properties.map((property, i) => { let position = {lat:property.pos.lat,lng:property.pos.lng}; // check if maker is withing NI Bounds if(bounds.contains(position)){ const icon = document.createElement("img"); icon.src = "/images/pin32x.png"; const marker = new AdvancedMarkerElement({ map, position: position, content: icon, gmpClickable: true, }); // Add a click listener for each marker, and set up the info window. marker.addListener("click", () => { infoWindow.close(); markerClick(marker, property.id, infoWindow); }); // check if maker is withing NI Bounds if(bounds.contains(position)){ markersArray.push(marker); markersArrayAll.push(marker); } } }); //console.timeEnd('build markers'); $("#map-loading").addClass('hide'); } function markerClick(marker, id, infoWindow){ const request = new Request("/_search-includes/marker-info?id="+id) fetch(request) .then((response) => { if (response.status === 200) { return response.json(); } else { throw new Error("Something went wrong on API server!"); } }) .then((response) => { const infoWindowContent = buildContent(response); infoWindow.setContent(infoWindowContent); infoWindow.open(marker.map, marker); }) .catch((error) => { console.error(error); }); } function buildContent(property){ content = `
`; return content; } function setMapMarkers(_markerCluster, _MarkersArray, Action){ var mc = _markerCluster; var ma = _MarkersArray; if(Action == "add"){ mc.addMarkers(ma); } if(Action == "remove"){ mc.removeMarkers(ma); } if(Action == "clear"){ mc.clearMarkers(); } } function setMapBounds(map, markers){ var boundsmarkers = new google.maps.LatLngBounds(); for (var i = 0; i < markers.length; i++) { let position = { lat: markers[i].position.lat, lng: markers[i].position.lng }; boundsmarkers.extend(position); } map.fitBounds(boundsmarkers); }