2014-12-15 4 views
13

Ich habe eine dynamisch generierte Liste von Markern in meiner Google Map. Ich möchte, dass das Zentrum der Karte das Zentrum aller Marker ist und nur so weit herausgezoomt ist, dass alle Marker sichtbar sind.Angular Google Maps - automatisch 'Center' und 'Zoom' einstellen, um in alle Marker zu passen

In Bezug auf die Berechnung der Kartenmitte, könnte dies möglicherweise durch Iteration durch alle Breiten und Längen und die Suche nach dem zentralen Punkt möglich sein. Allerdings kann ich nicht herausfinden, wie der Zoom am besten berechnet werden kann.

Ist das möglich?

Meine Karte ist, wie dies in der Vorlage verwendet werden:

<ui-gmap-google-map events="map.events" center="map.center" zoom="map.zoom" draggable="true" options="options"> 
    <ui-gmap-marker ng-repeat="home in filteredHomes = (resCtrl.filteredHomes | orderBy : $storage.params.orderby : $storage.params.reverseOrder)" coords="{latitude: home.location.latitude, longitude: home.location.longitude}" idkey="home.homeId"> 
    </ui-gmap-marker> 
</ui-gmap-google-map> 

UPDATE

Versuchte Angular Implementierung von Beratung von @Tiborg:

uiGmapGoogleMapApi.then(function(maps) { 
    $scope.map = { 
     center: $scope.$storage.params.views.map.location, 
     zoom: $scope.$storage.params.views.map.zoom, 
     events: { 
      click: function() { 
       var bounds = new google.maps.LatLngBounds(); 
       for (var i in $scope.filteredHomes) { 
        bounds.extend($scope.filteredHomes[i].location); 
       } 
       $scope.map.fitBounds(bounds); 
      } 
     } 
    }; 
}); 

Dies erzeugt die Konsolenfehler: TypeError: undefined is not a function (evaluating 'a.lat()')

+0

Es ist schwer zu sagen, was das Problem ist, ohne den Fluss des Programms zu wissen, und das, was jedes Mitglied/Variable enthält. Suchen Sie in den Chatrooms nach mir und starten Sie eine Konversation. Wir diskutieren hier nicht im Kommentarbereich. – Tiborg

+0

Hey Fisu, funktioniert der obige Code automatisch? Warum werden die an ein Click-Ereignis angehängten Grenzen automatisch gesetzt, wenn die Karte auf der Seite angezeigt wird? Neugierig, wenn Sie eine jdfiddle haben, die Sie teilen können, die funktioniert. – armyofda12mnkeys

+0

@armeyofda12mnkeys yeah hast recht, ich habe am Ende die Option 'fit: true' verwendet, die nicht an ein click Event angehängt ist. – Fisu

Antwort

16

Verwenden Sie die LatLngBounds Klasse in Google Maps API, wie folgt aus:

var bounds = new google.maps.LatLngBounds(); 
for (var i in markers) // your marker list here 
    bounds.extend(markers[i].position) // your marker position, must be a LatLng instance 

map.fitBounds(bounds); // map should be your map class 

Es wird schön die Karte zoomen, und in der Mitte alle Markierungen zu passen.

Natürlich ist dies die reine Javascript, nicht die eckige Version, also wenn Sie Probleme haben, es in eckigen zu implementieren (oder Sie haben keinen Zugriff auf die Karteninstanz von wo Sie die Markierungen erhalten), lassen Sie es mich wissen .

+0

Danke. Ich habe Probleme bei der Implementierung in Angular. Ich denke, dass es die 'neuen google.maps ... sein könnte, die die Probleme verursachen.In meiner Angular App geschieht die Kartenfunktionalität hier: 'uiGmapGoogleMapApi.then (function (maps) {...' also ersetze ich 'new google.maps' durch' neue maps'? – Fisu

+0

Hab meine Frage mit deinem Vorschlag aktualisiert Kannst du sehen, was ich noch falsch machen könnte? – Fisu

+1

War die falsche Kartenreferenz. Jetzt funktioniert, danke – Fisu

17

angular-google-maps hat sich dieser Funktion angenommen. Alles, was Sie tun müssen, ist das fit = "true" -Attribut in Ihrer Marker-Direktive (ui-gmap-markers) hinzuzufügen. Beispiel: <ui-gmap-markers models="map.markers" fit="true" icon="'icon'"> Bitte lesen Sie das Dokument http://angular-ui.github.io/angular-google-maps/#!/api

+0

Nicht sicher, dass es völlig hilft.Ich dachte, dass ich das vor ein paar Tagen getestet und ich musste immer noch ein Zentrum auf der UI setzen -gmap-google-map-Direktive (ich setze es so, dass es der Heimatort war), und dann scheint das Fit-Attribut auf ui-gmap-markern aus diesem Zentrum heraus zu zoomen und deckt Orte in der Nähe ab, die eine ziemlich große Entfernung abdecken als ich es erwarten würde), im Gegensatz zu nur Auto-Zentrierung, um alle Punkte zu passen (wie ich nicht unbedingt möchte, dass meine Heimat genau in der Mitte sein) – armyofda12mnkeys

+0

Ich habe Ihren Punkt. Es kann nicht alle Szenarien abdecken, wird aber helfen die meisten gemeinsamen Bedürfnisse.Für spezifische Bedürfnisse wie Sie können mit den nordöstlichen und südwestlichen Eigenschaften der Grenzen spielen. Ich weiß nicht, ob das bei Ihrem Szenario helfen würde. – Hasteq

+0

Ich sehe

6

Die Antwort ist für ein anderes Problem gepostet: https://stackoverflow.com/a/23690559/5095063 Danach müssen Sie nur noch diese Zeile hinzufügen:

$scope.map.control.getGMap().fitBounds(bounds); 
+1

Erinnern sie sich das 'kontrollierende Objekt und initialisieren es richtig einzustellen. – amouly

4

Danke an all die Antworten, habe ich Dieser Code, der perfekt für mich funktioniert:

var bounds = new google.maps.LatLngBounds(); 
for (var i = 0, length = $scope.map.markers.length; i < length; i++) { 
    var marker = $scope.map.markers[i]; 
    bounds.extend(new google.maps.LatLng(marker.latitude, marker.longitude)); 
} 
$scope.map.control.getGMap().fitBounds(bounds); 

Ich hoffe, es wird jemandem helfen.

+1

Hallo, können wir ein funktionierendes plunkr.co Beispiel haben, wo diese Lösung gut funktioniert? Ich habe die Lösung ausprobiert, aber es funktioniert nicht ... – Ravimallya

0

auch verwenden Timeout, um sicherzustellen, ist es verdaut richtig

uiGmapIsReady.promise() 
      .then(function (map_instances) { 
      var bounds = new google.maps.LatLngBounds(); 
      for (var i in $scope.map.markers) { 
       var marker = $scope.map.markers[i]; 
    bounds.extend(new google.maps.LatLng(marker.latitude, marker.longitude)); 
      } 

      $timeout(function() { 
       map_instances[0].map.fitBounds(bounds); 
      }, 100); 
      });