【GeoDjango】如何读取文件写入postgis数据库

原文作者:我辈理想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。

系列文章目录

【GeoDjango框架解析】读取矢量数据写入postgis数据库



前言

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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我辈李想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值