I have to develop a webapp that will have to display a large number of polygons on a webpage, with complex filtering options. The source data never changes (I will simply reload a new version of the DB every few months).
I will probably use OpenLayers on the client-side. I developed a prototype that drawed the feature as vectors in javascript, but I'd like to switch to server-side rendering for better performance. I could probably do my app connecting directly OpenLayers to a few different WMS layers in GeoServer (postgis backend) with CQL filters, but I have the feeling GeoServer is not very flexible when using a combination of complex filters and dynamic styling of my WMS and the solution could become quite complex.
From the developer point of view, a more confortable/flexible approach seems to use GeoDjango and its spatially-enabled data models to generate a dynamic (content and styling) KML file of my data. A (probably naive) elegant solution would be to integrate WMS rendering (and possibly caching) layer between the OpenLayers client and the GeoDjango app that generates KML output.
The workflow would be:
Openlayers sends user query to "intermediate layer"
This layers forward query to the GeoDjango app, get a KML file and render it as WMS and return it to OpenLayers.
(alternatively, OL could also talk directly to GeoDjango it sould use a middleware to postprocess its KML result before returning it).
As my data almost never changes, I could then benefit from a caching tool such as GeoWebCache between OL and the "rendering layer".
I know Google Maps API do server-side rendering of KML files when they are large, but it's a black box tied to their JS library, and I'd really like to do something similar with OL.
I've done a few searches, but was not able to find any tool for the "intermediate layer". WMS servers such as GeoServer/Mapserver can use a KML data source, but it seems limited to a static file somewhere in the filesystem, and not from a dynamic URL.
Does a tool like this exists or is my approach simply wrong ?