有没有办法将 Google 地图标记始终固定在其地图的中心?

IT技术 javascript google-maps mobile google-maps-api-3
2021-02-28 15:44:58

更准确地说,我试图完成的是,当我拖动Google 地图时,有一个 Google 地图标记 始终固定在地图的中心我认为这将改善用户体验,这就是我现在的做法:

var map, marker, options;

options = {
  center: new google.maps.LatLng(latitude, longitude),
  zoom: 15,
  mapTypeId: google.maps.MapTypeId.ROADMAP,
  mapTypeControl: false,
  overviewMapControl: false,
  zoomControl: true,
  draggable: true
};

map = new google.maps.Map(mapContainer, options);

marker = new google.maps.Marker({
  position: new google.maps.LatLng(latitude, longitude),
  map: map,
  animation: google.maps.Animation.DROP
});

//This line is what makes the Marker stick to the center of the map
marker.bindTo('position', map, 'center');

我在上面的代码中遇到的问题是.. 当我将地图拖到标记下方时,它不够平滑,即。拖动结束时,标记会从“最后一个”中心奇怪地跳到“新”中心。(这在移动设备上更明显),因此我需要的是标记真的永久固定在其地图的中心。

有没有办法做到这一点?(我想我曾经在一个网站上看到过这个)

如果你们能帮助我,请告诉我。

谢谢你。

6个回答

与其像@Dr.Molle 的回答中所建议的那样注入 HTML 组件,不如使用仅使用 CSS 的解决方案。

它更简单、更高效,甚至不需要您接触 DOM (因此如果 Google 更改其实现就不会有任何问题)

此外,由于 Google Maps 不会在容器元素( #map)上应用任何样式,因此该解决方案非常安全。

#map {
    position: relative;
}

#map:after {
    width: 22px;
    height: 40px;
    display: block;
    content: ' ';
    position: absolute;
    top: 50%; left: 50%;
    margin: -40px 0 0 -11px;
    background: url('https://maps.gstatic.com/mapfiles/api-3/images/spotlight-poi_hdpi.png');
    background-size: 22px 40px; /* Since I used the HiDPI marker version this compensates for the 2x size */
    pointer-events: none; /* This disables clicks on the marker. Not fully supported by all major browsers, though */
}

这是一个jsFiddle

聪明的纯 CSS 方法!从未想过以这种方式使用 css peudo 元素。谢谢。
2021-04-25 15:44:58
更好的方法。我对注入方法感到畏缩,尤其是因为它使用了 JQuery。很高兴我向下滚动并找到了您的答案。
2021-05-21 15:44:58

一种不同的方法,没有使用真正的google.maps.Marker:

在地图初始化后,将一个 div 注入到地图容器中,给它一个类名(例如centerMarker),进一步的事情将通过 CSS 完成:

.centerMarker{
  position:absolute;
  /*url of the marker*/
  background:url(http://maps.gstatic.com/mapfiles/markers2/marker.png) no-repeat;
  /*center the marker*/
  top:50%;left:50%;

  z-index:1;
  /*fix offset when needed*/
  margin-left:-10px;
  margin-top:-34px;
  /*size of the image*/
  height:34px;
  width:20px;

  cursor:pointer;
}

演示:http : //jsfiddle.net/doktormolle/jcHqt/

@Alfred Alfizo Mosima:很难在没有看到您的尝试的情况下帮助您。您可能必须为 width/height/top/left 修改 CSS。使用您的头像 (328x328px) jsfiddle.net/doktormolle/0fmdasrg 的示例
2021-04-22 15:44:58
看起来很结实 我会尽快尝试,谢谢你,先生。它似乎正是我所需要的。支持。
2021-04-26 15:44:58
不错的答案,但是当我们移动地图时是否可以自动加载地图,并且在将地图拖动到新位置后我们还可以获得位置。
2021-04-26 15:44:58
很好的答案这正是我要找的,但我想用我的自定义标记替换标记,当我尝试替换它时怎么办,它消失了请帮助
2021-04-30 15:44:58
这不会帮助您获得纬度和经度。使用上述方法与 map.addListener('center_changed',callback() {}); 也可以获取坐标。
2021-05-11 15:44:58

您可以通过以下方式收听中心更改,您只需要更新您的视图:

google.maps.event.addListener(map, "dragend", function() {
   console.log(map.getCenter().toUrlValue());
});

当前主要使用的解决方案是仅在 onclick 时显示 InfoWindow,我一直需要它,就像在 Uber 上一样,所以我甚至将 InfoWindow 替换为仅 css 的解决方案,使用 Ionic 更新视图的正常角度路线

HTML:

 <ion-content >
   <div id="map" data-tap-disabled="true">
  </div>
  <div id="centerInfoBubble">
    <span>{{locationCtrl.coordinates}}</span>
  </div>
  <div id="centerMarker"></div>
 </div>
 </ion-content>

CSS:

#map {
 width: 100%;
 height: 100%;
}
#centerInfoBubble {
  position: absolute;
  /*center the marker*/
 top: 38%;
 left: 22.5%;
 z-index: 1;
 width: 50%;
 height: 6%;
 border-radius: 20px;
 border: 1px solid #111;
 background-color: #444444;
 color: #fff;
 padding: 0.5% 5%;
 cursor: pointer;
}
#centerMarker {
 position: absolute;
 /*url of the marker*/
 background: url(http://maps.gstatic.com/mapfiles/markers2/marker.png) no-repeat;
 /*center the marker*/
 top: 45%;
 left: 45%;
 z-index: 1;
 height: 10%;
 width: 10%;
 cursor: pointer;
}

控制器:

myModule.controller('LocationCtrl',['$scope','$cordovaGeolocation',function($scope,$cordovaGeolocation){
$scope.locationCtrl = {
    coordinates : null
};
var options = {timeout: 10000, enableHighAccuracy: true};
var marker;

$cordovaGeolocation.getCurrentPosition(options).then(function(position){

    var latLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

    var mapOptions = {
            center : latLng,
            zoom : 16,
            mapTypeId : google.maps.MapTypeId.ROADMAP,
            mapTypeControl : false,
            streetViewControl : false,
            zoomControl : false
    };

    $scope.map = new google.maps.Map(document.getElementById("map"), mapOptions);
    $scope.locationCtrl.coordinates = $scope.map.getCenter().toUrlValue();

    google.maps.event.addListener($scope.map, "dragend", function() {
        $scope.locationCtrl.coordinates = $scope.map.getCenter().toUrlValue();
        $scope.$apply();
    });

}, function(error){
console.log("Could not get location");
});

}]);

我不知道这是否存在性能问题,但在设备上看起来很流畅,希望对某人有所帮助

我会根据您的角度方法将所有控制器垃圾放入服务或工厂中,我将其放入服务中,将其包装在 init 函数中,然后使用 $timeout 为控制器 init 从控制器调用服务的 init 函数
2021-04-24 15:44:58

如果这有帮助,我所做的是:

const myLatLng = {lat: 42, lng: 42};

map = new google.maps.Map(document.getElementById('map'), {
  center: myLatLng,
  zoom: 14,
});

marker = new google.maps.Marker({
  position: myLatLng,
  map: map,
});

map.addListener('center_changed', () => {
  marker.setPosition(map.getCenter())
})
这是一个很好的解决方案,因为它允许标记让轮事件传播到地图,但是它有滞后,并且标记在拖动时跳跃和振动。
2021-05-11 15:44:58

您可以使用谷歌地图拖动事件:

google.maps.event.addListener(map, 'dragend', function() {
    marker.setPosition(map.getCenter()); 
} );