From 7727bf820bad6688e0c59a28d78c20eddfc0ac81 Mon Sep 17 00:00:00 2001 From: Jordi Gomara Cruz Date: Thu, 9 Jan 2025 15:22:53 +0100 Subject: [PATCH 1/2] Servei WMTS --- giscube/templates/admin/giscube/web_map.html | 7 ++++++ giscube/views_mixins.py | 17 +++++++++---- qgisserver/admin.py | 24 +++++++++++++------ .../migrations/0035_service_service_type.py | 18 ++++++++++++++ qgisserver/models.py | 15 +++++++++++- qgisserver/views.py | 4 ++-- 6 files changed, 70 insertions(+), 15 deletions(-) create mode 100644 qgisserver/migrations/0035_service_service_type.py diff --git a/giscube/templates/admin/giscube/web_map.html b/giscube/templates/admin/giscube/web_map.html index 72098ce4..a9fcb701 100644 --- a/giscube/templates/admin/giscube/web_map.html +++ b/giscube/templates/admin/giscube/web_map.html @@ -32,6 +32,13 @@ }).addTo(map); baseLayers['{{ layer.name }}'] = layer; {% endif %} + {% if layer.type == 'wmts' %} + url = '{{ layer.url }}?SERVICE=WMTS&REQUEST=GetTile' + + '&LAYER={{ layer.layers }}&FORMAT=image/png' + + '&TILEMATRIXSET=EPSG:3857&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}'; + layer = L.tileLayer(url).addTo(map); + baseLayers['{{ layer.name }}'] = layer; + {% endif %} {% endfor %} L.control.layers(baseLayers, {}).addTo(map); }; diff --git a/giscube/views_mixins.py b/giscube/views_mixins.py index aa202de6..a4755319 100644 --- a/giscube/views_mixins.py +++ b/giscube/views_mixins.py @@ -71,13 +71,20 @@ def getlegendgraphic(self, request): def getfeatureinfo(self, request): url = self.build_url(request) return super().get(request, url=url) + + def gettile(self, request): + url = self.build_url(request) + return super().get(request, url=url) def get(self, request): - wms_service = self.param_get(request.GET, 'service', '').lower() - wms_request = self.param_get(request.GET, 'request', '').lower() - if wms_service == 'wms': - if wms_request in ('getmap', 'getcapabilities', 'getlegendgraphic', 'getfeatureinfo'): - return getattr(self, wms_request)(request) + service_type = self.param_get(request.GET, 'service', '').lower() + service_request = self.param_get(request.GET, 'request', '').lower() + if service_type == 'wms': + if service_request in ('getmap', 'getcapabilities', 'getlegendgraphic', 'getfeatureinfo'): + return getattr(self, service_request)(request) + elif service_type == 'wmts': + if service_request in ('getcapabilities', 'gettile', 'getfeatureinfo'): + return getattr(self, service_request)(request) return HttpResponseBadRequest() diff --git a/qgisserver/admin.py b/qgisserver/admin.py index 5057cb12..688f5415 100644 --- a/qgisserver/admin.py +++ b/qgisserver/admin.py @@ -63,9 +63,9 @@ class ServiceAdmin(TileCacheModelAdminMixin, ResourceAdminMixin, TabsMixin, admi change_form_template = 'admin/qgisserver/service/change_form.html' form = ServiceChangeForm autocomplete_fields = ('category',) - list_display = ('name', 'title', 'url_wms', 'visible_on_geoportal',) + list_display = ('name', 'title', 'service_type', 'tile_cache_enabled', 'service_url', 'visible_on_geoportal',) list_filter = (('category', RelatedDropdownFilter), ('project', RelatedDropdownFilter), - 'visible_on_geoportal') + 'visible_on_geoportal', 'service_type', 'tilecache_enabled') exclude = ('service_path',) search_fields = ('name', 'title', 'keywords') filter_horizontal = ('servers',) @@ -102,7 +102,7 @@ class ServiceAdmin(TileCacheModelAdminMixin, ResourceAdminMixin, TabsMixin, admi }), (None, { 'fields': [ - 'wms_single_image', 'wms_buffer_enabled', 'wms_buffer_size', 'wms_tile_sizes', + 'service_type', 'wms_single_image', 'wms_buffer_enabled', 'wms_buffer_size', 'wms_tile_sizes', 'wms_getfeatureinfo_enabled', 'options', "choose_individual_layers", "read_layers_automatically", "layers" ], @@ -148,10 +148,20 @@ def get_queryset(self, request): queryset = queryset.order_by('custom_order') return queryset - def url_wms(self, obj): - url = '%s?service=WMS&version=1.1.1&request=GetCapabilities' % obj.service_url - return format_html('WMS URL {1}', url, obj.name) - url_wms.short_description = 'WMS URL' + def service_url(self, obj): + if obj.service_type == 'wms': + url = '%s?service=WMS&version=1.1.1&request=GetCapabilities' % obj.service_url + return format_html('WMS URL {1}', url, obj.name) + elif obj.service_type == 'wmts': + url = '%s?service=WMTS&request=GetCapabilities' % obj.service_url + return format_html('WMTS URL {1}', url, obj.name) + return '' + service_url.short_description = 'Service URL' + + def tile_cache_enabled(self, obj): + return obj.tilecache_enabled + tile_cache_enabled.boolean = True + tile_cache_enabled.short_description = _('tile cache enabled') def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) diff --git a/qgisserver/migrations/0035_service_service_type.py b/qgisserver/migrations/0035_service_service_type.py new file mode 100644 index 00000000..7b9f3ae8 --- /dev/null +++ b/qgisserver/migrations/0035_service_service_type.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.17 on 2025-01-09 14:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('qgisserver', '0034_auto_20241010_1202'), + ] + + operations = [ + migrations.AddField( + model_name='service', + name='service_type', + field=models.CharField(choices=[('wms', 'WMS'), ('wmts', 'WMTS')], default='wms', max_length=255, verbose_name='service type'), + ), + ] diff --git a/qgisserver/models.py b/qgisserver/models.py index d321f1b8..7ddcf574 100644 --- a/qgisserver/models.py +++ b/qgisserver/models.py @@ -48,6 +48,11 @@ def project_unique_service_directory(instance, filename): class Service(TileCacheModelMixin, models.Model): + TYPE_CHOICES = ( + ('wms', 'WMS'), + ('wmts', 'WMTS') + ) + category = models.ForeignKey( Category, null=True, blank=True, on_delete=models.SET_NULL, related_name='qgisserver_services') @@ -96,9 +101,13 @@ class Service(TileCacheModelMixin, models.Model): help_text = '%s %s' % (_('Field between curly braces. e.g.'), '{%s}' % _('street')) popup = models.TextField(_('popup'), blank=True, null=True, help_text=help_text) + service_type = models.CharField(_('service type'), max_length=255, choices=TYPE_CHOICES, default='wms') + def save(self, *args, **kwargs): - if self.read_layers_automatically and self.wms_url: + if self.read_layers_automatically and self.service_type == "wms" and self.wms_url: self.layers = get_wms_layers(self.wms_url) + elif self.read_layers_automatically and self.service_type == "wmts" and self.wmts_url: + self.layers = get_wms_layers(self.wmts_url) super().save(*args, **kwargs) @property @@ -115,6 +124,10 @@ def service_url(self): @property def wms_url(self): return '%s?service=WMS&version=1.1.1&request=GetCapabilities' % self.service_url + + @property + def wmts_url(self): + return '%s?service=WMTS&request=GetCapabilities' % self.service_url @property def service_internal_url(self): diff --git a/qgisserver/views.py b/qgisserver/views.py index 4ee9d15d..61e2f01f 100644 --- a/qgisserver/views.py +++ b/qgisserver/views.py @@ -154,8 +154,8 @@ def get(self, request, service_name): layers = [] layers.append( { - 'name': '%s (WMS)' % (service.title or service.name), - 'type': 'wms', + 'name': '%s (%s)' % (service.title or service.name, service.service_type), + 'type': service.service_type, 'layers': service.default_layer, 'url': reverse('qgisserver', args=(service.name, '',)), 'transparent': service.tilecache_enabled and service.tilecache_transparent From eaf29bbfe1151dad46dee435e5fce0e4867550ae Mon Sep 17 00:00:00 2001 From: JordiGomara Date: Mon, 20 Jan 2025 18:21:23 +0100 Subject: [PATCH 2/2] fix service type --- qgisserver/giscube_search_indexes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qgisserver/giscube_search_indexes.py b/qgisserver/giscube_search_indexes.py index dad2337d..3096fd11 100644 --- a/qgisserver/giscube_search_indexes.py +++ b/qgisserver/giscube_search_indexes.py @@ -32,7 +32,7 @@ def prepare_children(self, obj): else: url = url_slash_join(settings.GISCUBE_URL, '/qgisserver/services/%s' % obj.name) service.update({ - 'type': 'WMS', + 'type': obj.service_type, 'url': url, 'layers': obj.default_layer or '', 'projection': '3857',