Django vector tile generation
Project description
Generate MapBox VectorTiles from GeoDjango models
Directly with PostgreSQL/PostGIS 2.4+ or python native mapbox_vector_tile
Read full documentation
Installation
Basic
pip install django-vectortiles
- Without any other option, use only vectortiles.postgis
- Ensure you have psycopg2 set and installed
If you don't want to use Postgis
pip install django-vectortiles[mapbox]
- This will incude mapbox_vector_tiles package and its dependencies
- Use only vectortiles.mapbox
Examples
- assuming you have django.contrib.gis in your INSTALLED_APPS and a gis compatible database backend
# in your app models.py
from django.contrib.gis.db import models
class Layer(models.Model):
name = models.CharField(max_length=250)
class Feature(models.Model):
geom = models.GeometryField(srid=4326)
name = models.CharField(max_length=250)
layer = models.ForeignKey(Layer, on_delete=models.CASCADE, related_name='features')
Simple model:
# in your view file
from django.views.generic import ListView
from vectortiles.postgis.views import MVTView
from yourapp.models import Feature
class FeatureTileView(MVTView, ListView):
model = Feature
vector_tile_layer_name = "features"
vector_tile_fields = ('other_field_to_include', )
# in your urls file
from django.urls import path
from yourapp import views
urlpatterns = [
...
path('tiles/<int:z>/<int:x>/<int:y>', views.FeatureTileView.as_view(), name="feature-tile"),
...
]
Related model:
# in your view file
from django.views.generic import DetailView
from vectortiles.mixins import BaseVectorTileView
from vectortiles.postgis.views import MVTView
from yourapp.models import Layer
class LayerTileView(MVTView, DetailView):
model = Layer
vector_tile_fields = ('other_field_to_include', )
def get_vector_tile_layer_name(self):
return self.get_object().name
def get_vector_tile_queryset(self):
return self.get_object().features.all()
def get(self, request, *args, **kwargs):
self.object = self.get_object()
return BaseVectorTileView.get(self,request=request, z=kwargs.get('z'), x=kwargs.get('x'), y=kwargs.get('y'))
# in your urls file
from django.urls import path
from yourapp import views
urlpatterns = [
...
path('layer/<int:pk>/tile/<int:z>/<int:x>/<int:y>', views.LayerTileView.as_view(), name="layer-tile"),
...
]
Usage without PostgreSQL / PostGIS
Just import and use vectortiles.mapbox.view.MVTView instead of vectortiles.postgis.view.MVTView
Usage with DRF
django-vectortiles can be used with DRF if renderer_classes
of the view is overridden (see DRF docs). Simply use the right BaseMixin and action on viewsets, or directly a GET method in an APIView, i.e.:
from rest_framework import renderers, views
from vectortiles.postgis.views import MVTView
class MVTRenderer(renderers.BaseRenderer):
media_type = "application/vnd.mapbox-vector-tile"
format = "pbf"
def render(self, data, accepted_media_type=None, renderer_context=None):
return data
class TileServerView(MVTView, views.APIView):
renderer_classes = [MVTRenderer]
def get(...): ...
Development
With docker and docker-compose
docker pull makinacorpus/geodjango:bionic-3.6
docker-compose build
# docker-compose up
docker-compose run /code/venv/bin/python ./manage.py test
Local
- Install python and django requirements (python 3.6+, django 2.2+)
- Install geodjango requirements
- Have a postgresql / postgis 2.4+ enabled database
- Use a virtualenv
pip install .[dev] -U
CHANGELOG
0.2.0 (2022-10-17)
-
Possibly breaking change:
- Base Mixin method get_tile use now class attributes for extent / buffer or clip_geom. Remove this parameters in your sub class method if needed.
-
Bug fixes:
- Correct usage for vector_tile_extent / vector_tile_buffer and vector_tile_clip_geom
- Clipped geom is now working for mapbox
-
Support Python 3.10 and django 4.1
0.1.0 (2021-02-25)
First beta release
- Add attribute to limit features in tile (unable to use a sliced queryset)
0.0.3 (2021-02-18)
- Delete useless Envelope transformation because django implicitly transform on intersects lookup (thanks to StefanBrand)
- Avoid useless queryset evaluation in some cases (thanks to StefanBrand)
0.0.2 (2021-02-12)
- Fix required 'fields' key in tilejson. Will be filled later
- Fix generated subquery to deal with DateField (thanks to StefanBrand)
0.0.1 (2020-10-22)
- First Release
- Generate Vector Tiles from django models
- in python
- with PostGIS
- Generate associated TileJSON
- Default views to handle Vector tiles and tilejson
- Generate Vector Tiles from django models
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.