GeoJson Einbinden¶
In diesem Beispiel wird erklärt, wie man einen GeoJson Dienst einbindet und tabellarisch darstellt. Über einem Filter wird eine Auswahlliste angeboten. Diese wird auch von einem GeoJson Dienst befüllt.
Der entsprechende Dienst ist ein gView MapServer Dienst mit Adressen. Über eine Query werden die Werte abgeholt. Für die Auswahlliste werden ebenfalls eine Query aus dem Dienst mit zusätzlichem DISTINCT verwendet.
Bemerkung
Das Beispiel kann auch 1:1 für einen ArcGIS Server MapServer Dienst umgesetzt werden. Hier ändert sich nur der Pfad im ConnectionString des EndPoints.
Endpunkt¶
Zuerst muss ein EndPoint mit dem Namen geojson-gview
angelegt werden.
Der Typ für den EndPoint ist GeoJson
. Als ConnectionString gibt man
die Url zur gView Server GeoServices REST Schnittstelle an:
https://localhost/gview/geoservices/rest/services
Abfragen¶
Wir möchten aus einem Dienst (bspw. test/basis
) die Adressen abfragen. Dazu legt man unter dem EndPoint
eine Query adressen
an.
Als Query gibt man den Url Pfad, unter der im ConnectionString des EndPoints angeführten Url an. Im Falle von gView (oder AGS) ermittelt man diesen Url Pfad am einfachsten über die REST Oberfläche des MapServers. Dort kann man in der Regel für den Dienst eine Abfrage über eine Benutzer Oberfläche erstellen und ausführen. Die Url Pfad kann dann aus der Adresszeile des Browsers kopiert werden.
/test/postgis/MapServer/0/query?where=plz%3D{{plz}}&
geometry=&geometryType=&inSR=&relationParam=&objectIds=&time=0&distance=0&
units=&outFields=*&returnGeometry=true&maxAllowableOffset=0&
geometryPrecision=0&outSR=&returnIdsOnly=false&returnCountOnly=false&
returnExtentOnly=false&orderByFields=&outStatistics=&groupByFieldsForStatistics=&
returnZ=false&returnM=false&returnDistinctValues=false&
returnTrueCurves=false&resultOffset=0&resultRecordCount=0&
datumTransformation=&rangeValues=&quantizationParameters=¶meterValues=&
historicMoment=0&
layerId=0&f=geojson
Bemerkung
Eine gView bzw. AGS Abfrage benötigt viele Parameter. Darum wird empfohlen, den Link über die UI des MapServer zu erstellen.
Im Beispiel wurde auch noch ein Platzhalter für eine Abfrage definiert: where=plz%3D{{plz}}
Bemerkung
Das =
must mit %3D
Url-Codiert werden.
Bemerkung
Als Ausgabe Format der Abfrage muss geojson
angegeben werden. Das Standard JSON Format von gView bzw. AGS
ist nicht GeoJson! &f=geojson
Ruft man die Query (https://localhost/datalinq/select/geojson-gview@adressen?plz=3100&_pjson=true) auf, kommt beispielsweise folgendes Ergebnis:
[
{
"oid": null,
"_location": {
"Latitude": 48.1877734994291,
"Longitude": 15.627903754497671,
"BBox": null,
"BBoxValid": false
},
"gid": 8285,
"ortsname": "St. Pölten",
"strassenname": "...",
"adrcd": 6192061,
"subcd": 1,
"adresse": "... 1, 3100 St.Pölten",
"hnr": "1",
"plz": 3100,
"pgnr": 30201,
"pgname": "St. Pölten",
"okznr": 3158,
"kgnr": 19544,
"kgname": "St. Pölten"
},...
]
Im nächten Schritt bauen wir über die MapServer Oberfläche eine Abfrage, die ein DISTINCT über
die Postleitzahlen (plz) durchführt und tragen den Url Pfad in eine neue DataLinq Abfrage
adressen-distinct-plz
ein:
/test/postgis/MapServer/0/query?where=1%3D1&
geometry=&geometryType=&
inSR=&relationParam=&objectIds=&time=0&distance=0&
units=&outFields=plz&returnGeometry=false&
maxAllowableOffset=0&geometryPrecision=0&outSR=&
returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&
orderByFields=&outStatistics=&groupByFieldsForStatistics=&
returnZ=false&returnM=false&returnDistinctValues=true&returnTrueCurves=false&
resultOffset=0&resultRecordCount=0&datumTransformation=&rangeValues=&
quantizationParameters=¶meterValues=&historicMoment=0&
layerId=0&f=geojson
Diese Abfrage erfordert keine Parameter und liefert bem Aufruf (https://localhost/datalinq/select/geojson-gview@adressen-distinct-plz?_pjson=true) folgendes:
[
{
"oid": null,
"plz": 1300
},
{
"oid": null,
"plz": 2723
},
{
"oid": null,
"plz": 3925
},...
]
View¶
Unter Query adressen
bauen wir jetzt ein View table
:
@DLH.Table(Model.Records, max: 100)
Dieser sollte beim Aufruf die ersten 100 Adressen anzeigen.
Bemerkung
Wir haben in der Abfrage einen Filter mit Platzhalter {{plz}}
angegeben.
Darum kann es sein, dass die Tabelle leer ist. Die Parameter muss jetzt auch an den View
übergeben werden. Das kann zum Test auch über die Einstellungen des Views erfolgen:
Unter Test Url Parameters
kann plz=3100
eingetragen werden.
In nächsten Schritt erweitern wir den View noch um einen Filter, um nach Postleitenzahlen zu filtern.
Der Filter sollte eine Auswahlliste an Postleitzahlen anführen, der über die DataLinq Abfrage adresse-distinct-plz
befüllt wird:
@DLH.FilterView(label: "Filter123",
filterParameters: new Dictionary<string, object>{
{"plz", new { displayname="Postleitzahl",
source="geojson-gview@adressen-distinct-plz",
valueField="plz",
nameField="plz" }
}
})
@DLH.Table(Model.Records, max: 100)
Führt man den View aus, sollte die Tabelle über die Postleitzahl filtern können.