I am designing a web page that will be accessed by 10-20 users simultaneously, with the following requirements:

  • Display Google map data as the base layer (higher quality street information in our area of interest than OSM)
  • Display ~30 pre-existing KMLs, each toggleable for display by the user. These contain markers, lines, and polygons.
  • Perform filtering based upon KML meta-data (i.e. color of a feature)
  • Allow user to specify a polygon
  • Perform filtering based upon polygons (both user specified and pre-existing, i.e. counties)
  • Export filtered results to a new KML file.

An example usage would be: User selects two of the 30 KML layers (i.e. view only bridges and dams, not hospitals), and displays these on the map. User filters these features by a single county (pre-defined polygon). User further filters the data with a user-defined polygon. User 'exports' filtered data: filtered data is added to a (versioned) KML, which aggregates all user-filtered data and (the latest version of which) is hosted for download.

I have built a prototype using OpenLayers (2.13.1), but the performance when rendering 1000+ (but generally less than 5000) features is unacceptable. I am currently exploring the use of OpenLayers 3, but it does not support a Google Maps layer, which is fairly important to this project (again, due to quality of data vs OSM in the area of interest).

I have also built a prototype using fusiontables and the GMaps API, which was able to render the data with excellent performance - however I have not been successful at filtering the data. The fusiontablelayer API provides a single ST_INTERSECTS clause as part of an SQL query, but I would need to call this once per marker, per geographic filter, equating to ~300,000 GET requests... [If there is another way to perform this filtering using the fusiontable/GMaps API that I've overlooked, please let me know!]

Finally, in a small test, I have converted KML to GeoJSON, filtered the data against another polygon defined in GeoJSON using a javascript library, and converted the results back to KML format - but with no map rendering throughout the process. Ultimately I need my users to be able to select and filter data visually on a map, not programmatically.

So far everything has been done client-side (except the various google API calls) in javascript. Other than basic web/sql servers, I do not have any experience with a GIS-specific server solution. I'm starting to think a server-based approach will be necessary to display the volume of markers and vector data I need. A client-side approach seems simpler but may not be feasible.

So, the question boils down to: Can this be done client-side (to include clientside + existing 3rd party server API)? If not, and a server-based approach could fulfill these requirements, what do you recommend?

I should mention - I'd like to keep this project free, but am willing to spend up to 200 dollars if necessary. I currently have a shared hosting web server (hostgator) and domain I can use for the project, not to mention a local web server for development. I am an experienced Java and C# programmer, and am familiar enough with javascript and SQL to be dangerous (mostly to myself).

Recommendations or not, thanks for your time reading this!

  • Long text, bfishman – but please allow the question: Are you looking for a ready-to-use solution – or rather some kind of "how could that be done"? The latter is off-topic here, as is your "Can this be done client-side": SR is about recommending software for specific needs, not for giving "general advice". – Izzy Mar 11 '15 at 11:56
  • Ah, my mistake. I am looking for a set of frameworks and possibly server applications , not a single ready-made solution. Feel free to flag this for deletion, I will ask elsewhere. – bfishman Mar 12 '15 at 15:51
  • If you feel you cannot edit your question in a way we can answer it – feel free to delete it yourself. Or split it up, asking for (some of) the components separately :) – Izzy Mar 12 '15 at 16:39

Browse other questions tagged or ask your own question.