Ich erwäge verschiedene Architekturen für ein System, das idealerweise clientseitiges Rendering für Punktmerkmale verwendet und Plug-in-frei sein muss. Ich habe diese Anwendung verwendet, die als Antwort auf diese Frage entwickelt wurde , um meinen Laptop (der durchaus fähig ist - Quad-Core 2,6-GHz-CPU, 4-Gbit-Speicher, keine andere Last, Firefox 8) mit einer anderen Punktanzahl in OpenLayers und zu testen es liegt merklich hinter 500 zurück und fängt an, über 1.000 zu kämpfen. Die zufällig generierten Features scheinen keine Event-Handler zu haben und verwenden alle dieselbe Symbologie.
Ich erwarte, dass bis zu 1.000 Features mit bis zu 10 verschiedenen Symbolen auf weniger leistungsfähigen Plattformen angezeigt werden.
Ich hatte auf eine bessere Leistung auf der Clientseite gehofft, insbesondere nachdem ich dieses Beispiel für die GIS-Cloud gesehen hatte. Ich weiß, dass es anders funktioniert (HTML5-Canvas vs. SVG), aber der Unterschied in der Leistung ist wirklich bemerkenswert.
Meine wichtigsten Fragen (wenn Sie so nett wären) sind:
- Ist die zufällige Punkterzeugungsanwendung repräsentativ für die Leistung in anderen OpenLayers-Anwendungen, die Sie geschrieben / verwendet haben?
- Gibt es eine bewährte und kostenlose alternative Web-Mapping-API, die WMS-Dienste unterstützt (die ich verwenden muss) und die mit clientseitigen Funktionen schneller ist, ohne Flash / Silverlight / andere Plugins zu verwenden?
- Irgendwelche anderen Vorschläge, was ich untersuchen soll?
Es ist eine Option, sich in erster Linie auf das serverseitige Rendern zu verlassen, aber sowohl ich als auch der Client möchten dies vermeiden, da Bedenken hinsichtlich der Vergrößerung der Benutzeranzahl und der Reaktionsfähigkeit der Benutzeroberfläche bestehen.
Antworten:
Die Antwort auf die erste Frage lautet Ja . Sie verwenden OL mit einer weit verbreiteten Konfiguration. Es gibt Tricks, mit denen Sie die Leistung verbessern können. Darauf komme ich später zurück.
Antwort auf Frage 2 ist vielleicht (vor allem in Bezug auf die Echtheit). Sie können auf dieser Website nach einer Liste von Alternativen suchen (eine, die Ihnen gerade einfällt, ist die Broschüre ).
Antwort auf Frage 3: Beginnen Sie mit dem Messen:
Ich habe eine lokale Kopie der App bearbeitet, sodass der Renderer in der Optionsliste für die Vektorebene explizit angegeben wird. Während der Tests würde ich den Canvas-Renderer weglassen und dann die Seite des Experiments mit einem anderen neu laden:
Ich habe der Redraw-Funktion einen Timer hinzugefügt, der ausgibt, wie viel Zeit für das Zeichnen aufgewendet wurde :
Danach habe ich mehrere Läufe auf Chrome 17 und Firefox 8.0.1 unter OSX SL versucht, wobei ich 1000 und 5000 Funktionen gezeichnet habe. Zu meiner Überraschung ist der SVG-Renderer im Durchschnitt 20% schneller als der Canvas-Renderer! (Hinweis: Unter Windows ist die Zeit nicht so genau wie unter OSX, sodass die Ergebnisse möglicherweise weniger konsistent sind.)
Dies und dein Erzählen
Laut IMHO befindet sich der Hotspot im Vector-Handling von Features. Während ich an einer App von mir arbeitete, habe ich sie mir kürzlich angesehen und beschlossen, sie in Unterklassen einzuteilen und sie dann von all dem komplizierten Code zu befreien, der für einfache Punkte nicht von Nutzen ist. Zugegeben, ich bin ziemlich wild geworden und habe sogar die Abhängigkeit von OpenLayers.Geometry.Point entfernt, und meine Version funktioniert jetzt auf einfachen js-Objekten mit x, y-Attributen.
Ihre Optionen sind in absteigender Reihenfolge von Nutzen / Kosten:
Die erste Option besteht darin , die sichtbaren Punkte serverseitig zu filtern, indem Sie eine Strategieoption für die Vektorebene konfigurieren, wie die folgende:
Auf diese Weise wird die Anzahl der auf der Client-Seite gezeichneten Features auf die in diesem Umfang sichtbaren beschränkt, anstatt auf alle.
Als zweite Option können Sie einen benutzerdefinierten Vektor / Renderer erstellen . Ein Beispiel für einen individuellen, abgespeckte, schnellere Implementierung ist auf meiner Seite Github verfügbar hier . Obwohl nicht für alle Verwendungszwecke geeignet, sollte es ausreichen, eine ungefähre Vorstellung davon zu geben, was ich vorschlage.
Die dritte Option für den Fall, dass der Benutzer vollständig verkleinert ist, besteht darin, eine Art serverseitiges Clustering von Features zu implementieren, sodass enge Punkte zu einem einzigen zusammengefasst werden, wodurch wiederum die Anzahl der gezogenen Features verringert wird.
quelle
Mit UTFGrid und TileMill können Sie unbegrenzt viele Punkte mit ziemlich guter Leistung anzeigen. Die Anzeige von n zufälligen Punkten ist ein ausgefallenes Beispiel, das in dieser Situation oder mit GISCloud oder einer ähnlichen Magie nicht funktioniert - da Vektor-Performance-Hacks normalerweise Kenntnisse über den gesamten Datensatz und eine gewisse Vorverarbeitung erfordern: TileMill und GISCloud tun dies viel fliesen.
quelle