8 votos

30.000 puntos de datos... ¿se pueden servir razonablemente con openlayers?

Estoy tratando de abordar un problema de SIG web y necesito averiguar la mejor estrategia. Tengo un mapa con 30.000 celdas que forman una cuadrícula para la provincia de Alberta. Tengo una lista de puntos de datos para cada celda: unos 50 campos indicadores y valores para cada celda. Por ejemplo, un valor podría ser la población humana, por lo que cada celda tendría un valor de población humana para esa celda. Quiero hacer un mapa interactivo que pueda mostrar esos valores visualmente, ya sea con cuadrados para las celdas, o un tipo de mapa de calor mezclado. Más allá de eso, me gustaría ser capaz de hacer cálculos compuestos en todos los puntos de datos y utilizar esos cálculos para hacer mapas adicionales. Teniendo en cuenta los cálculos, hay aproximadamente 300.000 permutaciones del mapa. Por si fuera poco, también es temporal; hay 16 cortes de tiempo diferentes. Es decir, 16 cortes de tiempo x 300.000 permutaciones.

Mi estrategia hasta ahora:

1) En el lado del servidor, calcular los valores de las celdas dinámicamente en tiempo de ejecución y enviar los valores al cliente (los 30.000). Esto se traduce aproximadamente en un valor por cada cuadrado de 3x3 píxeles en una imagen de 525px x 525px en la pantalla.

2) En el lado del cliente con capas abiertas, utilizar un png de 1px que pueda ser redimensionado y tener el valor alfa ajustado como sea necesario para mostrar el diferente gradiente de color correspondiente al valor de los datos de cada celda. El png se redimensionaría a medida que el mapa se acerque o se aleje. En teoría, se colocarían con precisión para formar una cobertura general del mapa como cuadrados o, si se utiliza el enfoque del mapa de calor, se superpondrían entre sí lo suficiente como para formar una cobertura general.

La pregunta:

¿Es razonable calcular esos valores de las celdas dinámicamente en el servidor y luego enviarlos a una interfaz de OpenLayers en tiempo real? Estoy seguro de que el servidor puede realizar los cálculos, pero ¿puede OpenLayers mostrar razonablemente 30.000 puntos de datos a la vez en un mapa? ¿Es razonable esperar poder crear una cobertura general utilizando datos de puntos? Supongo que estoy tratando de crear el equivalente de un mapa vectorial que tiene 30.000 formas que dan 100% de cobertura del mapa, pero el uso de datos de puntos para simplificar.

Las estrategias alternativas en mi mente son:

a) generar los mapas en tiempo real en el servidor y enviarlos como capas rasterizadas al cliente

b) generar todas las permutaciones por adelantado y almacenarlas en el servidor como mapas rasterizados

¿Alguna idea? ¿Mi enfoque está equivocado y no es el adecuado? ¿Algún consejo sobre un método mejor?

Agradecería cualquier opinión al respecto. Si estáis interesados, incluso podría contratar a un desarrollador para que me ayude.

¡Muchas gracias!

Noah

13voto

Yaakov Ellis Puntos 15470

Esta pregunta se ha formulado varias veces. 30k puntos, directamente, no funcionarán en un mapa OL. O incluso en un mapa Flash/Silverlight.

Números de orden de magnitud aproximados para recordar: 100 puntos en un mapa JS (openlayers), 1.000 puntos en un mapa Flash (por ejemplo, ArcGIS Flash o Silverlight), 10.000 puntos en una aplicación de escritorio (ArcGIS Desktop) son sus niveles de rendimiento finos. Se trata de puntos "reales", no ocultos o falseados como se indica a continuación.

No solo eso, no es muy agradable interactuar con 30k puntos. ¿Cómo puedo acceder a "ese" marcador detrás de otro marcador?

Tienes dos opciones:

1) Crear una trama, como la que mencionas, en el servidor. Servir un servicio WMS y cuando su usuario hace clic / hovers sobre un punto, volver al servidor para los datos

2) Reducir el número de puntos que muestra. Principalmente a través de la agrupación del lado del servidor y también a través del recorte del cuadro delimitador. La agrupación en el lado del cliente está "bien" y es "bonita", pero no le ayudará a partir de los 30.000 puntos. Será lento. Así que usted configura su capa con la estrategia bbox y OL hará llamadas al servidor en pan/zoom para usted, y usted devuelve un nuevo conjunto de datos que es recortado hasta el punto de devolver menos de 100-300 puntos.

6voto

Max Puntos 3140

Desde el punto de vista de la interfaz de usuario y la experiencia del usuario, 30.000 puntos individuales en un mapa no son precisamente la mejor representación de sus datos.

También puede optar por utilizar cuadrículas UTF8 sobre sus datos de puntos rasterizados. Sin embargo, las resoluciones de la cuadrícula y la cantidad de puntos harán que la selección de datos sea muy impredecible y no sea la mejor experiencia de usuario. http://mapbox.com/developers/utfgrid/

Sería interesante una combinación de clusters OL con cuadrículas UTF8. Esto puede hacerse mediante una agrupación de datos del tamaño de un servidor que devuelva clusters rasterizados que luego puedan ser seleccionados mediante el uso de Grids UTF8. Su opción de manipulación más allá de este punto podría ser ampliar más (como en los métodos clásicos de clustering vectorial del lado del cliente como en OL). También puede querer procesar algunos datos, como calcular el valor promedio dentro de ese cluster y presentarlo al usuario.

2voto

Strelok Puntos 18453

Como ya se ha mencionado 30.000 características a través de OL es una muy mala idea. He logrado 10.000 puntos utilizando la representación de lienzo en Chrome y que funcionó bien, pero el cambio a un marcador gráfico (.png) causó que se arrastre.

Sólo quería dar una sugerencia para su enfoque del lado del servidor. Obviamente no puedes pregenerar todas las 300.000 permutaciones de antemano, y tu ámbito de aplicación va a crecer eventualmente. Si quieres usar un WMS con SLD puedes usar el siguiente enfoque para generar cualquier mapa.

El cliente (por ejemplo, OpenLayers) realiza una solicitud de imagen WMS al servidor. La URL de la solicitud incluye un parámetro ...&SLD=http://app-server/sld?time=2010&measure=population... - aquí el parámetro SLD es una URL (que tendría que ser codificada como URL) para generar un SLD sobre la marcha. Cuando el servidor WMS recibe su solicitud, consulta a su servidor de aplicaciones para obtener un SLD único y obtiene una respuesta XML. A continuación, genera la permutación solicitada por el usuario.

He hecho esto con GeoServer para WMS y PHP generando SLDs y el rendimiento estaba bien (pero entonces no tenía ninguna razón por la que no debería ser, su situación podría ser diferente).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X