2012-04-18 16 views
6

Estoy usando Bing Maps con Ajax y tengo alrededor de 80,000 ubicaciones para colocar chinchetas. El objetivo de esta función es permitir que un usuario busque restaurantes en Louisiana y hacer clic en la chincheta para ver la información de inspección de salud.Cómo manejar un gran número de marcadores en Bing Maps

Obviamente no hace mucho bien tener 80,000 pines en el mapa a la vez, pero estoy luchando para encontrar la mejor solución a este problema. Otro problema es que la distancia entre estos lugares es muy pequeña (todos los 80,000 están en Louisiana). Sé que podría usar la agrupación para no saturar el mapa, pero parece que eso aún causaría problemas de rendimiento.

Lo que estoy tratando de hacer es simplemente no mostrar ningún pines hasta un cierto nivel de zoom y luego solo mostrar los pines dentro de la vista actual. La forma en que estoy tratando de hacerlo es mediante el uso del evento viewchangeend para encontrar el nivel de zoom y los límites del mapa y luego consultar la base de datos (a través de un servicio web) para cualquier punto en ese rango.

Parece que voy por el camino equivocado. ¿Hay una mejor manera de administrar esta gran cantidad de datos? ¿Sería mejor tratar de cargar todos los puntos inicialmente y luego tener los datos a mano sin tener que acceder a mi servicio web cada vez que se mueve el mapa? Si es así, ¿cómo lo haré?

No he podido encontrar respuestas a mis preguntas, lo que generalmente significa que estoy haciendo las preguntas incorrectas. Si alguien pudiera ayudarme a resolver la pregunta correcta, sería muy apreciado.

+0

Si está intentando visualizar muchos puntos de datos, quizás los marcadores no sean la mejor manera de hacerlo. ¿Has pensado utilizar un mapa de calor en su lugar? –

+0

¡Gracias por el comentario! No había pensado en eso, pero después de verificarlo, no creo que funcione para mi escenario porque los usuarios necesitan poder seleccionar una ubicación individual y ser llevado a una página de información para esa ubicación. Editaré mi pregunta para que quede más claro. – Justin

Respuesta

9

Bueno, he implementado un enfoque ligeramente diferente a esto. Fue solo un ejercicio divertido, pero estoy mostrando todos mis datos (unos 140,000 puntos) en Bing Maps usando el lienzo HTML5.

Anteriormente cargaba todos los datos al cliente. Luego, optimicé tanto el proceso de dibujo que lo adjunté al evento "Viewchange" (que se dispara todo el tiempo durante el proceso de cambio de vista).

He escrito sobre esto. Puede verificarlo here.

Mi ejemplo no tiene interacción, pero podría hacerse fácilmente (debería ser un buen tema para una publicación de blog). Por lo tanto, tendría que manejar los eventos manualmente y buscar los puntos correspondientes usted mismo o, si la cantidad de puntos para dibujar y/o el nivel de zoom estaba por debajo de algún umbral, mostrar los marcadores comunes.


De todos modos, otra opción, si usted no está restringido a Bing Maps, es el uso de la talla de Leaflet. Le permite crear una capa de lienzo que es una capa basada en mosaico pero que se representa en el lado del cliente utilizando lienzo HTML5. Abre una nueva gama de posibilidades. Compruebe por ejemplo this mapa en GisCloud.


Otra opción más, aunque más adecuada para datos estáticos, es utilizar una técnica llamada UTFGrid. Los muchachos que lo desarrollaron ciertamente pueden mejorarlo, pero se escala para tantos puntos como desees con un rendimiento fenomenal. Consiste en tener una capa de mosaico con su información y un archivo json acompañante con algo así como un archivo "ascii-art" que describe las características de los mosaicos. Luego, utilizando una biblioteca llamada wax, proporciona eventos completos con el mouse sobre el mouse, sin ningún impacto en el rendimiento.

También tengo blogged al respecto.

+0

Interesante concepto, en realidad he hecho algo muy similar para una aplicación de mapeo de tejado, donde el lienzo se usa para mostrar dimensiones detalladas (líneas de estilo, ángulos, etc.) en la parte superior del mapa. Sin embargo, el problema con este enfoque es que el elemento canvas ahora recibe todos los eventos de puntero que solían ir al mapa. Los eventos pointer de propiedad css no estándar: ninguno puede resolver esto, pero no es compatible con algunos navegadores, especialmente IE. Tratar de pasar los eventos manualmente en javascript simplemente parece un desastre. Me interesaría saber si conoces una forma de resolver esto. –

+0

En realidad, los eventos van al mapa directamente. ¿Has visto el video que he mostrado? Todos los zoom y paneles son manejados directamente por Bing Maps. – psousa

+0

Ahh veo lo que estás haciendo. Insertó el lienzo en el mapa div mismo mientras lo colocaba encima del mapa div. Sin embargo, incluso con su enfoque, el lienzo seguirá estando encima de otros elementos del mapa, como los marcadores que uno podría agregar posteriormente. Supongo que uno podría hacer algo inteligente, como tratar de insertar el lienzo en la parte superior de los mosaicos del mapa, pero debajo de los otros elementos del mapa, como marcadores o formas, pero eso suena como un dolor para implementar correctamente. De todos modos +1;) –

3

Creo que la agrupación sería su mejor opción si puede salirse con la suya. ¿Dice que intentó usar la agrupación pero aún así causó problemas de rendimiento? Fui a probarlo con 80000 puntos de datos en el V7 Interactive SDK y parece funcionar bien. Probar por ti mismo yendo al enlace y cambiar la línea en la ficha Load module - clustering:

TestDataGenerator.GenerateData(100,dataCallback); 

a

TestDataGenerator.GenerateData(80000,dataCallback); 

después haga clic en el botón Run. El rendimiento me parece aceptable con tantos puntos de datos.

+0

Para ser sincero, no había probado eso. No solo estaba preocupado por el rendimiento de dibujarlo en el mapa, sino también al acceder al servicio web y cargar desde la base de datos. Estaba pensando que estaba abordando el problema de la manera equivocada, pero en realidad podría funcionar. ¡Gracias por la ayuda! (Soy nuevo aquí y aún no tengo 15 puntos de reputación, así que no puedo +1 tu respuesta ... Lo siento). – Justin

Cuestiones relacionadas