django-mapbox-baselayer 1.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. django_mapbox_baselayer-1.1.1.dist-info/METADATA +205 -0
  2. django_mapbox_baselayer-1.1.1.dist-info/RECORD +43 -0
  3. django_mapbox_baselayer-1.1.1.dist-info/WHEEL +5 -0
  4. django_mapbox_baselayer-1.1.1.dist-info/top_level.txt +2 -0
  5. mapbox_baselayer/VERSION.md +1 -0
  6. mapbox_baselayer/__init__.py +1 -0
  7. mapbox_baselayer/admin.py +30 -0
  8. mapbox_baselayer/apps.py +8 -0
  9. mapbox_baselayer/locale/en/LC_MESSAGES/django.mo +0 -0
  10. mapbox_baselayer/locale/en/LC_MESSAGES/django.po +46 -0
  11. mapbox_baselayer/locale/fr/LC_MESSAGES/django.mo +0 -0
  12. mapbox_baselayer/locale/fr/LC_MESSAGES/django.po +66 -0
  13. mapbox_baselayer/management/__init__.py +0 -0
  14. mapbox_baselayer/management/commands/__init__.py +0 -0
  15. mapbox_baselayer/management/commands/install_ign_baselayer.py +119 -0
  16. mapbox_baselayer/management/commands/install_mapbox_baselayer.py +27 -0
  17. mapbox_baselayer/management/commands/install_opentopomap_baselayer.py +39 -0
  18. mapbox_baselayer/management/commands/install_osm_baselayer.py +34 -0
  19. mapbox_baselayer/migrations/0001_initial.py +75 -0
  20. mapbox_baselayer/migrations/0002_auto_20191129_0942.py +17 -0
  21. mapbox_baselayer/migrations/0003_auto_20191202_0937.py +22 -0
  22. mapbox_baselayer/migrations/0004_auto_20191202_1834.py +22 -0
  23. mapbox_baselayer/migrations/0005_auto_20191202_1840.py +20 -0
  24. mapbox_baselayer/migrations/0006_alter_baselayertile_id_alter_mapbaselayer_id_and_more.py +21 -0
  25. mapbox_baselayer/migrations/0007_alter_mapbaselayer_attribution.py +20 -0
  26. mapbox_baselayer/migrations/0008_mapbaselayer_is_overlay_alter_mapbaselayer_order.py +22 -0
  27. mapbox_baselayer/migrations/0009_alter_mapbaselayer_options.py +20 -0
  28. mapbox_baselayer/migrations/0010_baselayer_overlaylayer.py +36 -0
  29. mapbox_baselayer/migrations/0011_alter_mapbaselayer_base_layer_type.py +25 -0
  30. mapbox_baselayer/migrations/__init__.py +0 -0
  31. mapbox_baselayer/models.py +152 -0
  32. mapbox_baselayer/tests/__init__.py +0 -0
  33. mapbox_baselayer/tests/test_commands.py +135 -0
  34. mapbox_baselayer/tests/test_models.py +96 -0
  35. mapbox_baselayer/tests/test_views.py +87 -0
  36. mapbox_baselayer/urls.py +14 -0
  37. mapbox_baselayer/views.py +32 -0
  38. test_mapbox_baselayer/__init__.py +0 -0
  39. test_mapbox_baselayer/settings.py +126 -0
  40. test_mapbox_baselayer/test_app/__init__.py +0 -0
  41. test_mapbox_baselayer/test_app/views.py +5 -0
  42. test_mapbox_baselayer/urls.py +26 -0
  43. test_mapbox_baselayer/wsgi.py +16 -0
