Plot Service¶
Mithilfe des PlotService API können Ausdrucke im PDF Format abgeholt werden. Dazu wird
der Name (plus Kategorie und Portalseite) der Karte
ein Drucklayout
ein Maßstab
und eine Bounding-Box (plus EPSG-Code, falls nicht WGS 84)
übergeben.
Layout Xml Files¶
Die API versucht den übergeben Bereich in das Kartenlayout einzupassen, unter der Voraussetzung, dass dies für den übergeben Maßstab möglich ist. Dazu probiert die API unterschiedliche Papiergrößen (A4, A3, …) und Ausrichtungen (Hoch-, Querformat) aus. Sobald eine Papiergröße gefunden wird, wir ein PDF File für diese Papiergröße erzeugt.
Welche Papiergrößen und Ausrichtungen möglich sind, kann im jeweiligen Layout.xml File definiert werden:
<layout to-jpg-if-greater="5" image-format="jpg"
plot_service_page_sizes="A4,A3,A2"
plot_service_page_orientations="Landscape,Portrait" >
Die Attribute für das PlotService beginnen mit plot_service_
:
page_sizes
: Papiergrößenpage_orientations
: Ausrichtungen
Die Reihenfolge der hier angeführten Werte entspricht auch dir Reihenfolge, in der getestet wird, ob der gewünschte Ausschnitt mit dem übergeben Maßstab gedruckt werden kann. Im hier gezeigten Beispiel würde beispielsweise so getestet:
A4.Portrait
A4.Landscape
A3.Portrait
A3.Landscape
…
Wird bis zum Schluss keine mögliche Papiergröße/Ausrichtung Kombination gefunden, gibt die API einen Fehler zurück.
Bemerkung
Die beiden Xml-Attribute plot_service_page_sizes
und plot_service_page_orientations
sind die Voraussetzung, damit ein Ausdruck erstellt werden kann. Das Druckservice
funktioniert in der Regel für alle Karten, allerings nur für Layouts, für die die beiden Attribute gesetzt wurden.
Zusätzlich muss/kann beim Aufruf der API eine ClientId
und ClientSecret
(siehe unten) übergeben werden. Das Erzeugen von PDFs ist nur für die Karten möglich, die für den
aktuellen Client sichtbar sind. Ebenfalls müssen alle Dienste in der Karte für den Client berechtigt sein. Andernfalls liefert die API einen Fehler.
Bemerkung
Beim Aufruf des PlotService wird eine Karte übergeben. Die übergeben Karte muss das Druckwerkzeug und dem entsprechenden Layout enthalten! Ist das Layout nicht im MapBuilder für diese Karte definiert worden, liefert das PlotService eine Fehlermeldung.
Bemerkung
Manche Layout sind über <layout scales="5000,2500,1000" >
nur für bestimmte Maßstabe zugelassen. Das gibt auch wenn dieses Layout mit den PlotService verwendet wird. Wird ein anderer Maßstab übergeben, liefert das PlotService eine Fehlermeldung.
REST Aufruf¶
Das PlotService lässt sich über die REST Schnittstelle der WebGIS API unter https://{api-url}/rest/plotservice
aufrufen. Der Aufruf muss über einen HTTP POST
Request erfolgen.
Als Parameter werden die oben angeführten zwingenden Parameter übergeben (als Http Form):
mapName=Basiskarte&mapCategory=Allgemein&mapPortal=dev&layout=lkmyzkjugleodsjpu-75pdg@ccgis_default&scale=1000&bbox=-68310.17,215052.83,-67577.19,216004.68&bbox_srs=31256
mapPortal
,mapName
,mapCategory
: Damit wird die Karte definiert, die gedruckt werden sollte.layout
: Gibt das Layout an, das gedruckt werden sollte. In diesem Layout müssen die oben angeführten Attributeplot_service_page_sizes
undplot_service_page_orientations
enthalten sein. Als Wert kann hier die CMS Id das Layouts (siehe oben) oder der CMS-Name des Layouts angeführt werden, zBlayout=strom-standard
.scale
: Der Zielmaßstab für den Plot. Hier kann auch eine Liste von Maßstäben übergeben werdenscale=1000,2000,5000
. Das Plotservice probiert in sortierter Reihenfolge (kleinster Wert zuerst), ob ein Druck möglich ist. Sobald eine Maßstab/Papiergrößen Kombination gefunden wird, wird der Druck mit dieser Kombination erstellt. Vorgehensweise: Erster Maßstab wird mit allen möglichen Papierformaten getestet. Ist keine Kombination möglich, wird der nächste Maßstab verwendet. Ist das Layout nur für bestimmte Maßstäbe zugelassen (siehe oben), müssen alle Übergebenen Maßstäbe zugelassen sein. Ansonsten wir ein Fehler zurückgegeben.bbox
: Der Bereich (Bounding-Box), der ausgedruckt werden sollte. Werden die Koordinaten hier nicht in WGS84 (=EPSG Code 4326) übergeben, muss das Koordinatensystem über den Parameterbbox_srs
als EPSG Code übergeben werden.
Das Response eines PlotService Aufrufes kommt als JSON in folgender Form:
{
"name": "print_0a0d0ccb44f54ad7b9dce8f328052ae2.pdf",
"base64": "JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAyMDEyMTQwODQyNDYrMDEnMDAnKQovQ3JlYXRvcihQ....",
"page_format": "A4.Landscape",
"scale_dominator": 1000,
"success": true,
"exception": null
}
name
: Eine Name für die Ausgabedatei (Vorschlag)base64
: Das eigentliche PDF File (Base64 kodiert)page_format
: Das für den Plot gewählte Papierformatscale_dominator
: Der verwendete Maßstabsuccess
: Gibt an, ober der Ausdruck ohne Fehler erfolgt ist (true
). Wird hierfalse
zurück gegeben, ist während des Druckes ein Fehler aufgetreten. Eine genauere Beschreibung des Fehlers wird unterexception
angeführt.excepiton
: Hier werden Fehler wärendend des Ausdrucks alsString
zurück gegeben. Ein Fehler kann zB sein, dass der übergebene Ausschnitt mit keinem Papierformat möglich ist. Fehler können aber auch in den zugrundeliegenden Diensten auftreten. Hier kann es auch vorkommen, dass ein PDF zurückgeliefert wird, in dem Daten/Dienste fehlen können. Um sicher zu gehen, dass während des Ausdrucks alle Dienste verfügbar waren, ist daher unbedingt dersuccess
undexcepiton
Wert auszuwerten.
Weiter optionale Übergabeparameter sind:
dpi
: Die Auflösung, in der gedruckt werden sollte, defaultdpi=120
filters
: Übergabe von Darstellungsfilternpresentations
: Darstellungsvarianten
API Client (.NET Standard)¶
Wird das PlotService von einem .NET Programm aufgerufen, wird empfohlen, die Library E.Standard.WebGIS.Api.Client
zu verwendet. Darin ist ein Service E.Standard.WebGIS.Api.Client.Services.WebGISPlotService
enthalten,
das den Aufruf abstrahiert. Damit wird vor allem die Übergaben von komplexeren Parametern (filters
, presentations
) vereinfacht.
Ein Beispielprojekte, das die Vorgehensweise zeigt, ist die .NET Core Konsolenanwendung WebGIS.Api.Test.Client
.
Um das Service verwenden zu können, muss es über DependencyInjection eingebunden werden. Zusätzlich muss auch
IHttpClientFactory
für die DependencyInjection hinzugefügt werden, zB:
services.AddHttpClient("plostservice", c => {})
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler()
{
ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }
});
services.AddWebGISPlotService(o=>
{
o.HttpClientName = "plotservice";
});
Danach kann WebGISPlotService
über DependencyInjection eingebund werden. Die Methode RunAsync
führt einen Aufruf zum PlotService aus:
var response = await plotService.Run("https://localhost:44341",
new WebGISPlotServiceRequestOptions("dev", "Allgemein", "Basiskarte und Kataster", "layout-standard", 2000)
{
BBox = new double[] { -68310.17, 215052.83, -67577.19, 216004.68 },
BBoxSrs = 31256
});
// alternativ mit übergaben von mehrere möglichen Maßstäben
var response = await plotService.Run("https://localhost:44341",
new WebGISPlotServiceRequestOptions("dev", "Allgemein", "Basiskarte und Kataster", "layout-standard", new int[]{ 1000,2000,2880 })
{
BBox = new double[] { -68310.17, 215052.83, -67577.19, 216004.68 },
BBoxSrs = 31256
});
Bemerkung
Alle weiteren möglichen Übergabeparameter können dem WebGISPlotServiceRequestOptions
entnommen werden.
Der Rückgabewert ist vom Type WebGISPlotServiceResponse
. Auch hier ist es wieder wichtig zu überprüfen,
ober der Plot erfolgreich war (response.Success = true
):
Console.WriteLine($"Request Succeeded: { response.Success }");
if (!response.Success)
{
Console.WriteLine($"Response Message: { response.ExceptionMessage }");
}
else
{
string fileName = $@"c:\temp\{ response.Name }";
Console.WriteLine($"Write file: { fileName }");
await System.IO.File.WriteAllBytesAsync(fileName, response.BinaryResult);
}
Darstellungsvarianten¶
Darstellungsvarianten können über den Parameter presentations
übergeben werden. Der Parameter muss ein JSON String sein.
Hier wird nur beschrieben, wie Darstellungsvarianten über die API Client Library übergeben werden:
Presentations = new WebGISPresentationDefinition[]
{
new WebGISPresentationDefinition()
{
Id="dv_overviewmap_off",
ServiceId="overviewmap_ags@my_cms"
},
new WebGISPresentationDefinition()
{
Id="dv_streets_and_addresses",
ServiceId="basemap_ags@my_cms",
Check = true
}
}
Die hier übergebenen Darstellungsvarianten entsprechend den Layerschaltungen aus dem CMS auf Dienstebene (Nicht die unter Karten Viewer/Darstellungsvarianten). Dazu muss für jede Darstellungsvariante, die geschalten werden sollte die Id Der Darstellungsvariante und die Id des Dienstes übergeben werden. Die Übergebenen Darstellungsvarianten werden in der Reihenfolge ausgeführt, in der sie hier angeführt werden.
Der Wert für Check
(default = null) gibt an, wie die Darstellungsvariante angewendet wird:
null
(default): Darstellungsvariante wird wie eine Button-Darstellungsvariante behandelt. Alle Layer des Dienstes, außer die in der Layerschaltung angeführten, werden unsichtbar. Alle Layer aus der Layerschaltung werden sichtbar geschalten.true
,false
: Die Layer, die in Layerschaltung angeführt sind, werden sichtbar (true
) oder unsichtbar (false
) geschalten. Die Sichtbarkeit aller anderen Layer bleibt unberührt (entspricht einer Checkbox-Darstellungsvariante)
Bemerkung
Wird ein hier angeführter Dienste, Darstellungsvariante oder Layer nicht gefunden, liefert die API eine Fehlermeldung und keine Druck wird erzeugt.
Layer Sichtbarkeit¶
Ähnlich wie bei Darstellungsvarianten, können auch einzelne Layer über den Parameter layers
sichtbar bzw. unsichtbar geschalten werden:
Layers = new WebGISLayerVisibilityDefintion[]
{
new WebGISLayerVisibilityDefintion()
{
ServiceId="tor_tiles_gray@my-cms",
Layers=new string[]{ "0" },
Visible=true
},
new WebGISLayerVisibilityDefintion()
{
ServiceId="strassen_tiles_default@my-cms",
Layers=new string[]{ "0" },
Visible=true
}
}
Hier muss die Id des Dienstes und eine Liste von Layer-Ids (oder Layer Namen) übergeben werden. Der Wert für Visible
gibt an, ob die Layer sichtbar (true
) oder unsichtbar (false
) geschalten werden.
Bemerkung
Wird ein hier angeführter Layer nicht gefunden, liefert die API eine Fehlermeldung und keine Druck wird erzeugt.
Bemerkung
Möchte man Hintergrunddienste schalten, ist die Layer-Id für den TileCache immer "0"
. Schaltet man einen Hintergrunddienst mit dieser Methode, werden alle anderen Hintergrunddienste automatisch unsichtbar geschalten.
Authentication¶
Karten, Dienste usw. können über das WebGIS CMS berechtigt werden. Möchte man nicht öffentliche Dienste ausdrucken, müssen entsprechende Credentials beim API Aufrufen übergeben werden. Die Authenfikation erfolgt für API Aufrufe in der Regel über Clients.
Eine Client kann von einem Subscriber über die API Administrations Oberfläche angelegt werden:
Wichtig für den Aufruf sind die ClientId
und das ClientSecret
:
Im CMS müssen jetzt alle notwendigen Dienste für diesen Client berechtigt werden. Der Name, der im CMS angegeben werden muss ist {subscriber}@{client-name}
.
Wurde der oben gezeigte Client vom Subscriber subscriber::gis-admim
angelegt, muss im CMS subscriber::gis-admin@plot-service
angeben werden.
Beim Aufruf der API muss die ClientId und das ClientSecret mit folgenden Parameter übergeben werden:
&client_id=....&client_secret=...
Verwendet man die .NET Standard API Client Library, kann der Client beim Aufruf folgendermaßen übergeben werden:
var response = await plotService.RunAsync("https://localhost:44341",
new WebGISPlotServiceRequestOptions("dev", "Allgemein", "Basiskarte und Kataster", "strom-standard", 2000)
{
BBox = new double[] { -68310.17, 215052.83, -67577.19, 216004.68 },
BBoxSrs = 31256
},
new WebGISApiClient("0e4....", "8337f....."));