系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
geodjango框架解析之读取矢量数据shp文件写入postgis数据库
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 系列文章目录
- 前言
- 一、矢量文件
- 二、读取文件
- 1.安装geodjango环境
- 2.找到环境中的gdal和proj的位置
- 3.了解文件结构
- 三、通过django写入数据库
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
Django是python的web框架,GeoDjango 是一个包含在 Django 中的 contrib 模块,它将 Django 变成一个世界级的地理网络框架。对于地理数据,有一些我们常用的文件格式比如xx.shp文件,我们如何保存shp文件的内容到数据库呢?geodjango如何处理矢量文件和栅格文件,并建立与数据的关联呢?
提示:以下是本篇文章正文内容,下面案例可供参考
一、矢量文件
常用的矢量文件是shp,shp文件单独不能使用,需要与prj 、dbf、sbn等文件一起使用。我们需要提前准备一份矢量文件。
二、读取文件
1.安装geodjango环境
2.找到环境中的gdal和proj的位置
python 安装gdal可能无法直接安装,需要下载whl文件进行安装。参考链接:https://blog.csdn.net/shanyanyi7173/article/details/125860103
python环境中安装gdal后,在环境的site-package文件下可以找到文件夹,这两个文件位置不一定是必要的,但是如果你的程序中异常报错时,需要明确gdal和proj位置。
3.了解文件结构
这里提供了一段python代码,需要提供shp文件所在位置
import os
from django.contrib.gis.gdal import DataSource
from django.contrib.gis.geos import GEOSGeometry, MultiPolygon, Polygon
os.environ['GDAL_DATA'] = r"C:\Users\lenovo\PycharmProjects\1025\Mercury\Discern\venv\Lib\site-packages\osgeo\data\gdal"
os.environ['PROJ_LIB'] = r"C:\Users\lenovo\PycharmProjects\1025\Mercury\Discern\venv\Lib\site-packages\osgeo\data\proj"
url = r'C:\Users\lenovo\Desktop\矢量数据_广东\ROI_polygon_project.shp'
ds = DataSource(url)
ly = ds[0]
f = ly[0]
g = GEOSGeometry(f.geom.ewkt)
获得的结果如下图
三、通过django写入数据库
这里参考本站替他文章,参考链接:
models.py用于管理数据库字段,内容如下:(不要忘了makemigrations和migrate)
from django.contrib.gis.db import models
from django.utils import timezone
class SarLayer(models.Model):
id = models.AutoField(primary_key=True)
create_time = models.DateTimeField('创建时间', default=timezone.now)
alter_time = models.DateTimeField('修改时间', auto_now=True)
geom = models.MultiPolygonField(null=True) # 地理信息
area = models.FloatField('面积', default=0)
file_shp = models.CharField('应用提取shp文件位置', max_length=1024, default='')
class Meta:
verbose_name = '图层数据'
verbose_name_plural = verbose_name
views.py文件中的读取shp并写入数据库,因为shp存储的内容不同,尽量判断矢量形状,我这里都是多边。
from .models import SarLayer
def ct():
l = {}
file = r'C:\Users\lenovo\Desktop\矢量数据_广东\ROI_polygon_project.shp'
ds = DataSource(file)
mult_list = []
area = 0
for feature in ds[0]:
if feature.geom_type == 'Polygon':
mult_list.append(GEOSGeometry(feature.geom.ewkt))
area += feature.geom.area
l['area'] = area
l['geom'] = MultiPolygon(mult_list)
l['file_shp'] = file
SarLayer.objects.create(**l)
总结
以上就是今天要讲的内容,geodjango的功能还很强大,碰到具体问题需要具体分析。