Ich habe eine Reihe von Websites zu Tausenden. Nicht alle Benutzer sehen dieselben Sites auf der Karte - also ACL. Daten werden in einer Nicht-GIS-Datenbank (mssql, ora usw.) gespeichert und jetzt mit einer Standard-SQL-Abfrage abgerufen und mit einer JSP an den Client (OpenLayers) zurückgegeben.
Der aktuelle Code ist bereits optimiert, um clientseitiges Clustering (also weniger Chaos auf dem Client, aber alle Daten sind vorhanden) und Bounding-Box-Abruf (also eine Teilmenge von Daten, die jedoch für jeden auf den Server gehen müssen) durchzuführen Schwenken / Zoomen für neue Daten) und sogar serverseitiges Clustering (um die an den Client gelieferten Daten zu reduzieren).
Stattdessen möchte ich Bilder / Kacheln für alle meine Daten generieren, ähnlich wie Google Maps für alle Ergebnisse Tonnen kleiner roter Punkte anzeigt - http://bit.ly/d73qrw [Google Maps-Suche nach "Kaffee"] und auf dem Client anzeigen. Wenn Sie darauf klicken, rufen Sie schnell einen WMS-Dienst an, um Informationen zu erhalten. Das ist zumindest die Idee.
Aber hier ist das Problem: Ich kann nicht einfach einen Standard-WMS-Dienst vor meinen Daten einrichten, da nicht alle Benutzer dieselben Daten sehen. Gibt es eine Möglichkeit, diese Kacheln im laufenden Betrieb zu generieren oder WMS ACL-fähig zu machen?
edit - 22.09.2010 - Also habe ich herausgefunden, wie Google die Kacheln oder vielmehr die Technologie dahinter generiert. Sie verwenden Google Fusion Tables. Speichern Sie N Zeilen in ihren Tabellen. Wenn die Daten lat / lon-fähig sind, kann das Fusion Table-Produkt die Kacheln im laufenden Betrieb (!) Generieren. Dies ist die Art von Dingen, nach denen ich suche - eine performante Karte mit Tonnen von Daten. Aber natürlich muss es ACL-gesteuert sein. Ist es sinnvoll, eine benutzerdefinierte, leichte Implementierung der WMS-Spezifikation zu schreiben oder ein vorhandenes Produkt zu ändern? Obwohl Geoserver viel zu ändern scheint, um ACL zu unterstützen.
edit - 27.09.2010 - Weitere Informationen seit dem Hinzufügen von Kopfgeld. Meine Daten sind in Oracle. Ora räumlich ist nicht aktiviert. Derzeit werden die Daten auf Unternehmensebene extrahiert und in Daten konvertiert, die an den Client gesendet werden, wo der Client die "Punkte" auf der Karte platziert. ACL wird auf der Ebene der Geschäftslogik ausgeführt, nicht auf DB oder ActivDir oder Ähnlichem. Die Authentifizierung ist einfach, die Autorisierung jedoch nicht und musste daher im Code erfasst werden. Möchten Sie wissen, wie Sie am besten einen WMS-Dienst erstellen, um Tausende von "Punkten" auf der Karte bereitzustellen, auf denen jeder Benutzer eine andere Teilmenge von Punkten sieht. Ist die Antwort ein CQL_FILTER? Aber wie werden dann die Parameter eingestellt? Eine Idee, die ich jetzt habe, ist ein zweistufiger Prozess. Führen Sie zuerst eine interne Abfrage aus, um eine Liste der IDs abzurufen, die der Benutzer sehen darf, und erstellen Sie dann eine WMS-Anforderungszeichenfolge mit diesen IDs im Parameter CQL_FILTER. Gibt es etwas, das diesen Prozess vereinfacht? Und wenn ich damit anfange, wie kann ich diese Schicht als "WMS" -Schicht zu einem Open Layers-Client hinzufügen, da für OL der Endpunkt mein Code zum Abrufen von IDs aus der Datenbank ist, nicht der eigentliche WMS-Dienst auf z. B. GeoServer?
Antworten:
Einige Projekte für GIS-Webservices-ACL
Auf der foss4g 2010 siehe am 09. September, 11:00 Uhr im Abschlussprogramm http://2010.foss4g.org/program_print.php (Präsentationen derzeit nicht verfügbar)
quelle
Ich denke, dass eine übliche Lösung darin besteht, ein Proxy- oder Wrapper-Skript zu erstellen, das sich zwischen dem Client und WMS befindet. Der Proxy wird verwendet, um einen benutzerdefinierten WMS-Aufruf basierend auf Parametern vom Client zu erstellen.
Sie haben nicht erwähnt, ob Ihr Zweck für dieses Setup die Sicherheit oder nur die Anpassung ist oder welche Informationen der Client benötigt, um zu bestimmen, welche benutzerdefinierte "Ansicht" der Daten das WMS erzeugen soll.
Wenn Sie mehr als ein paar hundert Punkte anzeigen, sollten Sie sich an einen bildbasierten Dienst wie WMS halten. Abhängig von Ihren Anforderungen können Sie MapServer auch einfach hinter ein Wrapper-Skript stellen, das benutzerdefinierte Kartenanforderungen basierend auf eindeutigen Filter- oder Ausdrucksparametern erstellt.
quelle
Ich habe eine Antwort, die nach einigem Ausprobieren für uns funktioniert hat.
Oracle Spatial + Oracle VPD macht den Trick. Wir verwenden bereits Ora und VPD, daher war dies der nächste logische Schritt. Ora Spatial verfügt über einen WMS-Dienst und kann je nach ihren Rechten / ACL über VPD für verschiedene Benutzer unterschiedlich angepasst werden. Wenn andere nach so etwas suchen, ist mir klar, dass nicht jede Operation Oracle hat oder sich leisten kann, aber wenn Sie es haben, ist es da drin. Ich weiß nicht, ob MS SQL Server ähnliche Funktionen hat.
quelle
Eine andere Idee (ich bin mir nicht sicher, ob dies wirklich praktisch ist). Was Sie benötigen, ist eine Zuordnung zwischen Benutzerberechtigungen und generierten Zuordnungsdateien. Warum also nicht einen Hash aus der Benutzerberechtigung erstellen und die Kartenkachel / -erweiterung anfordern? Dieser Hash wird einer generierten Kachel zugeordnet. Wenn die Karte nicht vorhanden ist, muss sie offensichtlich generiert werden, andernfalls kann sie aus dem Kartencache abgerufen werden. Natürlich bringt dieser Ansatz keine Vorteile, wenn jeder Benutzer einen völlig anderen Datensatz sieht. Wenn jedoch alle Benutzer einer begrenzten Gruppe von Berechtigungssätzen angehören, sollte dies wirklich hilfreich sein.
Daniel
quelle
Was ist Ihre Frist? In Geomajas haben wir bereits die Sicherheits- / Datenzugriffsbeschränkungen. Wir arbeiten derzeit am Caching / Rasterisieren, was zu dem System führt, nach dem Sie suchen. Es sollte in ein paar Wochen fertig sein.
quelle
Wäre ein Web Feature Service (WFS) effizienter?
http://openlayers.org/dev/examples/getfeatureinfo-popup.html
Nur eine Idee.
quelle
Wahrscheinlich ist diese Lösung verrückt, aber los geht's.
Warum nicht ein WMS-Server pro Benutzer? Nehmen wir an, wir verwenden MapServer. Die MapServer-Konfiguration wird in einer .map-Datei (auch als Mapfile bezeichnet) gespeichert, aber nichts verbietet die Verwendung mehrerer Mapfiles. Wenn eine WMS-Anforderung ausgeführt wird, ist einer der herstellerspezifischen Parameter, die MapServer akzeptiert, 'map', eine Zeichenfolge, die den Pfad und den Dateinamen der verwendeten Map-Datei enthält [1]. Wenn in Ihren WMS-Anforderungen abhängig von der ID des Benutzers, der sich zuvor angemeldet hat, eine andere Map-Datei gesendet wird, werden Sie als WMS-Server als Benutzer und nur mit einer Installation von MapServer angezeigt.
Auf der Sicherheitsseite müssten Sie die verwendete Map-Datei mit einer Sitzungs-ID vergleichen, eine Aufgabe, die wahrscheinlich von einem Proxy zwischen Clients und MapServer ausgeführt wird. Ein Benutzer, der die Karten anderer Benutzer sehen möchte, könnte die URL manuell ändern, indem er den Parameter 'map' ändert, und diese Gegenmaßnahme würde solche Versuche erfolglos machen.
Das Gegenteil (Verrücktheit) dieser Lösung ist, dass für jeden Benutzer eine Map-Datei generiert werden muss. Falls die Anzahl der Benutzer hoch ist, ist diese Lösung natürlich nicht praktikabel, es sei denn, Map-Dateien könnten bei Bedarf mithilfe eines Skripts oder eines ähnlichen Mechanismus automatisch generiert und bei Bedarf aktualisiert werden.
[1] Bei Verwendung von MapServer ist der Parameter 'map' tatsächlich obligatorisch.
quelle
Hier gibt es mehrere bewegliche Teile.
Zunächst werden die Punkte gefiltert: Dies sollte auf der Serverseite unmittelbar nach oder während Ihrer SQL-Abfrage erfolgen.
Dann müssen die gefilterten Punkte an den Client zurückgegeben werden.
Das ist der einfache Teil. :) Ich würde empfehlen, dass Sie dies implementieren und dann die Leistung testen und im Idealfall hier aufhören können.
Wenn Sie jedoch zu viele Punkte haben, um sie in OpenLayers effizient anzuzeigen, gelangen Sie zu den Optimierungen, die Google für die kleinen roten Punkte zu tun scheint:
Sie müssen einen Kachel-Renderer mit dem vollständigen Satz gefilterter Ergebnisse verbinden, um Kacheln bis auf einen kleinen Punkt pro Ergebnis vollständig transparent zu erstellen. (Designentscheidung: Diese eifrig oder nur auf Anfrage produzieren?)
Für GeoServer usw. ist ein Triggercode erforderlich, da pro Abfrage und Benutzer eine neue Ebene erforderlich ist. Wenn Sie Benutzer hinzufügen, müssen Sie neue Dinge hinzufügen, damit GeoServer sie rendern kann. (Außerdem müssen Sie Ergebnisdatensätze in einem Format erstellen, das von der Rendering-Implementierung verwendet werden kann.) Und wie oft werden alte Fliesen neu gerendert?
Ich würde ein kleines Stück Servercode empfehlen, mit dem Proxys auf den Kachel-Renderer zugreifen können. Auf diese Weise kann jemand keine Ergebnisse sehen, die ihm nicht gehören, indem er eine URL errät.
Als nächstes müssen die Ergebnisse, die an den Browser zurückgegeben werden, partitioniert werden: Die ersten n sind vollständige Ergebnisse, bei denen Markierungen platziert werden, während der Rest als Koordinaten + Rückruf-URL gesendet wird. (Auch wenn es nicht für das Rendern zuständig ist, muss der Browser wissen, wo sie sich befinden, um den Cursor zu ändern, einen Tooltip bereitzustellen und mit einem Klick sinnvolle Aktionen auszuführen!)
Dann gibt es den JS-Code im Browser, um Interaktionen mit den Punkten zu verwalten.
Soweit ich weiß, was nicht sehr weit ist, hat niemand "out of the box" -Code geschrieben, um das oben Genannte zu tun: Sie sehen sich eine Reihe von Systemintegrationscodes im Backend und eine ganze Reihe neuer JS im Backend an Vorderes Ende.
quelle
Wenn Sie eine Abfrage haben, die ausgeführt werden kann, um Ihnen mitzuteilen, welche IDs ein Benutzer sehen kann (wie Sie in der letzten Bearbeitung sagen), besteht die "beste" Lösung wahrscheinlich darin, diesen Filter als CQL- oder OGC-Filter als Teil des zu codieren WMS-Anfrage. Möglicherweise müssen Sie die Daten in einer Ansicht neu organisieren, um dies zu ermöglichen.
Bevor Sie anfangen, Tile Caches zu verwenden, würde ich die einfache Version erstellen und prüfen, ob sie schnell genug ist, und dann genau dann komplex werden, wenn Sie mehr Geschwindigkeit benötigen.
quelle