Есть ли способ скорректировать маркер Google Maps в Центр его карты?

Чтобы быть более точным, я пытаюсь добиться того, что в то время как я Перетащить на карту Google есть Google Maps Маркер, который остается фиксированным в центре карты на все время. По моему мнению, это улучшит работу пользователя. Вот как я это делаю сейчас:

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');

Проблема с этим кодом заключается в том, что.. Когда я перетаскиваю карту под маркером , она не достаточно гладкая, т.е. Маркер совершает странный прыжок из "последнего" центра в "новый" центр при перетаскивании концов. (это более заметно на мобильных устройствах). Поэтому мне нужно, чтобы маркер действительно постоянно фиксировался в Центре его карты.

Есть ли способ сделать это? (Я думаю, что видел это на веб-сайте один раз)

Сообщите мне, если вы, ребята, можете мне помочь.

Спасибо.

Ответ 1

Другой подход, который не использовал реальный 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/

Ответ 2

Вместо того, чтобы вводить HTML-компонент, как было предложено в ответе @Dr.Molle, почему бы вам не использовать только 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.

Ответ 3

Вы можете прослушивать изменения центра через что-то вроде ниже, вам просто нужно обновить представление:

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

Текущее основное используемое решение состоит в том, чтобы воспитывать InfoWindow только тогда, когда onclick, я нуждался в нем все время, как на Uber, поэтому я заменил даже InfoWindow на единственное решение css, обновив представление обычным angular маршрут с ионом

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");
});

}]);

Я не знаю, есть ли проблемы с производительностью, но выглядит довольно гладко на устройстве, надеюсь, что это поможет кому-то.

Ответ 4

Если это может помочь, я сделал следующее:

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())
})