Unsere Web-Mapping-Anforderungen sind ziemlich Standard - einige grundlegende Abfragen und die Möglichkeit, die resultierende Karte auszudrucken (oder das Bild zu speichern). Normalerweise haben wir in der Vergangenheit ESRI-Produkte verwendet (im Moment verwenden wir GeoCortex), aber wir konnten das Problem nicht lösen, wie die Legendeninformationen so analysiert werden, dass sie mit den tatsächlich auf der Karte angezeigten Informationen übereinstimmen. Wenn beispielsweise vier Polygone auf der Karte angezeigt werden, sollten nur vier Legendenelemente für die Polygone vorhanden sein. Gibt es eine Open Source-Lösung für dieses Problem?
EDIT : Mal sehen, ob ich das noch klären kann. Derzeit haben wir eine Geologieebene mit über 33.000 Polygonen. Die Legende für diese Ebene ist ein einzelnes Bild und enthält mehrere hundert Legendenelemente (dh sie ist die Legende für die gesamte Geologieebene, die in einem JPEG / PNG gespeichert ist).
In der Regel zoomt ein Benutzer in einen Bereich (z. B. ein einzelnes NTS-Kartenblatt oder einen noch kleineren Bereich) hinein, sodass eine Teilmenge von Geologiepolygonen auf dem Bildschirm angezeigt wird. Anschließend speichern sie die Karte als Druckdokument (PDF oder Bild), das von GeoCortex / ArcGIS Server generiert wird. Das Druckdokument enthält eine Kopfzeile, ein Bild der Karte und eine Legende. Die Legende für den Geologie-Layer ist jedoch die Legende für den gesamten Geologie-Layer, nicht für das , was tatsächlich auf der Karte angezeigt wird (dh für eine viel kleinere Teilmenge).
Ich bin also auf der Suche nach einer FOSS-Lösung , mit der ich eine Teilmenge der Geologielegende ausschneiden oder im Handumdrehen generieren kann, die die tatsächlichen Elemente auf dem Bildschirm / auf der Karte zum gedruckten Dokument enthält . Ich hoffe das klärt die Dinge; Ich entschuldige mich, wenn nicht!
quelle
Antworten:
Abhängig von bestimmten Bedingungen ist es definitiv möglich, das zu tun, was Sie wollen. Schauen Sie sich diese Flex-App an, die ich vor ein paar Jahren entwickelt hatte: http://india-wris.nrsc.gov.in/LULCApp.html .
Die Legende und die Statistik ändern sich in Abhängigkeit von den im aktuellen Bereich sichtbaren Daten. Der Algorithmus erfordert, dass jede Klasse eine eigene Farbe hat. Die Flex-Anwendung kennt die Klasse und ihre Farbe. Bei jeder Änderung der Ausdehnung wird die aktuelle Ausdehnung der Karte in eine Bitmap konvertiert. Anschließend werden die Farben in der Karte ermittelt. Auf diese Weise können Sie herausfinden, welche Farben oder Klassen aktuell sichtbar sind. Basierend auf diesen Informationen wird die Legende dynamisch erstellt.
Ich hatte damals Flex verwendet, aber dies ist auch mit dem Canvas in HTML5 möglich. Oder Sie können einen beliebigen serverseitigen Code verwenden, um dasselbe mit Ihrem Kartenbild zu tun und Ihre dynamisch erstellte Legende zu erhalten.
quelle
AFAIK: In FOSS4G oder ESRI müssen Sie benutzerdefinierten Code schreiben, um diese Ebene zu generieren.
Es ist nicht so schwierig, aber es dauert mehr als ein paar Zeilen Code.
Für ArcMap wird hierzu ein benutzerdefiniertes Element verwendet . Die ESRI-Hilfeseite ist mit alten und neuen Beispielen gefüllt .
In der Vergangenheit habe ich etwas Ähnliches erreicht, wie Sie es mit Pagelayout Frame Elements beschrieben haben .
Wenn Sie noch nie mit ArcObjects gearbeitet haben (aber programmiert haben), kann der Zeichencode etwas kompliziert werden, aber normalerweise ist es erforderlich, einen zu erstellen, um dieses "Aha" zu erreichen. Moment.
Der Algorithmus ist einfach:
(1) Holen Sie sich das Map- Objekt des PageLayouts , das Sie als Referenz für die Generierung der Legende verwenden möchten. Möglicherweise müssen Sie mit mehreren Frames arbeiten, um die gewünschte Map zu erreichen, da ein Pagelayout mehrere Map-Objekte mit unterschiedlichen Objekten enthalten kann Ausmaße, die etwas ungewöhnlich sind, wenn Sie keine benutzerdefinierte ArcMap-Pagelayout-Programmierung vorgenommen haben (denken Sie an die kleinen Nebenkarten, die Sie haben können).
(2) Nehmen Sie den sichtbaren Bereich des ActiveView der gewünschten Karte.
(3) Verwenden Sie diese als Abfragefiltergeometrie, um alle Layer in der Karte zu durchlaufen und zu durchsuchen .
(4) Wenn die Schicht gibt keine Aufzeichnungen, haben Sie es zu zeichnen , wie in den Beispielen gezeigt ich Ihnen vorher gab.
Es tut mir leid, dass ich Ihnen keine einfachere Lösung anbieten kann, aber zumindest können Sie auf diese Weise dafür sorgen, dass es so aussieht, wie Sie es möchten - nur Codierung erforderlich.
Aktualisieren:
Da Sie dies im Kontext einer Webanwendung tun wollten, habe ich die Dokumentation überprüft und es gibt verschiedene Möglichkeiten, dies mit einem ähnlichen Algorithmus zu tun.
Eine davon ist eine ArcGIS Server Object Extension . Sie würden alle Schritte außer (1) ausführen (in diesem Kontext müssen Sie sich keine Sorgen um Pagelayout machen). Stellen Sie das Ergebnis mit REST bereit.
Von hier aus haben Sie mehrere Optionen (abhängig davon, ob Sie Flex oder Javascript verwenden möchten), aber die Idee ist dieselbe: Rufen Sie beim Aktualisieren der Seite den von Ihnen erstellten REST-Webservice auf und zeichnen Sie die Legende.
Der Vorteil dieses Ansatzes im Gegensatz zu anderen, die vorgeschlagen wurden, besteht darin, dass Sie für Ihre Features eine beliebige Symbologie verwenden können (und die Symbologie des Features nicht auf unterschiedliche Farben beschränkt ist). Sie können Ihre bevorzugte Websprache für den clientseitigen Code verwenden. Die Symbole, die Sie für die Legende generieren, können automatisch aus der Karte generiert werden.
Der Nachteil ist, dass Sie eine Server Object Extension schreiben müssen! Glücklicherweise gibt es eine ESRI-Stichprobe, die 75% Ihrer Anforderungen erfüllt und Ihnen eine klare Vorstellung davon geben sollte, wie Sie mit den oben gemachten Kommentaren fortfahren können.
Update 2: Soweit es sich um eine FOSS4G-Lösung handelt, funktioniert derselbe Ansatz auch für jeden FOSS-Server, auch wenn die API für jeden etwas anders ist.
quelle
Wenn Sie mit Geocortex Essentials in eine PDF-Datei exportieren, wird die Legende durch einen Unterbericht in der Druckvorlage generiert. Dieser Unterbericht empfängt alle sichtbaren Layer, die zum Erstellen des Kartenbilds verwendet wurden, sowie alle Legendenfelder, die von ArcGIS Server erstellt wurden. Es werden keine räumlichen Abfragen ausgegeben, um festzustellen, ob Ebenen in der Legende tatsächlich im Bereich des gedruckten Bereichs gezeichnet wurden.
Wenn Sie also das Verhalten der Legende ändern möchten, können Sie den Legenden-Unterbericht anpassen oder ein Bild anstelle eines Unterberichts verwenden, um eine Legende in die Druckvorlage einzufügen. Wenn Sie bereits ein Legendenbild für die Verwendung in Ihrem Viewer generieren, sollten Sie diesen Dienst über das Druckmodul wiederverwenden können.
Die Legende enthält bereits eingebetteten Inline-Code, mit dem die Formatierung des Legendentexts basierend darauf umgeschaltet wird, ob das Farbfeld für eine Ebene oder für eine Klasse in der Ebene bestimmt ist. Der Inline-Code wird angezeigt, wenn Sie im Berichts-Designer zur Registerkarte "Scripting" wechseln.
(Ich arbeite bei Latitude Geographics)
quelle
Über "Web Mapping" mit vollständiger "FOSS-Lösung" ... Überlegungen:
Und technische Überlegung: Sie verwenden "Coverages" (?), Ein guter OGC-Standard zum Abrufen Ihrer räumlichen Informationen ist also das WMS .
Eine OGC-kompatible einfache Lösung für Ihr Problem ist die Verwendung der Dienste WMS GetCapabilities und GetLegendGraphic , die eine Standardlegendenbeschreibung in einer XML-Datei und das Bild mit Legenden zurückgeben.
ArcGIS 10+ hat GetLegendGraphic , prüfen Sie jedoch, ob Sie BBOX angeben können, um nur eine Legenden-Teilmenge anzuzeigen.
Wenn Sie ein Kartenlayout mit Legende erstellen möchten , gibt es noch weitere Teile dieser "FOSS LEGO-Lösung":
Jeder FOSS-Kartenserver wie MapServer (und meines Erachtens auch ESRI-Lösungen) kann ein JPEG- Bild als WMS-Kartenanforderung (nicht gekachelt) anbieten - siehe GetMap- Service von WMS .
PS: Es ist kein Standard, aber vielleicht kann Ihr Server so konfiguriert werden, dass er eine Karte mit Legende anbietet , und zwar mithilfe von Vorlagentools wie MapServer.
Um ein Layout für "Karte mit Legende" zu erstellen, können Sie mit Javascript, PHP oder einer anderen Sprache eine HTML- (oder "PDF-Datei im Handumdrehen") generieren, die die (REST-) Webservice- Anforderungen für Karte und Legende erfüllt.
Ich ziehe es vor, PDF aus HTML zu generieren: Sie können wkHtmlToPdf verwenden , eine FOSS-Lösung für die Konvertierung von HTML in PDF. Um schlechtere Layouts mit "on fly JPEG layout" zu erstellen, können Sie ein Standard-FOSS-Toolkit wie imagemagick auf dem Server verwenden.
quelle