@@ -0,0 +1,205 @@
1
+ Metadata-Version: 2.4
2
+ Name: django-mapbox-baselayer
3
+ Version: 1.1.1
4
+ Summary: Django model to store and serve mapbox base layer config
5
+ Home-page: https://github.com/makinacorpus/django-mapbox-baselayer.git
6
+ Author: Makina Corpus
7
+ Author-email: geobi@makina-corpus.com
8
+ Classifier: Environment :: Web Environment
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Topic :: Internet :: WWW/HTTP
11
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Natural Language :: English
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Framework :: Django
17
+ Description-Content-Type: text/markdown
18
+ Requires-Dist: django>=2.2
19
+ Provides-Extra: dev
20
+ Requires-Dist: factory-boy; extra == "dev"
21
+ Requires-Dist: ruff; extra == "dev"
22
+ Requires-Dist: coverage; extra == "dev"
23
+ Requires-Dist: django-debug-toolbar; extra == "dev"
24
+ Dynamic: author
25
+ Dynamic: author-email
26
+ Dynamic: classifier
27
+ Dynamic: description
28
+ Dynamic: description-content-type
29
+ Dynamic: home-page
30
+ Dynamic: provides-extra
31
+ Dynamic: requires-dist
32
+ Dynamic: summary
33
+
34
+ [![codecov](https://codecov.io/gh/makinacorpus/django-mapbox-baselayer/branch/master/graph/badge.svg)](https://codecov.io/gh/makinacorpus/django-mapbox-baselayer)
35
+ [![CI](https://github.com/makinacorpus/django-mapbox-baselayer/actions/workflows/python-ci.yml/badge.svg)](https://github.com/makinacorpus/django-mapbox-baselayer/actions/workflows/python-ci.yml)
36
+
37
+ # Django Mapbox Baselayer
38
+
39
+ Django application to store, manage and serve map base layers and overlay configurations for **MapLibre GL JS** and **Mapbox GL JS**.
40
+
41
+ This package provides:
42
+ - Django models to store base layers and overlay layers configuration
43
+ - Admin interface to manage layers
44
+ - API endpoints to serve layer configurations as TileJSON
45
+ - Support for raster tiles, vector tiles, and Mapbox styles
46
+
47
+ ![Map Example](docs/map_example.png)
48
+
49
+ # Getting started
50
+ ### Installation
51
+ Install it in your project like any dependency
52
+ ```bash
53
+ pip install django-mapbox-baselayer
54
+ ```
55
+
56
+ ### Usage
57
+ Declare django-mapbox-baselayer in the `INSTALLED_APPS`
58
+ ```python
59
+ # settings.py
60
+
61
+ INSTALLED_APPS = [
62
+ # ... other django apps
63
+ "mapbox_baselayer",
64
+ ]
65
+ ```
66
+
67
+ For Mapbox base layers, you do not need to describe the tiles with the `BaseLayerTile` object, but an url is mandatory.
68
+
69
+ For Raster base layers, is it necessary to create a `BaseLayerTile` for each url (`a.tiles.xxx`, `b.tiles.xxx`, etc ...)
70
+
71
+ Tile size should be 256 for raster and 512 for vector.
72
+
73
+ ### Commands
74
+
75
+ #### OSM base layer
76
+
77
+ ```bash
78
+ ./manage.py install_osm_baselayer
79
+ ```
80
+
81
+ #### OpenTopoMap base layer
82
+
83
+ ```bash
84
+ ./manage.py install_opentopomap_baselayer
85
+ ```
86
+
87
+ #### Mapbox base layer
88
+
89
+ ```bash
90
+ ./manage.py install_mapbox_baselayer (use mapbox://styles/mapbox/streets-v11 as default)
91
+ ./manage.py install_mapbox_baselayer --mapbox-url=mapbox://styles/mapbox/satellite-streets-v11
92
+ ```
93
+
94
+ #### IGN base layer
95
+
96
+ ```bash
97
+ ./manage.py install_ign_baselayer --layers ortho plan maps scan_25 cadastre plan_vt
98
+ ```
99
+
100
+
101
+ CHANGELOG
102
+ =========
103
+
104
+ 1.1.1 (2026-02-07)
105
+ --------------------------
106
+
107
+ **Improvements**
108
+
109
+ * mapbox url is now labeled as "Style URL".
110
+ * IGN Plan Vector tile layer is available
111
+
112
+ **Bugfixes**
113
+ * IGN layers are updated to use the new style url instead of the old tile url.
114
+
115
+ **Development**
116
+
117
+ * Use ruff instead of flake / black / isort
118
+
119
+
120
+ 1.1.0 (2026-02-06)
121
+ --------------------------
122
+
123
+ **New features**
124
+
125
+ * Add overlays concept to allow adding layers on top of baselayers. This is useful for example to add a layer with markers on top of a baselayer.
126
+ * Add JSON endpoint to get baselayer data. This is useful for example to get the real url of a mapbox style.
127
+
128
+ **Improvements**
129
+
130
+ * Add example view
131
+
132
+
133
+ **Maintenance**
134
+
135
+ * Drop official support for python <= 3.9
136
+ * Add official support for python 3.13
137
+ * Add official support for python 5.2 and 6.0
138
+
139
+
140
+ 1.0.0 (2023-07-11)
141
+ --------------------------
142
+
143
+ * Increase attribution size to 1024 chars.
144
+ * Support django 4.2, drop django 2.2
145
+ * Support python 3.11
146
+
147
+
148
+ 0.0.9 (2022-11-09)
149
+ --------------------------
150
+
151
+ * Improve install_ign_baselayer command. Add Plan IGN V2 and fix multi layer import.
152
+ * Support django 3.2, 4.0 and 4.1
153
+ * Support python 3.10
154
+
155
+
156
+ 0.0.8 (2020-11-03)
157
+ --------------------------
158
+
159
+ * Add command to create Mapbox layer
160
+ * Add command to create different IGN layers
161
+
162
+ 0.0.7 (2020-10-30)
163
+ --------------------------
164
+
165
+ * Admin is now registered by default. Delete enabling code in your project.
166
+ * Set default mapbox glyphs to avoid map style problems on raster based layer
167
+ * Add commands to create OSM and OpenTopoMap base layers
168
+
169
+ 0.0.6 (2020-09-09)
170
+ --------------------------
171
+
172
+ * Support django 3.1
173
+
174
+ 0.0.5 (2020-06-03)
175
+ --------------------------
176
+
177
+ * Fix translations
178
+
179
+
180
+ 0.0.4 (2019-12-04)
181
+ --------------------------
182
+
183
+ * Allow using map_box_url to store vector external json
184
+
185
+
186
+ 0.0.3 (2019-12-03)
187
+ --------------------------
188
+
189
+ * add tile Size option for raster layers
190
+ * add attribution option for all layers
191
+ * Add real_url property to model MapBaseLayer, to get real url for mapbox styles
192
+ * fix MapBaseLayer deletion
193
+ * Enable fr translation
194
+
195
+
196
+ 0.0.2 (2019-11-29)
197
+ --------------------------
198
+
199
+ * Increase tile url max size
200
+
201
+
202
+ 0.0.1 (2019-11-25)
203
+ --------------------------
204
+
205
+ * First release
@@ -0,0 +1,43 @@
1
+ mapbox_baselayer/VERSION.md,sha256=xXUskxWKoLyH9GZQV7PTCja5ljRfxCUKaTaPPORid84,5
2
+ mapbox_baselayer/__init__.py,sha256=0tauVmyoZKZ5zo3zY0lQgEEiNnfY8PfEB0wQaRkre7I,67
3
+ mapbox_baselayer/admin.py,sha256=CKyJg_rS83IGKp_Sm1cb2mVyZc3PeHv_SFI-WmeKYyU,713
4
+ mapbox_baselayer/apps.py,sha256=nnT5Y9vdM9U4OiyVo6--MZJMio02mkD6RsIuoOJMMKg,252
5
+ mapbox_baselayer/models.py,sha256=2mHmhopln7QjjLgCWhIZ0x7XXclqpmt2qN0R6Xrxav0,4705
6
+ mapbox_baselayer/urls.py,sha256=bbWHJfTvqMKcMJhQgxyR0YVEl6XJfaw9Pun_Ht7ENt4,349
7
+ mapbox_baselayer/views.py,sha256=YIGzKjYf3Ybjf1DFSmYiYkI2dCbzcQ1bbx35XG0XLg0,1024
8
+ mapbox_baselayer/locale/en/LC_MESSAGES/django.mo,sha256=N1pb17IfLd0ASiKO8d68-B4ygSpDkhKOCs8YTzMXQo0,380
9
+ mapbox_baselayer/locale/en/LC_MESSAGES/django.po,sha256=Q6Pf9qCIyDSL6Rko7woeL0Deesldsjug54of3XfV8N4,970
10
+ mapbox_baselayer/locale/fr/LC_MESSAGES/django.mo,sha256=CaVjLMXT6lM6QX1W6pk3SOYY39udHZQJ4i37oDLmL0U,1144
11
+ mapbox_baselayer/locale/fr/LC_MESSAGES/django.po,sha256=4NjreX0sK5jmlQVrjBAnjoGdY6yrZcnGI4I4pBVrvTU,1777
12
+ mapbox_baselayer/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ mapbox_baselayer/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ mapbox_baselayer/management/commands/install_ign_baselayer.py,sha256=7LClCd_6i5MmIZHSMNx9Wc6JJtlPkWgtsdFuSxaE8dw,4121
15
+ mapbox_baselayer/management/commands/install_mapbox_baselayer.py,sha256=CcRyPKIA-5gMsDAiSvXHWBrpqRn71myn4fPWd3R_V8U,799
16
+ mapbox_baselayer/management/commands/install_opentopomap_baselayer.py,sha256=DCfzw_iADJ6kKNn_ZwCEqyzTxJuNkb1ZS6MEkJqoY-w,1481
17
+ mapbox_baselayer/management/commands/install_osm_baselayer.py,sha256=lbxN3TIEAzyYx0LsqvxIzEJoWvo_m5-wXdDCsnjAwvc,1188
18
+ mapbox_baselayer/migrations/0001_initial.py,sha256=JLtCTGm_tqtkTHr-u-RG7cSXeUn-n4SzkzvziY4idkw,2624
19
+ mapbox_baselayer/migrations/0002_auto_20191129_0942.py,sha256=37yBCzgkfIVBTWEqcjqo3qxY5x8-1m5ofK-zoJ336-c,388
20
+ mapbox_baselayer/migrations/0003_auto_20191202_0937.py,sha256=qmpIlBSdgdHiFzBqtEEQc4N48SYvi6FzYJksmCQQ-7E,590
21
+ mapbox_baselayer/migrations/0004_auto_20191202_1834.py,sha256=h8RMog4Vtpgpd7QJ8eFO8_d332JUSIT-S7oXfCE7kac,602
22
+ mapbox_baselayer/migrations/0005_auto_20191202_1840.py,sha256=7umWiFkblNf2z71H3scOZJVwZOiJ2dYwdTt83LxnG7A,534
23
+ mapbox_baselayer/migrations/0006_alter_baselayertile_id_alter_mapbaselayer_id_and_more.py,sha256=7QHuniltQD9Tf_UbcrEF-O6yUv2WDE9XagHuxfhyYdk,517
24
+ mapbox_baselayer/migrations/0007_alter_mapbaselayer_attribution.py,sha256=EqxuMn7MFA3hbfrccoWHKG6DSD0hq51V4g1Dx5MFpZs,502
25
+ mapbox_baselayer/migrations/0008_mapbaselayer_is_overlay_alter_mapbaselayer_order.py,sha256=CbLrtqCS5rb5LIVlllaAlFPTT_ROK-PSIxF2G_q8B-c,610
26
+ mapbox_baselayer/migrations/0009_alter_mapbaselayer_options.py,sha256=OtOGVhHoL3-pjkRoo4maJBPfk7J5q4SQHxGnvkkojQk,553
27
+ mapbox_baselayer/migrations/0010_baselayer_overlaylayer.py,sha256=s2qm55s5dLgYz6R8kt270nh6b2DgLtfkNo5Bud0FP1I,1019
28
+ mapbox_baselayer/migrations/0011_alter_mapbaselayer_base_layer_type.py,sha256=rludCMNjRNR0n3Ej3ty3w2Vnp-7-mHuZK56VxMb5UIc,662
29
+ mapbox_baselayer/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ mapbox_baselayer/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ mapbox_baselayer/tests/test_commands.py,sha256=YhkxRkUJzZeOmVW3nqY-mUPciHdR05bqrNECXy8LEmY,4392
32
+ mapbox_baselayer/tests/test_models.py,sha256=vzV1VZjwm_PZbcbjjxNBHOIAOmG4hj76IijiADFTEhw,3576
33
+ mapbox_baselayer/tests/test_views.py,sha256=V5hcOyOGT3RyKvdDbDPeyC2jfNbpQo67haeqNDJHF04,3218
34
+ test_mapbox_baselayer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ test_mapbox_baselayer/settings.py,sha256=fOSmryforHEgieHMbKwb1Np-I3CFqeOYl5TfnE2co-k,3374
36
+ test_mapbox_baselayer/urls.py,sha256=r7K0D9iJUOdtZo7Q_9vrv8-b7T1byrK9x7Ns6_6Rrq4,972
37
+ test_mapbox_baselayer/wsgi.py,sha256=iVP0iAEWKpGxB8zVKwTndgJmlDuHUteNx9shXILNPHc,419
38
+ test_mapbox_baselayer/test_app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ test_mapbox_baselayer/test_app/views.py,sha256=1YEuDVumOCKxDXt979ybIGhbi5Jd275bNj85qlAxg-c,132
40
+ django_mapbox_baselayer-1.1.1.dist-info/METADATA,sha256=e3s5f7cvJuh-KnjfAdAyHtfPzovLgzgQxmTjUbuA1iI,5348
41
+ django_mapbox_baselayer-1.1.1.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
42
+ django_mapbox_baselayer-1.1.1.dist-info/top_level.txt,sha256=5YN9trgD-9iN4i3Yp1PWKVx4Erznh8lX3VfD6FgOVHo,39
43
+ django_mapbox_baselayer-1.1.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (79.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ mapbox_baselayer
2
+ test_mapbox_baselayer
@@ -0,0 +1 @@
1
+ 1.1.1
@@ -0,0 +1 @@
1
+ default_app_config = "mapbox_baselayer.apps.MapboxBaselayerConfig"
@@ -0,0 +1,30 @@
1
+ from django.contrib import admin
2
+
3
+ from . import models
4
+
5
+
6
+ class TileInLine(admin.StackedInline):
7
+ model = models.BaseLayerTile
8
+ extra = 0
9
+
10
+
11
+ class BaseMapLayerAdmin(admin.ModelAdmin):
12
+ list_display = ("name", "slug", "base_layer_type", "order")
13
+ list_filter = ("base_layer_type",)
14
+ search_fields = ("name", "slug")
15
+ exclude = ("is_overlay",)
16
+
17
+ def get_inlines(self, request, obj=None):
18
+ if not obj.pk or (obj and obj.base_layer_type == obj.LayerType.RASTER):
19
+ return [TileInLine]
20
+ return []
21
+
22
+
23
+ @admin.register(models.BaseLayer)
24
+ class BaseLayerAdmin(BaseMapLayerAdmin):
25
+ pass
26
+
27
+
28
+ @admin.register(models.OverlayLayer)
29
+ class OverlayLayerAdmin(BaseMapLayerAdmin):
30
+ pass
@@ -0,0 +1,8 @@
1
+ from django.apps import AppConfig
2
+ from django.utils.translation import gettext_lazy as _
3
+
4
+
5
+ class MapboxBaselayerConfig(AppConfig):
6
+ default_auto_field = "django.db.models.AutoField"
7
+ name = "mapbox_baselayer"
8
+ verbose_name = _("MapBox Utils")
@@ -0,0 +1,46 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ #, fuzzy
7
+ msgid ""
8
+ msgstr ""
9
+ "Project-Id-Version: PACKAGE VERSION\n"
10
+ "Report-Msgid-Bugs-To: \n"
11
+ "POT-Creation-Date: 2026-02-06 16:09+0000\n"
12
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+ "Language: \n"
16
+ "MIME-Version: 1.0\n"
17
+ "Content-Type: text/plain; charset=UTF-8\n"
18
+ "Content-Transfer-Encoding: 8bit\n"
19
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
20
+
21
+ msgid "MapBox Utils"
22
+ msgstr ""
23
+
24
+ msgid "Is overlay"
25
+ msgstr ""
26
+
27
+ msgid "Mapbox or tilejson URL"
28
+ msgstr ""
29
+
30
+ msgid "Raster tile size. Set 256 for 3rd party raster tilesets."
31
+ msgstr ""
32
+
33
+ msgid "Map base layers"
34
+ msgstr ""
35
+
36
+ msgid "Base layer"
37
+ msgstr ""
38
+
39
+ msgid "Base layers"
40
+ msgstr ""
41
+
42
+ msgid "Overlay layer"
43
+ msgstr ""
44
+
45
+ msgid "Overlay layers"
46
+ msgstr ""
@@ -0,0 +1,66 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: PACKAGE VERSION\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2026-02-06 20:41+0000\n"
11
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+ "Language: \n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+ "Plural-Forms: nplurals=2; plural=(n > 1);\n"
19
+
20
+ #: mapbox_baselayer/apps.py:8
21
+ msgid "MapBox Utils"
22
+ msgstr "Utilitaires MapBox"
23
+
24
+ #: mapbox_baselayer/models.py:11
25
+ msgid "Style URL"
26
+ msgstr "URL de style"
27
+
28
+ #: mapbox_baselayer/models.py:12
29
+ msgid "Raster tiles"
30
+ msgstr "Tuiles raster"
31
+
32
+ #: mapbox_baselayer/models.py:13
33
+ msgid "Vector tiles"
34
+ msgstr "Tuiles vectorielles"
35
+
36
+ #: mapbox_baselayer/models.py:16
37
+ msgid "Is overlay"
38
+ msgstr "Est une sur-couche"
39
+
40
+ #: mapbox_baselayer/models.py:20
41
+ msgid "Mapbox or tilejson URL"
42
+ msgstr "URL d'un style mapbox ou d'un tilejson"
43
+
44
+ #: mapbox_baselayer/models.py:26
45
+ msgid "Raster tile size. Set 256 for 3rd party raster tilesets."
46
+ msgstr "Taille de tuile raster. Mettre 256 pour les tuiles raster de tiers."
47
+
48
+ #: mapbox_baselayer/models.py:89 mapbox_baselayer/models.py:90
49
+ msgid "Map base layers"
50
+ msgstr "Fonds de plan des cartes"
51
+
52
+ #: mapbox_baselayer/models.py:112
53
+ msgid "Base layer"
54
+ msgstr "Fond de plan de cartes"
55
+
56
+ #: mapbox_baselayer/models.py:113
57
+ msgid "Base layers"
58
+ msgstr "Fonds de plan des cartes"
59
+
60
+ #: mapbox_baselayer/models.py:126
61
+ msgid "Overlay layer"
62
+ msgstr "Sur-couche de cartes"
63
+
64
+ #: mapbox_baselayer/models.py:127
65
+ msgid "Overlay layers"
66
+ msgstr "Sur-couches des cartes"
File without changes
File without changes
@@ -0,0 +1,119 @@
1
+ from urllib.parse import urlencode
2
+
3
+ from django.core.management import BaseCommand, CommandError
4
+
5
+ from mapbox_baselayer.models import BaseLayerTile, MapBaseLayer
6
+
7
+
8
+ class Command(BaseCommand):
9
+ help = "Install an IGN base layer"
10
+ raster_layers = {
11
+ "plan": {
12
+ "name": "GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2",
13
+ "format": "png",
14
+ "overlay": False,
15
+ "need_key": False,
16
+ },
17
+ "ortho": {
18
+ "name": "ORTHOIMAGERY.ORTHOPHOTOS",
19
+ "format": "jpeg",
20
+ "overlay": False,
21
+ "need_key": False,
22
+ },
23
+ "maps": {
24
+ "name": "GEOGRAPHICALGRIDSYSTEMS.MAPS",
25
+ "format": "jpeg",
26
+ "overlay": False,
27
+ "need_key": True,
28
+ },
29
+ "scan_25": {
30
+ "name": "GEOGRAPHICALGRIDSYSTEMS.MAPS.SCAN25TOUR",
31
+ "format": "jpeg",
32
+ "overlay": False,
33
+ "need_key": True,
34
+ },
35
+ "cadastre": {
36
+ "name": "CADASTRALPARCELS.PARCELS",
37
+ "format": "png",
38
+ "overlay": True,
39
+ "need_key": False,
40
+ },
41
+ }
42
+ mapbox_style_layers = {
43
+ "plan_vt": {
44
+ "url": "//data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/standard.json"
45
+ },
46
+ }
47
+
48
+ def add_arguments(self, parser):
49
+ parser.add_argument("--key", type=str, default="ign_scan_ws")
50
+ parser.add_argument(
51
+ "--layers",
52
+ nargs="+",
53
+ type=str,
54
+ default=[
55
+ "ortho",
56
+ ],
57
+ )
58
+
59
+ def handle(self, *args, **options):
60
+ key = options.get("key")
61
+
62
+ for layer in options.get("layers"):
63
+ if (
64
+ layer not in self.raster_layers
65
+ and layer not in self.mapbox_style_layers
66
+ ):
67
+ valid_layers = list(self.raster_layers.keys()) + list(
68
+ self.mapbox_style_layers.keys()
69
+ )
70
+ msg = f"'{layer}' is not a valid value. Should be '{', '.join(valid_layers)}'"
71
+ raise CommandError(msg)
72
+
73
+ for layer in options.get("layers"):
74
+ if layer in self.raster_layers:
75
+ params = {
76
+ "LAYER": self.raster_layers[layer]["name"],
77
+ "EXCEPTIONS": "text/xml",
78
+ "FORMAT": f"image/{self.raster_layers[layer]['format']}",
79
+ "SERVICE": "WMTS",
80
+ "VERSION": "1.0.0",
81
+ "REQUEST": "GetTile",
82
+ "STYLE": "normal",
83
+ "TILEMATRIXSET": "PM",
84
+ }
85
+ if self.raster_layers[layer]["need_key"]:
86
+ params["apikey"] = key
87
+ base_url = "//data.geopf.fr/private/wmts"
88
+
89
+ # Build URL with unencoded placeholders
90
+ query_string = urlencode(params)
91
+ final_url = f"{base_url}?{query_string}&TILEMATRIX={{z}}&TILEROW={{y}}&TILECOL={{x}}"
92
+
93
+ base_layer = MapBaseLayer.objects.create(
94
+ name=f"IGN {layer}",
95
+ base_layer_type="raster",
96
+ tile_size=256,
97
+ is_overlay=self.raster_layers[layer]["overlay"],
98
+ min_zoom=0,
99
+ max_zoom=19,
100
+ attribution="© IGN - GeoPortail",
101
+ )
102
+ BaseLayerTile.objects.bulk_create(
103
+ [
104
+ BaseLayerTile(base_layer=base_layer, url=final_url),
105
+ ]
106
+ )
107
+
108
+ for layer in options.get("layers"):
109
+ if layer in self.mapbox_style_layers:
110
+ style = self.mapbox_style_layers[layer]
111
+ MapBaseLayer.objects.create(
112
+ name=f"IGN {layer}",
113
+ base_layer_type="mapbox",
114
+ tile_size=512,
115
+ is_overlay=False,
116
+ attribution="© IGN - GeoPortail",
117
+ map_box_url=style["url"],
118
+ )
119
+ self.stdout.write(self.style.SUCCESS("IGN layer(s) created."))
@@ -0,0 +1,27 @@
1
+ from django.core.management import BaseCommand
2
+
3
+ from mapbox_baselayer.models import MapBaseLayer
4
+
5
+
6
+ class Command(BaseCommand):
7
+ help = "Install a MapBox base layer"
8
+
9
+ def add_arguments(self, parser):
10
+ parser.add_argument(
11
+ "--mapbox-url",
12
+ action="store",
13
+ help="Mapbox url to use",
14
+ default="mapbox://styles/mapbox/streets-v11",
15
+ )
16
+
17
+ def handle(self, *args, **options):
18
+ MapBaseLayer.objects.create(
19
+ name="Mapbox",
20
+ base_layer_type="mapbox",
21
+ tile_size=512,
22
+ min_zoom=0,
23
+ max_zoom=22,
24
+ attribution="© Mapbox",
25
+ map_box_url=options.get("mapbox_url"),
26
+ )
27
+ self.stdout.write(self.style.SUCCESS("Mapbox base layer has been created."))
@@ -0,0 +1,39 @@
1
+ from django.core.management import BaseCommand
2
+
3
+ from mapbox_baselayer.models import BaseLayerTile, MapBaseLayer
4
+
5
+
6
+ class Command(BaseCommand):
7
+ help = "Install an OpenTopoMap base layer"
8
+
9
+ def handle(self, *args, **options):
10
+ base_layer = MapBaseLayer.objects.create(
11
+ name="OpenTopoMap",
12
+ base_layer_type="raster",
13
+ tile_size=256,
14
+ min_zoom=2,
15
+ max_zoom=17,
16
+ attribution='map data: © <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors,'
17
+ '<a href="http://viewfinderpanoramas.org">SRTM</a> | map style: © '
18
+ '<a href="https://opentopomap.org">OpenTopoMap</a> '
19
+ '(<a href="https://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA</a>)',
20
+ )
21
+ BaseLayerTile.objects.bulk_create(
22
+ [
23
+ BaseLayerTile(
24
+ base_layer=base_layer,
25
+ url="https://a.tile.opentopomap.org/{z}/{x}/{y}.png",
26
+ ),
27
+ BaseLayerTile(
28
+ base_layer=base_layer,
29
+ url="https://b.tile.opentopomap.org/{z}/{x}/{y}.png",
30
+ ),
31
+ BaseLayerTile(
32
+ base_layer=base_layer,
33
+ url="https://c.tile.opentopomap.org/{z}/{x}/{y}.png",
34
+ ),
35
+ ]
36
+ )
37
+ self.stdout.write(
38
+ self.style.SUCCESS("OpenTopoMap base layer has been created.")
39
+ )
@@ -0,0 +1,34 @@
1
+ from django.core.management import BaseCommand
2
+
3
+ from mapbox_baselayer.models import BaseLayerTile, MapBaseLayer
4
+
5
+
6
+ class Command(BaseCommand):
7
+ help = "Install an OSM base layer"
8
+
9
+ def handle(self, *args, **options):
10
+ base_layer = MapBaseLayer.objects.create(
11
+ name="OSM",
12
+ base_layer_type="raster",
13
+ tile_size=256,
14
+ min_zoom=0,
15
+ max_zoom=19,
16
+ attribution='<a href="https://www.openstreetmap.org/copyright">OSM Contributors</a>',
17
+ )
18
+ BaseLayerTile.objects.bulk_create(
19
+ [
20
+ BaseLayerTile(
21
+ base_layer=base_layer,
22
+ url="https://a.tile.openstreetmap.org/{z}/{x}/{y}.png",
23
+ ),
24
+ BaseLayerTile(
25
+ base_layer=base_layer,
26
+ url="https://b.tile.openstreetmap.org/{z}/{x}/{y}.png",
27
+ ),
28
+ BaseLayerTile(
29
+ base_layer=base_layer,
30
+ url="https://c.tile.openstreetmap.org/{z}/{x}/{y}.png",
31
+ ),
32
+ ]
33
+ )
34
+ self.stdout.write(self.style.SUCCESS("OSM base layer has been created."))