空间数据的插入与查询(Django+Postgis)

建表语句

CREATE TABLE soildata
(
  sid character varying(32) NOT NULL,
  stype character varying(32),
  pos geometry,
  CONSTRAINT soildata_pkey PRIMARY KEY (sid)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE soildata
  OWNER TO postgres;

Django模型

from django.contrib.gis.db import models
from django.contrib.gis.db.models.manager import GeoManager

# Create your models here.

class SoilData(models.Model):
    sid = models.CharField(max_length=32, primary_key=True)
    stype = models.CharField(max_length=32)
    pos = models.GeometryField(srid=4326)
    
    objects = GeoManager()
    
    class Meta:
        db_table = 'soildata'

插入空间数据

方式1:原生SQL语句
#encoding:utf-8
import psycopg2

if __name__ == '__main__':
    conn = psycopg2.connect(database="gisdb",user="postgres",password="",host="127.0.0.1",port="5432")
    cursor = conn.cursor()
    
    cursor.execute(
        'insert into soildata values(%s, %s, %s);',
        ("1","棕壤","SRID=4326;POINT(120 38)")
    )
    
    cursor.close()
    conn.commit()
    conn.close()

方式2:Django model

soil = SoilData()
soil.sid = "2"
soil.stype = "红壤"
pos = GEOSGeometry('POINT(%s %s)'%(100,30),4326)
soil.pos = pos
soil.save()

空间关系查询

>>> from django.contrib.gis.geos.geometry import GEOSGeometry
>>> from myapp.models import SoilData
>>> wheres = ['ST_Contains(ST_GeomFromText(%s, 4326), pos)']
>>> wheres_param = ['POLYGON((99 29,99 31,100 29,100 31,99 29))']
>>> dao = SoilData.objects.extra(where=wheres, params=wheres_param)
>>> dao.count()
0
>>> wheres_param = ['POLYGON((99 20,99 31,101 31,101 20,99 20))']
>>> dao = SoilData.objects.extra(where=wheres, params=wheres_param)
>>> dao.count()
1
>>> wheres_param = ['POLYGON((0 0,0 90,180 90,180 0,0 0))']
>>> dao = SoilData.objects.extra(where=wheres, params=wheres_param)
>>> dao.count()
2


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值