Google Maps: Get click or marker (x,y) pixel coordinates inside marker click listener

前端 未结 4 1355
星月不相逢
星月不相逢 2021-01-18 21:28

I am trying to display completely custom info windows over map markers on marker click. I have successfully implemented this answe

相关标签:
4条回答
  • 2021-01-18 21:54

    With Radio's help I was able to solve this. Upvote him.

      <div id="myinfo" class="info"><p>I am a div on top of a google map .. </p></div>
    
      <script>
    
      info = document.getElementById('myinfo');
    
      google.maps.event.addListener(marker, 'click', function() {
    
        var topRight = map.getProjection().fromLatLngToPoint(map.getBounds().getNorthEast());
        var bottomLeft = map.getProjection().fromLatLngToPoint(map.getBounds().getSouthWest());
        var scale = Math.pow(2, map.getZoom());
        var worldPoint = map.getProjection().fromLatLngToPoint(this.getPosition());
        var markerCoords = new google.maps.Point((worldPoint.x - bottomLeft.x) * scale, (worldPoint.y - topRight.y) * scale);
    
        var x=markerCoords['x']+$('#map').offset().left; //offset needed if map not fullscreen
        var y=markerCoords['y'];
    
        info.style.left=x+'px';
        info.style.top=y+'px';
        info.style.display='block';
    
      });
    
      </script>
    
    0 讨论(0)
  • 2021-01-18 21:57

    Another option. Use the InfoBox third party library. It inherits from OverlayView, and you can put your "completely custom" div in it.

    proof of concept fiddle

    var geocoder;
    var map;
    var overlay;
    
    function initialize() {
      var map = new google.maps.Map(
        document.getElementById("map_canvas"), {
          center: new google.maps.LatLng(37.4419, -122.1419),
          zoom: 13,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        });
      var marker = new google.maps.Marker({
        map: map,
        draggable: true,
        position: map.getCenter()
      });
    
      var boxText = document.createElement("div");
      boxText.style.cssText = "border: 1px solid black; margin-top: 8px; background: white; padding: 5px;";
      boxText.innerHTML = "I am a div on top of a google map ..";
      var myOptions = {
        content: boxText,
        disableAutoPan: false,
        maxWidth: 0,
        pixelOffset: new google.maps.Size(-75, -10),
        zIndex: null,
        boxStyle: {
          background: "url('tipbox.gif') no-repeat",
          opacity: 0.75,
          width: "150px"
        },
        closeBoxMargin: "0px 0px 0px 0px",
        closeBoxURL: "",
        infoBoxClearance: new google.maps.Size(0, 0),
        isHidden: false,
        pane: "floatPane",
        enableEventPropagation: false
      };
    
      var info = new InfoBox(myOptions);
    
      info.open(map, marker);
    
      google.maps.event.addListener(marker, 'click', function() {
        // info.setContent('<div id="myinfo" class="info"><p>I am a div on top of a google map ..</p></div>');
        info.open(map, marker);
      });
    }
    google.maps.event.addDomListener(window, "load", initialize);
    html,
    body,
    #map_canvas {
      height: 100%;
      width: 100%;
      margin: 0px;
      padding: 0px
    }
    div.info {
      position: absolute;
      z-index: 999;
      width: 200px;
      height: 50px;
      display: none;
      background-color: #fff;
      border: 3px solid #ebebeb;
      padding: 10px;
    }
    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <script src="https://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobox/src/infobox.js"></script>
    <div id="map_canvas" style="border: 2px solid #3872ac;"></div>

    0 讨论(0)
  • 2021-01-18 21:59

    A marker click event returns a MouseClickEvent

    The only documented property of a MouseClickEvent is:

    latLng LatLng The latitude/longitude that was below the cursor when the event occurred.

    To convert that into a pixel position use the fromLatLngToContainerPixel method of MapCanvasProjection:

        google.maps.event.addListener(marker, 'click', function (e) {
           var point = overlay.getProjection().fromLatLngToDivPixel(e.latLng); 
                info.style.left = point.x + 'px';
                info.style.top = point.y + 'px';
                info.style.display = 'block';
        });
    

    working fiddle

    code snippet:

    var geocoder;
    var map;
    var overlay;
    
    function initialize() {
        var map = new google.maps.Map(
        document.getElementById("map_canvas"), {
            center: new google.maps.LatLng(37.4419, -122.1419),
            zoom: 13,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        });
        var marker = new google.maps.Marker({
            map: map,
            draggable: true,
            position: map.getCenter()
        });
    
        google.maps.event.addListener(map, 'projection_changed', function () {
            overlay = new google.maps.OverlayView();
            overlay.draw = function () {};
            overlay.setMap(map);
    
            var info = document.getElementById('myinfo');
            google.maps.event.addListener(marker, 'click', function (e) {
               var point = overlay.getProjection().fromLatLngToContainerPixel(e.latLng); 
                    info.style.left = (point.x - 100)+ 'px';
                    info.style.top = (point.y) + 'px';
                    info.style.display = 'block';
            });
            google.maps.event.addListener(map, 'center_changed', function (e) {
                var point = overlay.getProjection().fromLatLngToContainerPixel(marker.getPosition()); 
                    info.style.left = (point.x - 100)+ 'px';
                    info.style.top = (point.y) + 'px';
                    info.style.display = 'block';
            });
                    google.maps.event.addListener(marker, 'drag', function (e) {
               var point = overlay.getProjection().fromLatLngToContainerPixel(marker.getPosition()); 
                    info.style.left = (point.x - 100)+ 'px';
                    info.style.top = (point.y) + 'px';
                    info.style.display = 'block';
            });
            
        });
    }
    google.maps.event.addDomListener(window, "load", initialize);
    html,
    body,
    #map_canvas {
      height: 100%;
      width: 100%;
      margin: 0px;
      padding: 0px
    }
    div.info {
      position: absolute;
      z-index: 999;
      width: 200px;
      height: 50px;
      display: none;
      background-color: #fff;
      border: 3px solid #ebebeb;
      padding: 10px;
    }
    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <div id="map_canvas" style="border: 2px solid #3872ac;"></div>
    <div id="myinfo" class="info">
      <p>I am a div on top of a google map ..</p>
    </div>

    0 讨论(0)
  • 2021-01-18 22:18

    Here is how you get the pixel location:

    function getPixelLocation(currentLatLng) {
    
            var scale = Math.pow(2, map.getZoom());
            // The NorthWest corner of the current viewport corresponds
            // to the upper left corner of the map.
            // The script translates the coordinates of the map's center point
            // to screen coordinates. Then it subtracts the coordinates of the
            // coordinates of the map's upper left corner to translate the 
            // currentLatLng location into pixel values in the <div> element that hosts the map.
            var nw = new google.maps.LatLng(
                map.getBounds().getNorthEast().lat(),
                map.getBounds().getSouthWest().lng()
            );
            // Convert the nw location from geo-coordinates to screen coordinates
            var worldCoordinateNW = map.getProjection().fromLatLngToPoint(nw);
            // Convert the location that was clicked to screen coordinates also
            var worldCoordinate = map.getProjection().fromLatLngToPoint(currentLatLng);
            var currentLocation = new google.maps.Point(
                Math.floor((worldCoordinate.x - worldCoordinateNW.x) * scale),
                Math.floor((worldCoordinate.y - worldCoordinateNW.y) * scale)
            );
    
            console.log(currentLocation);
            return currentLocation;
        }
    
    0 讨论(0)
提交回复
热议问题