综述:要在django中处理地理空间数据,首先要保证django框架支持处理地理空间数据,其次项目用到的数据库也应该支持存储地理数据,本小结介绍的是python3.12+django(后端技框架)+vue(前端框架)+postgresql(数据库);
在 Django 中处理地理空间数据的存储和查询,涉及到以下几个关键步骤:
1.扩展数据库以支持地理空间数据:
之前已经发布过该方法的帖子,可以去看看,这里不再赘述。
windows下在Postgresql数据库中扩展postgis功能实现存储空间地理数据_windows pgsql 添加扩展-CSDN博客
2.在 Django 中配置 GDAL 以支持地理空间数据:
2.1下载 GDAL 二进制文件:
下载与你的 Python 版本和系统架构(32位或64位)相匹配的 GDAL .whl
文件,具体下载链接在下述文章中,感谢这位老师的分享Python第三方GDAL库安装(离线库下载资源)_gdal离线安装-CSDN博客
我的电脑是Windows10 64位、Python3.12.0,就下载GDAL-3.8.4-cp312-cp312-win_amd64.whl,其中 3.8.4表示的是GDAL的版本,cp312就是Python3.12的意思,win_amd64对应的是操作系统。
2.2安装 GDAL:
在终端pip下载的好的.whl
文件,需要注意路径,pip install gdal版本的文件名.whl时应该在.whl
文件实际存储路径下进行:
pip install gdal版本的文件名.whl
例如,如果文件名为 GDAL-3.3.3-cp39-cp39-win_amd64.whl
,则命令为:
pip install GDAL-3.3.3-cp39-cp39-win_amd64.whl
2.3验证安装:
在 Django shell 中尝试导入 django.contrib.gis
来验证 GDAL 是否正确安装和配置:
python manage.py shell
>>> from django.contrib.gis import gdal
在shell命令中显示gdal已经安装,但是当执行迁移时,仍然提示未找到GDAL:
raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library (tried "gdal307", "gdal306", "gdal305", "gdal304", "gdal303", "gdal302", "gdal301", "gdal300", "
gdal204"). Is GDAL installed? If it is, try setting GDAL_LIBRARY_PATH in your settings.
这里是重点:你需要在django的settings文件里手动指定一下GDAL_LIBRARY_PATH和GEOS_LIBRARY_PATH两个文件的路径,如果你成功pip了.whl文件,则gdal和geos应该会在python解释器的lib文件夹下(python3.12.2\Lib\site-packages\osgeo),将两个重要文件添加到settings文件下:
GDAL_LIBRARY_PATH = r'E:\python3.12.2\Lib\site-packages\osgeo\gdal.dll'
GEOS_LIBRARY_PATH = r'E:\python3.12.2\Lib\site-packages\osgeo\geos_c.dll'
3.Django的 settings中
配置
3.1数据库使用空间数据库引擎
例如 PostGIS:
(django.contrib.gis.db.backends.postgis 前提是你的数据库扩展了postgis功能)
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'your_database_name',
'USER': 'your_database_user',
}
}
3.2 INSTALLED_APPS中添加gis插件
INSTALLED_APPS = [
'corsheaders',
'django.contrib.gis', # 这个
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
3.3关闭中间件csrf拦截
主要作用就是前端通过axios向后端发送post请求时。不会被拦截:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', 这个
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
4.地理空间字段
当上述步骤都进行完毕以后,在django的models层中就可以正确设置空间地理字段,并生成迁移文件和执行迁移:
from django.contrib.gis.db import models as gis_models
class GeometryModel(gis_models.Model):
# 设置特定区域 区域名称 区域描述 面积 多个点确定一个区域
name = models.CharField(max_length=100, verbose_name='区域名称')
description = models.TextField(max_length=200, verbose_name='区域描述')
area = models.FloatField(verbose_name='面积',default=0.0) # 假设area是一个浮点数类型的字段) # 单位为平方米
geom = gis_models.MultiPointField(srid=4326, verbose_name='区域坐标') # 使用 PolygonField 来存储多边形
上述的geom字段就是一个地理空间字段,用来存储多个坐标点,其在后端展示如下图:
SRID=4326;MULTIPOINT (119.215969 34.602489, 119.224616 34.603649, 119.223238 34.611877, 119.214353 34.610517, 119.215969 34.602489)是一个地理空间数据的表示,使用 Well-Known Text (WKT) 格式定义的多点 (MultiPoint) 几何对象:
-
SRID: 空间参考系统标识符 (Spatial Reference System Identifier) 是一个唯一的数字,用来指定坐标系。在这个例子中,SRID 为 4326,它代表 WGS 84 坐标系,这是由全球定位系统 (GPS) 使用的坐标系,也是大多数地图和地理空间数据的标准坐标系。
-
MULTIPOINT: 这是几何类型,表示一个由多个点组成的集合。在地理空间数据库中,它用来存储多个位置。
-
坐标: 括号内的数字对代表点的经度和纬度。每一对数字代表一个点,按顺序列出。在这个例子中,有五个点:
- 第一个点是 (119.215969, 34.602489)
- 第二个点是 (119.224616, 34.603649)
- 第三个点是 (119.223238, 34.611877)
- 第四个点是 (119.214353, 34.610517)
- 第五个点是 (119.215969, 34.602489),注意这个点与第一个点相同,表明这是一个闭合的多点形状。
这个多点形状可以用来表示一个地理区域中的多个位置,例如,城市中的几个不同兴趣点或一个多边形区域的顶点。在地理信息系统 (GIS) 和其他地理空间分析工具中,这样的数据可以用来进行各种空间查询和分析。
5.总结
本文主要介绍了django框架扩展GeoDjango的方式,如何使用django来存储地理空间数据,比如说:经纬度点、多边形等,后续将继续介绍如何在views层对数据进行操作,以及前端如何接收或向后端传递地理空间数据。
标签:gis,Django,django,空间数据,地理,contrib,GeoDjango,GDAL From: https://blog.csdn.net/weixin_50845028/article/details/143084383