سؤال

لقد قمت مؤخرًا بالتبديل إلى Google Maps API V3.أنا أعمل على مثال بسيط يرسم العلامات من مصفوفة، لكنني لا أعرف كيفية التوسيط والتكبير/التصغير تلقائيًا فيما يتعلق بالعلامات.

لقد بحثت في الإنترنت بشكل كبير ومنخفض، بما في ذلك وثائق Google الخاصة، ولكن لم أجد إجابة واضحة.أعلم أنه يمكنني ببساطة الحصول على متوسط ​​الإحداثيات، ولكن كيف يمكنني ضبط التكبير/التصغير وفقًا لذلك؟

function initialize() {
  var myOptions = {
    zoom: 10,
    center: new google.maps.LatLng(-33.9, 151.2),


    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);

  setMarkers(map, beaches);
}


var beaches = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.423036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 121.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.450198, 151.259302, 1]
];

function setMarkers(map, locations) {

  var image = new google.maps.MarkerImage('images/beachflag.png',
      new google.maps.Size(20, 32),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));
    var shadow = new google.maps.MarkerImage('images/beachflag_shadow.png',

      new google.maps.Size(37, 32),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));


      var lat = map.getCenter().lat(); 
      var lng = map.getCenter().lng();      


  var shape = {
      coord: [1, 1, 1, 20, 18, 20, 18 , 1],
      type: 'poly'
  };
  for (var i = 0; i < locations.length; i++) {
    var beach = locations[i];
    var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
    var marker = new google.maps.Marker({
        position: myLatLng,
        map: map,
        shadow: shadow,
        icon: image,
        shape: shape,
        title: beach[0],
        zIndex: beach[3]
    });
  }
}
هل كانت مفيدة؟

المحلول 2

لقد تم فرز كل شيء - راجع الأسطر القليلة الأخيرة للحصول على الكود - (bounds.extend(myLatLng); map.fitBounds(bounds);)

function initialize() {
  var myOptions = {
    zoom: 10,
    center: new google.maps.LatLng(0, 0),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(
    document.getElementById("map_canvas"),
    myOptions);
  setMarkers(map, beaches);
}

var beaches = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 161.259052, 5],
  ['Cronulla Beach', -36.028249, 153.157507, 3],
  ['Manly Beach', -31.80010128657071, 151.38747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.159302, 1]
];

function setMarkers(map, locations) {
  var image = new google.maps.MarkerImage('images/beachflag.png',
    new google.maps.Size(20, 32),
    new google.maps.Point(0,0),
    new google.maps.Point(0, 32));
  var shadow = new google.maps.MarkerImage('images/beachflag_shadow.png',
    new google.maps.Size(37, 32),
    new google.maps.Point(0,0),
    new google.maps.Point(0, 32));
  var shape = {
    coord: [1, 1, 1, 20, 18, 20, 18 , 1],
    type: 'poly'
  };
  var bounds = new google.maps.LatLngBounds();
  for (var i = 0; i < locations.length; i++) {
    var beach = locations[i];
    var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
    var marker = new google.maps.Marker({
      position: myLatLng,
      map: map,
      shadow: shadow,
      icon: image,
      shape: shape,
      title: beach[0],
      zIndex: beach[3]
    });
    bounds.extend(myLatLng);
  }
  map.fitBounds(bounds);
}

نصائح أخرى

نعم، ما عليك سوى الإعلان عن كائن الحدود الجديد الخاص بك.

 var bounds = new google.maps.LatLngBounds();

ثم لكل علامة، قم بتوسيع كائن الحدود الخاص بك:

bounds.extend(myLatLng);
map.fitBounds(bounds);

واجهة برمجة التطبيقات: google.maps.LatLngBounds

سيكون اقتراحي لـ google Maps api v3 هو (لا أعتقد أنه يمكن القيام به بشكل أكثر كفاءة):

gmap : {
    fitBounds: function(bounds, mapId)
    {
        //incoming: bounds - bounds object/array; mapid - map id if it was initialized in global variable before "var maps = [];"
        if (bounds==null) return false;
        maps[mapId].fitBounds(bounds);
    }
}

في النتيجة سوف تناسب جميع النقاط في الحدود في نافذة الخريطة الخاصة بك.

المثال يعمل بشكل مثالي ويمكنك التحقق منه بحرية هنا www.zemelapis.lt

تعتبر الإجابات مثالية لضبط حدود الخريطة للعلامات، ولكن إذا كنت ترغب في توسيع حدود خرائط Google لأشكال مثل المضلعات والدوائر، فيمكنك استخدام الرموز التالية:

للدوائر

bounds.union(circle.getBounds());

للمضلعات

polygon.getPaths().forEach(function(path, index)
{
    var points = path.getArray();
    for(var p in points) bounds.extend(points[p]);
});

للمستطيلات

bounds.union(overlay.getBounds());

للخطوط المتعددة

var path = polyline.getPath();

var slat, blat = path.getAt(0).lat();
var slng, blng = path.getAt(0).lng();

for(var i = 1; i < path.getLength(); i++)
{
    var e = path.getAt(i);
    slat = ((slat < e.lat()) ? slat : e.lat());
    blat = ((blat > e.lat()) ? blat : e.lat());
    slng = ((slng < e.lng()) ? slng : e.lng());
    blng = ((blng > e.lng()) ? blng : e.lng());
}

bounds.extend(new google.maps.LatLng(slat, slng));
bounds.extend(new google.maps.LatLng(blat, blng));

لا تزال طريقة setCenter() قابلة للتطبيق على أحدث إصدار من Maps API for Flash حيث لا يوجد fitBounds().

استخدم أقل من واحد،

Map.setCenter(bounds.getCenter(), Map.getBoundsZoomLevel(bounds));

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top