30,000 puntos de datos ... ¿se puede servir esto razonablemente con capas abiertas?

8

Estoy tratando de abordar un problema web de SIG y necesito encontrar 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: alrededor de 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 para la 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 aspecto de mapa de calor combinado. Más allá de eso, me gustaría poder hacer cálculos compuestos en todos los puntos de datos y usar esos cálculos para hacer mapas adicionales. Teniendo en cuenta los cálculos, hay aproximadamente 300,000 permutaciones en el mapa. Para colmo, también es temporal; Hay 16 segmentos de tiempo diferentes.

Mi estrategia hasta ahora:

1) En el lado del servidor, calcule los valores de las celdas dinámicamente en tiempo de ejecución y envíe los valores al cliente (los 30,000 de ellos). Esto se traduce en aproximadamente 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, use un png de 1px que se pueda cambiar de tamaño y ajuste el valor alfa según sea necesario para mostrar los diferentes gradientes de color correspondientes al valor de datos para cada celda. El png se redimensionará a medida que el mapa se acerque o aleje. Teóricamente, se colocarían con precisión para formar una cobertura general del mapa como cuadrados o, de lo contrario, utilizando el enfoque de mapa de calor, se superpondrían entre sí lo suficiente como para formar una cobertura general.

La pregunta:

¿Es razonable calcular esos valores de celda dinámicamente en el servidor y luego enviarlos a una interfaz 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 tenga 30,000 formas que brinden una cobertura total del mapa del 100%, pero usando datos de puntos para simplificarlo.

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 con anticipación y almacenarlas en el servidor como mapas rasterizados

¿Alguna idea? ¿Mi enfoque está lejos y ladrando al árbol equivocado? ¿Algún consejo sobre un mejor método?

¡Seguramente agradecería cualquier idea sobre el tema! Si está interesado, incluso podría estar buscando contratar a un desarrollador para que lo ayude.

¡Muchas gracias!

Noé

Noah Purves-Smith
fuente
Estoy investigando más y podría estar tomando la ruta equivocada total ... ¿qué pasa con el uso de Rendering Transformations con GeoServer ... qué tan rápido podría GeoServer producir una transformación con 30,000 puntos de datos?
Noah Purves-Smith
Use el clúster en Openlayers - ejemplo de flickr dev.openlayers.org/releases/OpenLayers-2.12/examples/…
Mapperz
Gracias por el comentario Mapperz ... desafortunadamente el agrupamiento no resuelve realmente lo que necesitamos.
Noah Purves-Smith

Respuestas:

13

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

Números de magnitud aproximada (¡aproximada!) Para recordar: 100 puntos en un mapa JS (capas abiertas), 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 su excelente rendimiento niveles. Estos son puntos "reales", no ocultos o falsificados como se describe a continuación.

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

Tienes 2 opciones:

1) Crear ráster, como mencionó, en el servidor. Sirva un servicio WMS y cuando su usuario haga clic / pase el mouse sobre un punto, regrese al servidor para obtener los datos

2) Reduzca el número de puntos que muestra. Principalmente a través de la agrupación SERVER-SIDE y también a través del recorte de la caja delimitadora La agrupación del lado del cliente es "aceptable" y "linda", pero no lo ayudará en 30k puntos. Será lento Por lo tanto, configura su capa con la estrategia de bbox y OL realizará llamadas al servidor en pan / zoom para usted, y devolverá un nuevo conjunto de datos que se recortará hasta el punto en que devuelva menos de 100-300 puntos.

Vadim
fuente
¡Golpéame! El número 1 se expande en mi respuesta.
Michael Markieta
Gracias por la respuesta Vadim. No creo haber explicado el problema muy bien, pero también creo que estaba buscando la solución incorrecta. Creo que crear un ráster en el servidor es definitivamente la forma correcta de hacerlo ahora que lo he investigado más a fondo. ¿Puedes decir que soy un novato en esto?
Noah Purves-Smith
@Noah: no hay problema. Estás en el camino correcto :) WMS es la mejor manera de obtener demasiados datos a menos que puedas condensarlos.
Vadim
Buena respuesta. Mi solución fue similar a su sugerencia n. ° 2 y pude admitir un conjunto de datos de un millón de puntos de datos.
cjstehno
6

Desde el punto de vista de UI y UX, 30,000 puntos individuales en un mapa no es exactamente 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 su cuadrícula y la cantidad de puntos definitivamente harán que la selección de datos sea muy impredecible y no la mejor experiencia de usuario. http://mapbox.com/developers/utfgrid/

Sería interesante una combinación de OL Clusters con UTF8 Grids. Esto puede hacerse mediante una agrupación de datos del tamaño del servidor que devuelve clústeres ráster que luego pueden seleccionarse mediante el uso de cuadrículas UTF8. Su elección de manipulación más allá de este punto podría ser ampliar más (como en los métodos clásicos de agrupación de vectores del lado del cliente, como en OL). También es posible que desee procesar algunos datos, como calcular el valor promedio dentro de ese clúster y presentarlo al usuario.

Michael Markieta
fuente
2

Como ya se mencionó 30,000 características a través de OL es una muy mala idea. Logré 10,000 puntos usando el renderizado de lienzo en Chrome y funcionó bien, pero cambiar a un marcador gráfico (.png) hizo que se rastreara.

Solo quería proporcionar una sugerencia para su enfoque del lado del servidor. Obviamente, no puede pregenerar todas las 300,000 permutaciones por adelantado, y su alcance crecerá eventualmente. Si desea usar un WMS con SLD, puede usar el siguiente enfoque para generar cualquier mapa.

El cliente (por ejemplo, OpenLayers) realiza una solicitud de imagen WMS al servidor. La URL para 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 estar codificada en URL) para generar una SLD sobre la marcha. Cuando el servidor WMS recibe su solicitud, consulta a su servidor de aplicaciones un SLD único y obtiene una respuesta XML. Luego genera la permutación que solicite su usuario.

He hecho esto con GeoServer para WMS y PHP que generan SLD y el rendimiento fue bueno (pero no tenía ninguna razón para que no fuera así, su situación podría ser diferente).

tonto
fuente