跳转到主要内容

Django矢量瓦片生成

项目描述

Tests Coverage

Python Version Django Version

从GeoDjango模型生成MapBox矢量瓦片

直接使用PostgreSQL/PostGIS 2.4+或python自带的mapbox_vector_tile

阅读完整文档

安装

基本

pip install django-vectortiles
  • 默认情况下,postgis后端已启用。
  • 确保您已安装psycopg

如果您不想使用Postgis和/或PostgreSQL

pip install django-vectortiles[python]
  • 这将包括mapbox_vector_tiles包及其依赖项
  • 在您的项目设置中设置VECTOR_TILES_BACKEND="vectortiles.backends.python"

示例

让我们创建带有您城市几何形状的矢量瓦片。

  • 假设您在INSTALLED_APPS中已包含django.contrib.gis并且有一个兼容GIS的数据库后端
# in your app models.py

from django.contrib.gis.db import models


class City(models.Model):
    name = models.CharField(max_length=250)
    city_code = models.CharField(max_length=10, unique=True)
    population = models.IntegerField(default=0)
    geom = models.MultiPolygonField(srid=4326)

简单示例

from yourapp.models import City

# in a vector_layers.py file
from vectortiles import VectorLayer


class CityVL(VectorLayer):
    model = City
    id = "cities"  # layer id / name in tile
    tile_fields = ("name", "city_code")  # add name and city_code properties in each tile feature
    min_zoom = 9  # don't embed city borders at low zoom levels

# in your view file

from yourapp.vector_layers import CityVL

from vectortiles.views import MVTView


class CityTileView(MVTView):
    layer_classes = [CityVL]


# in your urls file
from django.urls import path
from yourapp import views

urlpatterns = [
    ...
    CityTileView.get_url(),  # serve tiles at default /tiles/<int:z>/<int:x>/<int:y>. You can override url prefix and tile scheme in class attributes.
    ...
]

多图层示例

假设您想制作一张带有城市边界的地图,并在每个城市中心显示一个弹出窗口,显示城市名称、人口和面积。

from django.contrib.gis.db.models.functions import Centroid, Area
from yourapp.models import City

# in a vector_layers.py file
from vectortiles import VectorLayer


class CityVectorLayer(VectorLayer):
    model = City
    id = "cities"
    tile_fields = ('city_code', "name")
    min_zoom = 10

    
class CityCentroidVectorLayer(VectorLayer):
    queryset = City.objects.annotate(
        centroid=Centroid("geom"), # compute the city centroïd
        area=Area("geom"), # compute the city area
    )  
    geom_field = "centroid"  # use the centroid field as geometry feature
    id = "city_centroïds"
    tile_fields = ('name', 'city_code', 'area', 'population')  # add area and population properties in each tile feature
    min_zoom = 7  # let's show city name at zoom 7


    
# in your view file

from yourapp.vector_layers import CityVectorLayer, CityCentroidVectorLayer

from vectortiles.views import MVTView


class CityTileView(MVTView):
    layer_classes = [CityVectorLayer, CityCentroidVectorLayer]


# in your urls file
from yourapp import views

urlpatterns = [
    ...
    views.CityTileView.get_url(),  # serve tiles at default /tiles/<int:z>/<int:x>/<int:y>
    ...
]

现在,在http://you_url/tiles/{z}/{x}/{y}请求的任何瓦片,如果与城市相交,将返回包含两个层的矢量瓦片,cities层包含边界几何形状和city_code属性,以及city_centroids层包含中心几何形状和city_name属性。

阅读完整文档以获取示例,包括多层、缓存策略、mapbox集成等。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

django_vectortiles-1.0.0.tar.gz (9.1 kB 查看散列)

上传时间 源代码

构建分发

django_vectortiles-1.0.0-py3-none-any.whl (11.8 kB 查看散列)

上传时间 Python 3

支持者: