[OSM-Devserver] Lösungsansatz Markerkarte

Jochen Topf jochen at remote.org
Sa Okt 9 10:08:12 CEST 2010


On Fri, Oct 08, 2010 at 10:26:12PM +0200, Alexander Matheisen wrote:
> Wie schaffe ich es, eine BBox zu bekommen für eine gegebene Position,
> sodass die Bbox auf der Karte einem Bereich mit einer bestimmten Anzahl
> Pixel um die Position entspricht?
> 
> Ich will nämlich abfragen, wo der Nutzer auf der Karte auf ein Symbol
> geklickt hat, die Bbox mit einer bestimmten Anzahl Pixel dient dazu,
> dass der Nutzer irgendwo auf das Icon klicken kann und nicht in die
> Mitte.

Also so ganz "scharf" muss das ja eh nicht sein, weil Icons verschiedene Größen
haben usw. Wenn jetzt jemand einen Punkt anklickt, dann bekommst Du vom
OpenLayers ja die Geo-Koordinaten dieses Punktes. Dann kannste einfach je nach
Zoom-Level da ein bisserl was auf die Koordinaten draufaddieren bzw. abziehen
und schon hast Du eine bbox. Das wäre die pragmatische Lösung.

> Hintergrund: Ich entwerfe zur Zeit eine Testversion von OLM, wo man alle
> Marker anklicken kann, aber durch die vielen Marker ist OpenLayers dann
> unbenutzbar. Daher soll gar kein Layer angezeigt werden, sondern der
> Nutzer soll auf die Karte klicken, anhand der BBox (die Pixel sind dann
> eben dazu da, dass der Nutzer irgendwo auf ein Kartenicon klicken kann)
> soll eine DB-Abfrage gemacht, und somit das Objekt herausgefunden werden
> (hoffentlich für den Bereich immer nur eins), was er angeklickt hat.
> Damit kann dann an der Stelle ein Popup erstellt werden.

Du kannst nicht davon ausgehen, dass da nur ein Objekt hinter ist. Musst halt
in dem Popup ggf. mehrere anzeigen.

> Gibt es vielleicht bessere Lösungen für mein Problem? Und ist die Lösung
> auch noch der DB zumutbar? Ich bin da nicht so der Spezialist, aber es
> wird wahrscheinlich ziemlich belastend für die DB sein, wenn bei jedem
> Klick des Nutzers eine Abfrage nach BBox (wenn auch nur eine winzige)
> gemacht werden muss?

Willst Du auf die zentrale OSM-Datenbank gehen? Das ist nicht so geschickt.
Hängt ein bischen davon ab, wieviele Benutzer Du hast, aber eigentlich sollte
man die schonen, wo es geht. Geschickter wäre, Du hast ne eigene Datenbank.

Es gibt noch ein paar andere Ansätze: Fred hat ja schon den Ansatz mit der
neuen Mapnik-Erweiterung genannt. Eine Option ist es auch möglicherweise
im OpenLayers einen Vektor-Layer mit "durchsichtigen Icons" darzustellen.
Das Rendering der Objekte ist weiterhin in der Bitmap, aber darüber wird
ein Vektorlayer angelegt, der die Objekte, die einen interessieren, nochmal
enthält. Aber nur als sehr einfache Kästchen, die transparent sind. Dann
kann man sie weiter anklicken, aber sie sind nicht so aufwändig zu zeichnen,
wie komplexe Symbole. Ich hab das mal auf einer Karte gesehn und fand es
eine nette Idee. Aber auch hier dauert es natürlich, die Dinger zu laden usw.
Irgendwo gibts auch da eine Grenze.

Einen ganz anderen Ansatz benutze ich beim OSM Inspector. Dort gibt es eine
Basiskarte mit Tiles plus einen Overlay, der dynammisch vom UMN Mapserver
erzeugt wird und per WMS eingebunden ist. Wenn man jetzt auf die Karte klickt,
wird eine Anfrage an den Server geschickt mit den Pixel-Koordinaten und man
bekommt die Daten hinter diesem Punkt als GML zurück, und die zeige ich dann
rechts oben an. Das WMS-Protokoll und der Mapserver unterstützen das, dass
man so eine Abfrage nach einem Pixel machen kann.

Jochen
-- 
Jochen Topf  jochen at remote.org  http://www.remote.org/jochen/  +49-721-388298