You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Geopackage数据导入Django RESTful API实现英国公园查询

问题解答与操作指南

一、关于你对数据集的疑问

  1. 这是否是你需要的数据?
    是的,这个OS Open Greenspace是英国官方发布的全英绿地公开数据集,覆盖了公园、自然保护区、游乐场等各类绿地空间,完全匹配你搭建英国公园查询应用的需求。

  2. 该数据是否包含公园名称等信息,还是仅存储地理位置?
    它不仅包含精准的地理位置(多边形/点坐标),还附带了丰富的属性信息:包括绿地名称、类型(如公园、游乐场)、所属区域、管理方等,完全满足你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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:58:24