GeoWebCache is used to cache map tiles coming from a variety of sources such as OGC Web Map Service (WMS) i.e. GeoServer in this case. It implements various service interfaces (such as WMS-C, WMTS, TMS, Google Maps KML, Virtual Earth) in order to accelerate and optimize map image delivery. GeoServer comes with GeoWebCache which is called integrated GeoWebCache. However, we need to turn on the layer to use integrated GeoWebCache.
Purpose
To increase the performance of serving layers to the user using GeoServer.
Dependency
- ElasticSearch latest
- ElasticGeo 2.13.2
- GeoServer 2.13.2
Performance Calculation Using LeafLet
We need to do following. The angular script can be run through Zeppelin or using html page. It's upto you. However, I tested using Zeppelin
- Create a layer in GeoServer using this article. Datasource must have lots of data to see the performance. At least 1 million records.
- Enable the direct integration with GeoServer WMS check box from caching
- Add following angular script to Zeppelin or in your html to see a layer in your leaflet map without using GeoWebCache
%angular
- Add following angular script to Zeppelin or in your html to see a layer in your leaflet map using GeoWebCache. Need to
add
tiled=true
as a query parameter in the WMS requests. You can see the different in load time of the data on the map.%angular
Performance Calculation Using Python Script
Let's run the following pythong script to see the number
%python import requests import time import grequests from urllib.request import urlopen url = "http://localhost:8080/geoserver/elasticsearch/wms" layer = "elasticsearch:07177d4c-1227-4be4-aecc-56b600e3ed24" bbox = [ "-2504688.5428486555,2504688.5428486546,0,5009377.085697309", "0,2504688.5428486546,2504688.5428486555,5009377.085697309", "-2504688.5428486555,5009377.085697309,0,7514065.628545966", "0,5009377.085697309,2504688.5428486555,7514065.628545966", "-2504688.5428486555,-7.081154551613622,0,2504688.5428486546", "0,-7.081154551613622,2504688.5428486555,2504688.5428486546", "-5009377.085697311,2504688.5428486546,-2504688.5428486555,5009377.085697309", "2504688.5428486555,2504688.5428486546,5009377.085697311,5009377.085697309", "-5009377.085697311,5009377.085697309,-2504688.5428486555,7514065.628545966", "2504688.5428486555,5009377.085697309,5009377.085697311,7514065.628545966", "-5009377.085697311,-7.081154551613622,-2504688.5428486555,2504688.5428486546", "2504688.5428486555,-7.081154551613622,5009377.085697311,2504688.5428486546", "-2504688.5428486555,7514065.628545966,0,10018754.171394618", "0,7514065.628545966,2504688.5428486555,10018754.171394618", "-2504688.5428486555,-2504688.542848655,0,-7.081154551613622", "0,-2504688.542848655,2504688.5428486555,-7.081154551613622", "-5009377.085697311,7514065.628545966,-2504688.5428486555,10018754.171394618", "-7514065.628545966,2504688.5428486546,-5009377.085697311,5009377.085697309", "5009377.085697311,2504688.5428486546,7514065.628545966,5009377.085697309", "-5009377.085697311,-2504688.542848655,-2504688.5428486555,-7.081154551613622", "2504688.5428486555,-2504688.542848655,5009377.085697311,-7.081154551613622", "-7514065.628545966,5009377.085697309,-5009377.085697311,7514065.628545966", "5009377.085697311,5009377.085697309,7514065.628545966,7514065.628545966", "-7514065.628545966,-7.081154551613622,-5009377.085697311,2504688.5428486546", "5009377.085697311,-7.081154551613622,7514065.628545966,2504688.5428486546", "-7514065.628545966,7514065.628545966,-5009377.085697311,10018754.171394618", "5009377.085697311,7514065.628545966,7514065.628545966,10018754.171394618", "-7514065.628545966,-2504688.542848655,-5009377.085697311,-7.081154551613622", "5009377.085697311,-2504688.542848655,7514065.628545966,-7.081154551613622", "-10018754.171394622,2504688.5428486546,-7514065.628545966,5009377.085697309", "7514065.628545966,2504688.5428486546,10018754.171394622,5009377.085697309", "-10018754.171394622,5009377.085697309,-7514065.628545966,7514065.628545966", "7514065.628545966,5009377.085697309,10018754.171394622,7514065.628545966", "-10018754.171394622,-7.081154551613622,-7514065.628545966,2504688.5428486546", "7514065.628545966,-7.081154551613622,10018754.171394622,2504688.5428486546", "-10018754.171394622,7514065.628545966,-7514065.628545966,10018754.171394618", "7514065.628545966,7514065.628545966,10018754.171394622,10018754.171394618", "-10018754.171394622,-2504688.542848655,-7514065.628545966,-7.081154551613622", "7514065.628545966,-2504688.542848655,10018754.171394622,-7.081154551613622" ] number_users=10 headers = { 'name':'test' } wholeStart = time.time() queryParams = [] goodCalls = 0 badCalls = 0 for i in range(number_users): start = time.time() for box in bbox: querystring = {"LAYERS":layer,"FORMAT":"image/png","REQUEST":"GetMap","STYLES":"","SRS":"EPSG:3857","BBOX":box,"WIDTH":"256","HEIGHT":"256", "TRANSPARENT":"true"} queryParams.append(querystring) r = requests.request("GET", url, headers=headers, params=querystring) #print(r.url) #print(r) info = r.headers['Content-Type'] if info=='image/png': goodCalls += 1 else: badCalls += 1 query_time = time.time() - start print('Query time for user ' + str(i) + ' is {}'.format(query_time)) #rs = (grequests.get(url, headers=headers, params=p) for p in queryParams) #print(grequests.map(rs)) wholeQueryTime = time.time() - wholeStart print('Query time for total users ' + str(number_users) + ' with request total ' + str(len(queryParams)) + ' is {}'.format(wholeQueryTime)) print('Total good calls ' + str(goodCalls) + ' with total bad calls ' + str(badCalls))
The Runtime without using GeoWebCache is as follows
Query time for user 0 is 21.038068056106567 Query time for user 1 is 19.959446907043457 Query time for user 2 is 19.74454951286316 Query time for user 3 is 19.76458168029785 Query time for user 4 is 20.557850122451782 Query time for user 5 is 21.417890310287476 Query time for user 6 is 20.058231353759766 Query time for user 7 is 19.57079005241394 Query time for user 8 is 19.79716420173645 Query time for user 9 is 19.767117023468018 Query time for total users 10 with request total 390 is 201.68155598640442 Total good calls 390 with total bad calls 0
The Runtime with using GeoWebCache is as follows
Change the url to url = "http://localhost:8080/geoserver/elasticsearch/wms?tiled=true&" Query time for user 0 is 0.638730525970459 Query time for user 1 is 0.5899291038513184 Query time for user 2 is 0.5873465538024902 Query time for user 3 is 0.8277342319488525 Query time for user 4 is 0.6482501029968262 Query time for user 5 is 0.6671054363250732 Query time for user 6 is 0.6258928775787354 Query time for user 7 is 0.6370384693145752 Query time for user 8 is 0.5637142658233643 Query time for user 9 is 0.5665357112884521 Query time for total users 10 with request total 390 is 6.361682415008545 Total good calls 390 with total bad calls 0
Conclusion
GeoWebCache increases the performance of GeoServer substancially as you can see above. This will be very useful if multiple users try to access same layer. We just need to remember turn on the integrated GeoWebCache option while creating a layer.
References
Copyright of geoserver image is © wikipedia.org
http://geoserver.org
https://github.com/ngageoint/elasticgeo
http://geowebcache.org/