如何将Geopackage数据导入Django RESTful API实现英国公园查询
问题解答与操作指南
一、关于你对数据集的疑问
这是否是你需要的数据?
是的,这个OS Open Greenspace是英国官方发布的全英绿地公开数据集,覆盖了公园、自然保护区、游乐场等各类绿地空间,完全匹配你搭建英国公园查询应用的需求。该数据是否包含公园名称等信息,还是仅存储地理位置?
它不仅包含精准的地理位置(多边形/点坐标),还附带了丰富的属性信息:包括绿地名称、类型(如公园、游乐场)、所属区域、管理方等,完全满足你API输出名称、位置等核心信息的需求。
二、将GPKG数据导入Django并搭建API的步骤
1. 先查看GPKG数据内容(确认字段)
用Python的geopandas库快速查看数据结构,先安装依赖:
pip install geopandas
然后运行代码查看字段和样本数据:
import geopandas as gpd # 读取gpkg的核心图层(greenspace_site是主要绿地数据) gpkg_data = gpd.read_file("你的gpkg文件路径.gpkg", layer='greenspace_site') print("数据包含的字段:", gpkg_data.columns.tolist()) print("\n前5条样本数据:") print(gpkg_data[['name', 'descriptivegroup', 'geometry']].head())
2. 配置Django地理数据库
因为是空间数据,需要用支持地理字段的数据库:
- 开发测试可以用SQLite Spatial,生产环境推荐PostgreSQL+PostGIS
- 修改
settings.py配置:
INSTALLED_APPS = [ # 原有应用 'django.contrib.gis', 'rest_framework', 'rest_framework_gis', # 辅助处理地理API的工具 ] # SQLite Spatial配置(开发用) DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.spatialite', 'NAME': BASE_DIR / 'db.sqlite3', } } # PostGIS配置(生产用) # DATABASES = { # 'default': { # 'ENGINE': 'django.contrib.gis.db.backends.postgis', # 'NAME': '你的数据库名', # 'USER': '数据库用户名', # 'PASSWORD': '数据库密码', # 'HOST': 'localhost', # 'PORT': '5432', # } # }
3. 创建Django模型
根据GPKG字段定义模型:
from django.contrib.gis.db import models class Park(models.Model): name = models.CharField(max_length=255, null=True, blank=True) # 绿地类型,比如Park、Playground等 type = models.CharField(max_length=100, null=True, blank=True) # 存储绿地范围的多边形坐标,用英国常用的OSGB36坐标系 geometry = models.MultiPolygonField(srid=27700) def __str__(self): return self.name or "未命名绿地"
运行迁移命令创建表:
python manage.py makemigrations python manage.py migrate
4. 导入GPKG数据到数据库
方法一:用ogr2ogr快速导入(适合批量数据)
# 导入到SQLite Spatial ogr2ogr -f "SQLite" -dsco SPATIALITE=YES db.sqlite3 "你的gpkg文件路径.gpkg" -nln park_park -nlt MULTIPOLYGON -t_srs EPSG:27700 # 导入到PostGIS # ogr2ogr -f "PostgreSQL" PG:"dbname=你的数据库名 user=用户名 password=密码" "你的gpkg文件路径.gpkg" -nln park_park -nlt MULTIPOLYGON -t_srs EPSG:27700
注:park_park是Django模型对应的数据库表名(格式:应用名_模型名)
方法二:用Python脚本自定义导入(适合数据清洗)
创建自定义管理命令import_parks.py放在应用的management/commands目录下:
import geopandas as gpd from django.core.management.base import BaseCommand from your_app.models import Park class Command(BaseCommand): help = '从GPKG导入公园数据' def handle(self, *args, **options): gdf = gpd.read_file("你的gpkg文件路径.gpkg", layer='greenspace_site') # 转换坐标系到模型使用的EPSG:27700 gdf = gdf.to_crs(epsg=27700) for idx, row in gdf.iterrows(): Park.objects.get_or_create( name=row.get('name'), type=row.get('descriptivegroup'), geometry=row.geometry ) if idx % 100 == 0: self.stdout.write(f"已导入 {idx} 条数据...") self.stdout.write(self.style.SUCCESS("所有公园数据导入完成!"))
运行命令导入:
python manage.py import_parks
5. 编写REST API端点
- 安装依赖:
pip install djangorestframework djangorestframework-gis
- 创建序列化器:
from rest_framework_gis.serializers import GeoFeatureModelSerializer from your_app.models import Park class ParkSerializer(GeoFeatureModelSerializer): class Meta: model = Park fields = ('id', 'name', 'type') geo_field = 'geometry' # 指定地理字段
- 创建视图集:
from rest_framework import viewsets from your_app.models import Park from your_app.serializers import ParkSerializer class ParkViewSet(viewsets.ReadOnlyModelViewSet): queryset = Park.objects.all() serializer_class = ParkSerializer # 支持按名称、类型过滤 filterset_fields = ('name', 'type')
- 配置路由(
urls.py):
from django.urls import path, include from rest_framework.routers import DefaultRouter from your_app.views import ParkViewSet router = DefaultRouter() router.register(r'parks', ParkViewSet) urlpatterns = [ path('', include(router.urls)), ]
启动服务后,访问/parks/即可获取包含公园名称、类型、地理位置的GeoJSON格式数据,适合前端展示和查询。
内容的提问来源于stack exchange,提问作者jethro-dev
相关产品推荐
相关产品推荐

