> 文章列表 > 【GeoDjango框架解析】空间方法的ORM查询

【GeoDjango框架解析】空间方法的ORM查询

【GeoDjango框架解析】空间方法的ORM查询

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

Django数据操作-ORM

第一章 【Django开发入门】ORM的增删改查和批量操作
第二章 【Django开发入门】ORM查询分页以及返回Json格式


文章目录

  • Django数据操作-ORM
  • 前言
  • 一、开发环境搭建
  • 二、参数查询空间方法
    • 1.点的查询
    • 2.圆的查询
    • 3.多边和多多边
  • 三、聚合的空间方法
    • 1.IsValid是否是有效图形
    • 2.MakeValid建立有效几何图形
    • 3.Union建立2个图形并集
    • 4.Intersection建立2个图形交集
    • 5.Transform转换SRID坐标系
    • 6.面积计算
    • 7.Buffer建立缓冲区
    • 8.其他

前言

通过前面的ORM使用,我们看到ORM在开发中可以提供很大便利,基于国内讲解Geodjango使用的教程比较少,我这里整理了基于postgis数据库的orm空间查询的相关方法。
如果使用的是其他数据库,不能保障空间方法生效。


一、开发环境搭建

开发环境很是重要,尤其是geodjango环境搭建会出现很多问题,我在其他博客中已经给出相关介绍,可以参考。

【GeoDjango框架解析】配置geodjango开发环境
【Linux安装数据库】Ubuntu安装postgresql并连接navicat添加链接描述
【GeoDjango框架解析】conda环境下安装psycopy2版本问题

二、参数查询空间方法

因为业务的关系,我这里主要介绍的都是包含的处理方法,包括点、圆、多边范围查询。

1.点的查询

search_dict = {}
# point是history表的一个字段 models.PointField("点", null=True)
q = Q(geom__contains=history.point)
A.objects.filter(**search_dict).filter(q)

2.圆的查询

search_dict = {}
# point是history表的一个字段 models.PointField("点", null=True)
# diameter是圆的半径,单位m
q = Q(geom__distance_lte=(history.point, str(history.diameter)))
A.objects.filter(**search_dict).filter(q)

3.多边和多多边

search_dict = {}
# geometrycollection是history表的一个字段 
# geometrycollection = models.GeometryCollectionField('混合数据', null=True)
q = Q(geom__intersects=history.geometrycollection)
A.objects.filter(**search_dict).filter(q)

三、聚合的空间方法

在geodjango中使用的空间方法都是基于aggregate的方法,这里需要掌握django的聚合方法。

其实django官网给出了相关方法,但是没有相关样例,使用过程中很难嵌入orm查询。我这里找到一个中文版的文档。接下来我会以我实际使用的相关功能来介绍。
【GeoDjango框架解析】空间方法的ORM查询

1.IsValid是否是有效图形

2.MakeValid建立有效几何图形

3.Union建立2个图形并集

4.Intersection建立2个图形交集

5.Transform转换SRID坐标系

6.面积计算

虽然官方文档提供了相关函数,但是那个给出的面积不是真实的面积,需要使用Transform转换为3857坐标系后的面积

7.Buffer建立缓冲区

country = County.objects.filter(name='中华人民共和国', type='country').first()
# 判断点是否在国界线内,point_ 的结果是True 和False
point = 'POINT(116 38)'
point_ = country.geom.contains(point)# 因为country的几何图形可能存在不规则,需要用buffer,width的单位是度数(经纬度)
point_ = country.geom.buffer(width=0.01).contains(point)

8.其他

pic_in = pics.aggregate(in_area=Area(Intersection(Union(MakeValid('geom')), search_geom)))
print('pic_in', pic_in['in_area'])
cover_area = pic_in['in_area'].sq_km
cover_area = pic_in['in_area'].sq_m