var gmap = ''; var gmapready =''; var ImgViewready =''; function myMap(latitude,longitude,zoom) { var mapProp= { center:new google.maps.LatLng(latitude,longitude), "zoom":zoom, }; gmap=new google.maps.Map(document.getElementById(mapdivid+"googleMap"),mapProp); gmap.get('streetView') .setOptions({ imageDateControl: true, }) gmapready='true'; // Show Street View coverage blue lines if setting is enabled if (typeof AppState !== 'undefined' && AppState.settings && AppState.settings.streetviewcoverage === 'true') { var svCoverageLayer = new google.maps.StreetViewCoverageLayer(); svCoverageLayer.setMap(gmap); } var stvProp= { }; var thePanorama = gmap.getStreetView(); //thePanorama.setOptions(stvProp); //gps-device-arrow.png var panoicon = L.icon({ iconUrl: '/objects/gps-device-arrow.png', iconSize: [38, 38], // size of the icon iconAnchor: [19, 19], // point of the icon which will correspond to marker's location // popupAnchor: [-3, -76] // point from which the popup should open relative to the iconAnchor }); var mOpt = []; mOpt['icon']=panoicon; var panomarker = L.marker([latitude, longitude],mOpt); var panostatus = 'closed'; // Parcel centroid for auto-orient (computed from primary GeoJSON layer) var _parcelCenter = null; function _getParcelCenter() { if (_parcelCenter) return _parcelCenter; if (typeof AppState !== 'undefined' && AppState.layers && AppState.layers.settings && AppState.layers.settings.overlays) { // First overlay is the parcel var keys = Object.keys(AppState.layers.settings.overlays); if (keys.length > 0) { var layer = AppState.layers.settings.overlays[keys[0]]; if (layer && typeof layer.getBounds === 'function') { try { var b = layer.getBounds(); if (b.isValid()) { _parcelCenter = b.getCenter(); } } catch(e) {} } } } return _parcelCenter; } // Compute heading from point A to point B (degrees) function _headingTo(fromLat, fromLng, toLat, toLng) { var toRad = function(d) { return d * Math.PI / 180; }; var toDeg = function(r) { return r * 180 / Math.PI; }; var dLng = toRad(toLng - fromLng); var y = Math.sin(dLng) * Math.cos(toRad(toLat)); var x = Math.cos(toRad(fromLat)) * Math.sin(toRad(toLat)) - Math.sin(toRad(fromLat)) * Math.cos(toRad(toLat)) * Math.cos(dLng); return (toDeg(Math.atan2(y, x)) + 360) % 360; } // Preview marker: shows cursor position on Leaflet map when hovering Google Map var _previewIcon = L.divIcon({ className: 'gmap-preview-marker', iconSize: [16, 16], iconAnchor: [8, 8], html: '
' }); var _previewMarker = L.marker([0,0], { icon: _previewIcon, interactive: false }); var _previewActive = false; // Use native DOM mousemove on the Google Map container so it works // even when the pegman overlay captures Google Maps API events var _gmapContainer = document.getElementById(mapdivid + 'googleMap'); if (_gmapContainer) { _gmapContainer.addEventListener('mousemove', function(e) { if (!gmap || !gmapready || typeof map === 'undefined') return; // Don't show preview when street view is active if (panostatus === 'open') return; // Convert pixel position to lat/lng via Google Maps projection var rect = _gmapContainer.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; var proj = gmap.getProjection(); var bounds = gmap.getBounds(); if (!proj || !bounds) return; var ne = bounds.getNorthEast(); var sw = bounds.getSouthWest(); // Linear interpolation of screen position to geo coords var lng = sw.lng() + (x / rect.width) * (ne.lng() - sw.lng()); // Latitude needs Mercator adjustment var topWorld = proj.fromLatLngToPoint(ne); var bottomWorld = proj.fromLatLngToPoint(sw); var worldY = topWorld.y + (y / rect.height) * (bottomWorld.y - topWorld.y); var worldPoint = new google.maps.Point(0, worldY); // Use a dummy X — we only need the lat from worldY var midX = (proj.fromLatLngToPoint(ne).x + proj.fromLatLngToPoint(sw).x) / 2; worldPoint.x = midX; var latLng = proj.fromPointToLatLng(worldPoint); var lat = latLng.lat(); var ll = L.latLng(lat, lng); _previewMarker.setLatLng(ll); if (!_previewActive) { _previewMarker.addTo(map); _previewActive = true; } }, true); // useCapture to intercept before Google's handlers _gmapContainer.addEventListener('mouseleave', function() { if (_previewActive && typeof map !== 'undefined') { map.removeLayer(_previewMarker); _previewActive = false; } }); } google.maps.event.addListener(thePanorama, 'visible_changed', function() { if (thePanorama.getVisible()) { if (panostatus == 'closed') { panostatus = 'open'; // Auto-orient toward parcel centroid var pc = _getParcelCenter(); if (pc && thePanorama.getPosition()) { var svLat = thePanorama.getPosition().lat(); var svLng = thePanorama.getPosition().lng(); var heading = _headingTo(svLat, svLng, pc.lat, pc.lng); thePanorama.setPov({ heading: heading, pitch: 0 }); } } // Remove preview marker when street view is active if (_previewActive && typeof map !== 'undefined') { map.removeLayer(_previewMarker); _previewActive = false; } } else { panostatus = 'closed'; map.removeLayer(panomarker); } }); thePanorama.setOptions({ imageDateControl: true }); // Track whether we're programmatically setting POV (to avoid fighting user input) var _autoOrienting = false; var _userAdjustedPov = false; thePanorama.addListener('position_changed', function() { var latlng = L.latLng(thePanorama.getPosition().lat(),thePanorama.getPosition().lng()); panomarker.setLatLng(latlng); panomarker.addTo(map); // Re-orient toward parcel on each position change (new street clicked) // Reset user-adjusted flag since this is a new location _userAdjustedPov = false; var pc = _getParcelCenter(); if (pc) { var svLat = thePanorama.getPosition().lat(); var svLng = thePanorama.getPosition().lng(); var heading = _headingTo(svLat, svLng, pc.lat, pc.lng); _autoOrienting = true; thePanorama.setPov({ heading: heading, pitch: thePanorama.getPov().pitch || 0 }); setTimeout(function() { _autoOrienting = false; }, 100); } }); thePanorama.addListener('pov_changed', function() { panomarker.setRotationAngle(thePanorama.getPov().heading.toFixed()); // If user manually changed POV, note it so we don't override if (!_autoOrienting) _userAdjustedPov = true; }); /* google.maps.event.addListenerOnce(map, 'idle', function(){ alert('here'); }); */ } function gmapsetbounds(latitude,longitude,zoom) { gmap.setCenter({lat: latitude, lng: longitude}); gmap.setZoom(zoom); } function togglegooglemaps(mapid) { if (gmapready == '') { // alert(mapid); $("#"+mapid).height($("#"+mapid).height()/2); $("#"+mapdivid+"googleMap").height($("#"+mapid).height()); $("#"+mapdivid+"googleMap").slideDown("slow", function() { var latitude = map.getCenter().lat; var longitude = map.getCenter().lng; var zoom = map.getZoom(); myMap(latitude,longitude,zoom); google.maps.event.trigger(gmap, "resize"); map.invalidateSize(); }); } else { //alert('there'); $("#"+mapdivid+"googleMap").slideUp("slow", function() { // Animation complete. var newheight = $("#"+mapid).height($("#"+mapid).height()*2); $("#"+mapid).animate({"height":newheight},5000); google.maps.event.trigger(gmap, "resize"); map.invalidateSize(); gmapready=''; }); //$("#googleMap").hide(); } } function toggleImgView(mapid,imgurl) { if (ImgViewready == '') { ImgViewready='true'; // alert(mapid); $("#"+mapid).height($("#"+mapid).height()/2); $("#"+mapdivid+"ImgView").height($("#"+mapid).height()); $("#"+mapdivid+"ImgView").slideDown("slow", function() { $("#"+mapdivid+"ImgView").html(""); var divid = mapdivid+"ImgView"; //loadimgviewer(divid); pannellum.viewer(divid, { "type": "equirectangular", "panorama": imgurl, "autoLoad": true }); }); } else { //alert('there'); $("#"+mapdivid+"ImgView").slideUp("slow", function() { // Animation complete. var newheight = $("#"+mapid).height($("#"+mapid).height()*2); $("#"+mapid).animate({"height":newheight},5000); google.maps.event.trigger(gmap, "resize"); map.invalidateSize(); ImgViewready=''; $("#"+mapdivid+"ImgView").html("SLEEPING"); }); //$("#googleMap").hide(); } }