# google maps - API( Autozoom )



## Razr84 (20. Oktober 2008)

Hallo,

ich stehe vor einem Problem.

Es geht darum, das z.B. alle Marker die sich z.B. in einem 30km (Der Wert ist variable) Radius befinden, eingeblendet werden (das geht ohne Probleme, da ich jeden Punkt den ich aus der Datenbank lade nach der Entfernung zum Zentralpunkt abfrage, beträgt dieser mehr wie z.b. 30km, wird der Punkt/Marker gar nicht erst verarbeitet).

Nun hab ich noch das Problem, wie kann ich die Karte selber auf diesen 30km Radius heran zoomen? Hat jemand eine Idee?

Oder anders gefragt, kann ich anhand der Geodaten ausrechnen welche Koordinaten ein Punkt in der x und y Achse hat, der 30km Entfernt liegt?


----------



## Sven Mintel (20. Oktober 2008)

Moin,

also ich hab dich jetzt so verstanden, dass du einen zentralen Ausgangspunkt hast und so weit heranzommen willst, das alles in 30km Entfernung davon sichtbar ist. Korrekt?

Falls ja...da bräuchtest du doch keine Koordinaten von den umliegenden Markern, 30km sind und bleiben 30km....der benötigte Zoomlevel sollte bei gleichbleibender Kartengrösse immer derselbe sein.


----------



## Razr84 (21. Oktober 2008)

Ja richtig.
Nehmen wir an, wir haben in der API das Zoom-Level 16 angegeben.
Was weiß ich wieviel km dieser Level abdeckt. Mein Chef meinte auf jeden Fall, das wenn man z.B. die Auswahl auf 40, 50, 60km aktiviert, die Karte auch genau nur diesen Bereich anzeigen soll, sprich man müsste das Zoom-Level abändern.

Gedacht habe ich mir das so, das man z.B. vom Zentralpunkt aus die jeweilige km Zahl in x und y gehen könnte (Nur wüsste ich nicht, wie ich die jeweilige km Zahl zu den Geokoordinaten hinzu addieren könnte) und mit einer Funktion der API (Leider ist mir der Name entfallen) dann automatisch den Zoomwert auswählt, damit der Bereich der um die jeweiligen km erweitert wurde, angezeigt wird.

mhh ich hoffe mal das ich das nun nicht zu umständlich erklärt habe...


----------



## Sven Mintel (21. Oktober 2008)

Irgendwie scheint es da nichts Passendes in der API zu geben 

Ich hab da mal was vorbereitet, es macht zwar etwas Anderes, als du brauchst, aber im Grunde genau das, was du brauchst 

Es ermittelt alle Marker der Karte und berechnet deren Zentrum und den benötigten Zoomfaktor, um alle Marker auf der Karte sichtbar zu Haben.


```
GMap2.prototype.DMautoZoom=function()
{
  var rects={'minLng':999,'minLat':999,'maxLng':-999,'maxLat':-999}
  
  for ( var i = 0; i < this.rb.length; i++ ) 
  { 
    rects={
            'minLng':Math.min(rects.minLng,this.rb[i].Z.x),
            'minLat':Math.min(rects.minLat,this.rb[i].Z.y),
            'maxLng':Math.max(rects.maxLng,this.rb[i].Z.x),
            'maxLat':Math.max(rects.maxLat,this.rb[i].Z.y)
          }
    
  }
  
  var rect=new GLatLngBounds(
                  new GLatLng(rects.minLat,rects.minLng ),
                  new GLatLng(rects.maxLat,rects.maxLng )
                );

  this.setCenter(
                  rect.getCenter(),
                  this.getBoundsZoomLevel(rect)
                );
}
```

GMap2 wird damit um die Methode "DMautoZoom()" erweitert...du musst also nur diese Methode, wann immer du zoomen willst, auf dein Map-Objekt anwenden, fertsch.


----------



## Razr84 (27. Oktober 2008)

Sven Mintel hat gesagt.:


> Irgendwie scheint es da nichts Passendes in der API zu geben
> 
> Ich hab da mal was vorbereitet, es macht zwar etwas Anderes, als du brauchst, aber im Grunde genau das, was du brauchst
> 
> ...



Vielen Dank an dieser Stelle.

Aber leider funktioniert diese Funktion nicht.
Ich erhalte diese Fehlermeldung bzw. diesen Scriptfehler (Firefox Fehlerkonsole):



> Fehler: this.rb has no properties



Langsam verzweifel ich da dran.


----------



## Sven Mintel (28. Oktober 2008)

Ich schwöre bei meiner Bierdeckelsammlung, dass es zu dem Zeitpunkt, wo ich es gepostet habe, ging 

Anscheinend ändert Google die Skripte öfters als man denkt...dieses rb ist wirklich verschwunden und heisst jetzt *ub* 

Ändere folgende Passage mal dahingehend, dass du alle Vorkommen von *rb* durch *ub* ersetzt.
	
	
	



```
for ( var i = 0; i < this.ub.length; i++ ) 
  { 
    rects={
            'minLng':Math.min(rects.minLng,this.ub[i].aa.x),
            'minLat':Math.min(rects.minLat,this.ub[i].aa.y),
            'maxLng':Math.max(rects.maxLng,this.ub[i].aa.x),
            'maxLat':Math.max(rects.maxLat,this.ub[i].aa.y)
          }
    
  }
```


----------



## Razr84 (28. Oktober 2008)

Öhm, ja toll.

Warum haben die das bitte geändert?
Und darf ich Neugierig sein und fragen woher du das nun weißt, das die von google den Variablen Namen von rb auf ub geändert haben? =)

Auf jeden Fall ein großes Danke. Es funktioniert wieder. 

Nun verbleibe ich mit einer weiteren Frage, kann ich irgendwie mit einem "Kreis" einen Bereich mit einem bestimmten Radius kennzeichnen?

Ich hatte da zwar mal was gefunden gehabt, aber das funktionierte nicht.


----------



## Sven Mintel (28. Oktober 2008)

Keine Ahnung, warum die das geändert haben.
Wissen tu ich es, weil ich bei Firebug geschaut habe, wo sie hin ist.

Was den Kreis betrifft, hier gibts was: http://econym.org.uk/gmap/eshapes.htm

Habs grad probiert, es funktioniert


----------



## Razr84 (28. Oktober 2008)

Hallo =)

dieses habe ich eben auch getestet und in Firefox 2 lief das Wunderbar und es funktionierte.
Hab das ganze dann mit dem Firefox 3 getestet und der Kreis war nicht mehr zu sehen... 

Hast du vielleicht einen Verdacht, woran das nun wieder liegen könnte?


----------



## Razr84 (28. Oktober 2008)

*sich an den Kopf fasst*
Ok, es geht jetzt... 

Nun darf ich das noch mit dem autozoom so versuchen, das auch der Kreis direkt zu sehen ist.


----------



## kroesi (30. Oktober 2008)

Hi !

Also die Maps-API besitzt eine Methode, welche dir zu einer Bounding-Box ein passenden Zoomlevel zurückgibt :


```
GMap2.getBoundsZoomLevel(bounds)
```

Du berechnest also einfach die Bounding-Box deiner Marker bzw. deines Kreises und übergibst diese der o.g. Methode und erhälst einen Zoomlevel auf den du dann zoomen kannst.

Im übrigen empfiehlt es sich immer, eine feste API-Version anzugeben ( statt 2.x z.B. 2.10), damit dein Code auch morgen noch läuft. Hab da witzige Erfahrungen machen müssen !

Eine sehr, sehr gute Änderungsliste der Versionen findest du hier :

http://mapki.com/wiki/Changelog

Ich hoffe das hilft dir ein wenig weiter !

Krösi


----------



## Sven Mintel (30. Oktober 2008)

Hi Krösi,

diese Methode verwende ich in meinem Code ja auch:

```
this.setCenter(
                  rect.getCenter(),
                  this.getBoundsZoomLevel(rect)
                );
```

...bloss wurde das Objekt, welches mir die bounds liefert, umbenannt.


----------



## kroesi (30. Oktober 2008)

Hi Sven,

sorry, das hatte ich übersehen ...

Du iterierst also über alle Marker und ermittelst die gesamte Boundig-Box, jetzt ist mir auch dein Code klar geworden.

Wenn die Marker-Koordinaten jedoch serverseitig aus einer Datenbank gelesen werden, dann könnte ich ja die Bounding-Box auch schon serverseitig ermitteln (entlastet den Client) oder auf dem Client beim Hinzufügen der Marker. Dadurch würde ich mir den Aufruf von obfuskierten Methoden oder Eigenschaften ersparen und wäre unabhängig von der API-Version. 
Aber im Prinzip hast du das Problem ja bereits gelöst. Ich muss mir mehr Mühe geben beim Lesen der Posts !

Krösi


----------



## Sven Mintel (30. Oktober 2008)

Jo, da hast du natürlich recht...wenn die Marker von vornherein bekannt sind, braucht man das nicht 

Ich wollte die Funktion allerdings etwas universeller einsetzbar gestalten, so können bspw. auch vom User gesetzte Marker beim Zoomen berücksichtigt werden.(Wobei ich das noch garnicht getestet habe :-( )


----------

