Django矢量瓦片生成
项目描述
从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的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | c651cd5608b564e4d2df50e58fab8d44c970182fb34d898e1d8aafd9a13c8179 |
|
MD5 | 00b5d3c204e6387f32c2fe699b5fa405 |
|
BLAKE2b-256 | 249776269a46c8b9a1db85868005ccdc5d03a3bfcf6bec8a1ab6bc942b9c649a |
关闭
django_vectortiles-1.0.0-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | ec08c224469ce0ba24fe6ea1dc5e28e55378bba3834aa7eca9280baf0b0bde4a |
|
MD5 | 12ff259255120d3388188796db195ac0 |
|
BLAKE2b-256 | 241a1973b4e4d900b58560e2845dd07521a1b6a63721ff0bc8dbebd3e7cdcee7 |