const propertiesArray = [{id:"9-JMDJMD23663",pos:{lat:54.660683,lng:-5.562941}},{id:"1-18037423",pos:{lat:54.643054,lng:-5.536313}},{id:"137-101253012573",pos:{lat:54.6281011,lng:-5.5319025}},{id:"1-18071805",pos:{lat:54.649257,lng:-5.54285}},{id:"3-HLW250075",pos:{lat:54.656966,lng:-5.556432}},{id:"20-cnj718150",pos:{lat:54.641354,lng:-5.5354467}},{id:"1-18190741",pos:{lat:54.662425,lng:-5.571412}},{id:"127-HEO250017",pos:{lat:54.635821,lng:-5.535957}},{id:"1-18173267",pos:{lat:54.64981,lng:-5.544318}},{id:"9-JMDJMD13197",pos:{lat:54.65916,lng:-5.564006}},{id:"9-JMDJMD17828",pos:{lat:54.662368,lng:-5.572137}},{id:"127-HEO250055",pos:{lat:54.643879,lng:-5.545698}},{id:"131-BAIL0A339",pos:{lat:54.6432672,lng:-5.5422533}},{id:"1-18437781",pos:{lat:54.64661,lng:-5.557773}},{id:"1-18422484",pos:{lat:54.641513,lng:-5.536215}},{id:"1-18453057",pos:{lat:54.641563,lng:-5.536285}},{id:"1-18437152",pos:{lat:54.641548,lng:-5.531427}},{id:"131-BAIL0A341",pos:{lat:54.6399711,lng:-5.5316098}},{id:"1-18458068",pos:{lat:54.628139,lng:-5.532712}},{id:"9-18715590",pos:{lat:54.646495,lng:-5.541428}},{id:"9-18645759",pos:{lat:54.637607,lng:-5.533391}},{id:"9-18737062",pos:{lat:54.632911,lng:-5.543631}},{id:"9-18611960",pos:{lat:54.627937,lng:-5.53276}},{id:"13-TRHTRH95807",pos:{lat:54.627085,lng:-5.575012}},{id:"9-18751355",pos:{lat:54.643013,lng:-5.560836}},{id:"1-18402841",pos:{lat:54.65913,lng:-5.559719}},{id:"3-NTN250314",pos:{lat:54.656964,lng:-5.556079}},{id:"1-18486794",pos:{lat:54.638492,lng:-5.534691}},{id:"137-101253012910",pos:{lat:54.657,lng:-5.55711}},{id:"1-18495716",pos:{lat:54.644752,lng:-5.544031}},{id:"9-18782551",pos:{lat:54.632956,lng:-5.536015}},{id:"9-18782548",pos:{lat:54.632957,lng:-5.536014}},{id:"1-18515162",pos:{lat:54.641651,lng:-5.535928}},{id:"9-18782549",pos:{lat:54.632956,lng:-5.536015}},{id:"13-TRHTRB53599",pos:{lat:54.6436163483472,lng:-5.54541394689717}},{id:"9-18793839",pos:{lat:54.634418,lng:-5.540386}},{id:"1-18513477",pos:{lat:54.635349,lng:-5.536294}},{id:"69-BNI250432",pos:{lat:54.646549,lng:-5.557776}},{id:"9-18629780",pos:{lat:54.64136,lng:-5.535826}},{id:"9-18827640",pos:{lat:54.652393,lng:-5.545437}},{id:"127-HEO250116",pos:{lat:54.635411,lng:-5.541091}},{id:"34-TORTOR4526",pos:{lat:54.6377743220685,lng:-5.54099147489315}},{id:"131-BAIL0A362",pos:{lat:54.6423683,lng:-5.5393501}},{id:"131-BAIL0A359",pos:{lat:54.6390554,lng:-5.5441056}},{id:"127-HEO240070",pos:{lat:54.615455,lng:-5.551443}},{id:"9-18786495",pos:{lat:54.645492,lng:-5.542145}},{id:"9-18856765",pos:{lat:54.639816,lng:-5.544856}},{id:"1-18541186",pos:{lat:54.638679,lng:-5.533308}},{id:"9-18783510",pos:{lat:54.642673,lng:-5.570432}},{id:"9-18621423",pos:{lat:54.64537,lng:-5.542029}},{id:"131-BAIL0A367",pos:{lat:54.6396694,lng:-5.532567}},{id:"9-18852378",pos:{lat:54.633586,lng:-5.537245}},{id:"1-18053241",pos:{lat:54.641063,lng:-5.531958}},{id:"1-18555885",pos:{lat:54.642814,lng:-5.536331}},{id:"1-18534140",pos:{lat:54.644942,lng:-5.541111}},]; 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); }