То, как использовать Google, отображает API с несколькими маркерами на той же карте

вам нужно использовать оператор update, например $set, $unset, $push и т. Д. В вашем запросе на обновление. поскольку вы не используете ни одного из тех, у кого вы получаете такое поведение.

Если вы просто хотите установить отправляемое значение, попробуйте использовать его с $set.

Попробуйте это:

  Report.findByIdAndUpdate(
    req.params.id,
    {$set : req.body.data } ,
    { new: true },
    (err, report) => {
      if (err) return res.status(404).send({ message: err.message });
      return res.send({ message: "report updated!", report });
    }
  );

Примечание: $ set переопределяет предыдущее значение.

Если вам нужно что-то еще, прочтите подробную информацию в Обновление MongoDB. Операторская документация

.

10
задан Salman A 12 December 2012 в 11:01
поделиться

4 ответа

obeattie и gregers являются оба правильными. В целом необходимо сохранить параметры маркера в некотором массиве, который Вы будете позже использовать по крайней мере дважды:

  1. при добавлении наложения к карте
  2. когда добавление его к GLatLngBounds возражает для вычисления уровня масштабирования и центральной точки

Массив или маркеры были бы похожи на массив объектов, чего-то как:

var latlng1 = [
    new GLatLng( 48.1234, -120.1234 ),
    new GLatLng( 48.5678, -120.5678 ),
    new GLatLng( 48.9101, -120.9112 ),
    new GLatLng( 48.1121, -120.1314 ),
    new GLatLng( 48.3145, -120.1516 ),
    new GLatLng( 48.1617, -120.1718 ),
    new GLatLng( 48.1819, -120.1920 ),
    new GLatLng( 48.2021, -120.2122 )
];

Код для добавления маркеров посмотрел бы что-то подобное:

  // assume that map1 is an instance of a GMap2 object

  // #0 -- google maps api requires us to call setCenter first before calling any other operation on the map
  map1.setCenter( new GLatLng( 0, 0 ), 0 );

  // #1 -- add markers
  for ( var i = 0; i < latlng1.length; i++ )
  {
    var marker = new GMarker( latlng1[ i ] );
    map1.addOverlay( marker );
  }

  // #2a -- calculate center
  var latlngbounds = new GLatLngBounds( );
  for ( var i = 0; i < latlng1.length; i++ )
  {
    latlngbounds.extend( latlng1[ i ] );
  }

  // #2b -- set center using the calculated values
  map1.setCenter( latlngbounds.getCenter( ), map1.getBoundsZoomLevel( latlngbounds ) );

Что касается Вашего вопроса об использовании серверного сценария в стороне клиента JavaScript, да можно смешать их. Судя Вашим описанием, я думаю, что это - то, что необходимо сделать:

<script type="text/javascript">
    var latlng1 = new Array( );
</script>
<script type="text/javascript">
    <%
        do until rs.eof
            %>
            latlng1.push( new GLatLng( parseFloat( '<%= rs( "Lat" ) %>' ), parseFloat( '<%= rs( "Lng" ) %>' ) ) );
            <%
            rs.movenext
        loop
    %>
</script>

Я отправил статью в: http://salman-w.blogspot.com/2009/03/zoom-to-fit-all-markers-polylines-or.html

21
ответ дан 3 December 2019 в 15:36
поделиться

Необходимо будет создать новое GMarker для каждого места Вы хотите отметить на карте. Существует довольно хорошая документация, доступная здесь для GMarkers.

Создать a GMarker, Вы будете видеть из документации, что сначала необходимо создать a GLatLng при представлении местоположения Вы хотите отбросить маркер. Вы не упомянули, что желали любое содержание в воздушном шаре, таким образом, я предполагаю, что это - просто маркер, который Вы после. В Вашем случае вероятно, выглядел бы примерно так код:

var markerCoords = [
    new GLatLng(<latitude>, <longitude>),
    new GLatLng(<latitude>, <longitude>),
    [...]
];

for (coord in markerCoords){
    map.addOverlay(new GMarker(coord));
};

Я уверен, что можно, вероятно, сказать точно, что продолжается здесь, но на всякий случай, я создаю массив GLatLng объекты (это может иметь любую длину [в границах ха-ха]), и затем выполняют итерации по ней, добавляя маркеры к карте для каждого GLatLng определенный в массиве.

Если Вы будете планированием создания большого количества маркеров, то Вы, вероятно, найдете полезным использовать менеджера по Маркеру, который ускорит рендеринг большого количества маркеров одновременно (не представляя внеэкранные маркеры и уплотняя экранные, если будет много в одном регионе экрана).

5
ответ дан 3 December 2019 в 15:36
поделиться

obeattie ответил на Ваш довольно хороший вопрос. Но от Вашего примера кода, кажется, что Вы также хотите, чтобы карта масштабировала к области, содержащей маркеры. Чтобы сделать это с несколькими маркерами, можно создать GLatLngBounds, который Вы расширяете для каждого маркера. Можно затем получить центр и масштабирование, которое соответствует для набора маркеров от объекта границ.

var markersBounds = GLatLngBounds(); var coord = null; for (coord in markerCoords){ coord = new GMarker(coord); map.addOverlay(); markersBounds.extend(coord); };

var markersCenter = markersBounds.getCenter();
var markersZoom = G_HYBRID_MAP.getBoundsZoomLevel(markersBounds);

map.setCenter(markersCenter, markersZoom);

Я не на 100% уверен в G_HYBRID_MAP.getBoundsZoomLevel, но если я помню правильно, G_HYBRID_MAP является экземпляром GMapType.

1
ответ дан 3 December 2019 в 15:36
поделиться

У меня что-то вроде этого, но события не работают. Могу ли я добавить слушателей внутри конструктора объекта?

//Localization object onstructor
function Localization(width, height, description, img_source){
    this.point = new GLatLng(width, height);
    this.marker = new GMarker(this.point);
    this.description = description;
    this.img_source = img_source;
    GEvent.addListener(this.marker, "click", function(){marker.openInfoWindowHtml(this.description);});
}

//map localizations to show on map
var localizations = [
    new Localization( 52.9015797, 15.2602200, 'Poznań1', 'eye1' ),
    new Localization( 52.9025797, 15.1602200, 'Poznań2', 'eye2' ),
    new Localization( 52.9035797, 15.2702200, 'Poznań3', 'eye3' ),
    new Localization( 52.9045797, 15.2102200, 'Poznań4', 'eye4' ),
]

var map = new GMap2(document.getElementById("mapa"));
map.setCenter(localizations[3].point, 13);
map.setUIToDefault();


for(i=0; i < localizations.length; i++){
    localization=localizations[i];
    map.addOverlay(localization.marker);
    localization.marker.openInfoWindowHtml(localization.description);
}
1
ответ дан 3 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: