google maps - API( Autozoom )

Razr84

Grünschnabel
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?
 
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.
 
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...
 
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.

Code:
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.
 
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.

Code:
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.

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.
 
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 :eek:

Ändere folgende Passage mal dahingehend, dass du alle Vorkommen von rb durch ub ersetzt.
Code:
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)
          }
    
  }
 
Ö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.
 
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?
 
*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.
 
Zurück