GeoDjango教程[3]

Geodjango Model API


本文档详细说明了Geodjango Model API,通过本章节,我们将可以使用如下ZIP编码的地
理模型。
from django.contrib.gis.db import models
classZipcode(models.Model):
    code
= models.CharField(max_length=5)
    poly
= models.PolygonField()
    objects
= models.GeoManager()
Geometry的种类 下列每种类均对应于OpenGIS的一种简单地物定义。 GeometryField class GeometryField PointField class PointField LineStringField class LineStringField PolygonField class PolygonField MultiPointField class MultiPointField MultiLineStringField class MultiLineStringField MultiPolygonField class MultiPolygonField GeometryCollectionField class GeometryCollectionField Geometry的属性 除了Django模型的一般属性外,Geometry还具有如下特殊属性。他们都是可选的。 Srid GeometryField.srid 设置SRID(空间参照系统代码)为特定值。默认值为4326(即WGS84坐标系,以经纬度为度 量单位) 选择一个SRID 应当仔细考虑选取一个合适的SRID,这对你的模型很重要。SRID是一个整数,代表了某个 坐标系。而投影往往是和某地的坐标系相关的。虽然geodesy的细节不在这里讨论,但地球 是一个椭球体但表达地球的手段(如地图)却不是那个形状的。 人们一般都习惯于通过经纬度来描述地球上的一个位置。然而,经纬度是角度,而非长度 。换句话说,在平面上两点之间的最短距离是一条直线段,但球面上的亮点最短距离却是 球大圆的一段圆弧。因此,获取球面距离需求额外的计算过程。使用地理坐标系可能带来 后续的麻烦。例如,PostGIS 1.4及以下版本并不能进行非点状物的距离计算,诸如查询在 WGS84坐标系下距离某一县界5英里范围内的点。 投影往往只在某部分区域是最合适应用的。如你知道数据库中的地物范围在北堪萨斯境内 ,则你应当考虑使用适用于当地的投影。此外,投影系是使用长度单位的(如米或英尺) 。 注:如果你要完成非点状物的距离计算,则请安装1.5以上版本的PostGIS。 补充阅读:http://spatialreference.org/ 一个关于Django空间坐标系的数据库 http://welcome.warnercnr.colostate.edu/class_info/nr502/lg3/datums_coordinates /spcs.html 介绍了适用于美国的各类投影系。 Spatial_index GeometryField.spatial_index 默认为True。创建空间索引。 注:空间索引不同于数据库索引。前者创建的是R树,而后者创建的则是B树。 dim GeometryField.dim 用于定义坐标系的维度。默认为2维,支持3维。 注:三维支持需要安装GEOS 3.1,并仅限于PostGIS。 geography GeometryField.geography 如果为True,数据库将创建地理坐标系,而非几何坐标系。 注:需要1.5版本以上PostGIS支持,并且SRID限定于4326。 地理种类 支持地理运算,如 • bboverlaps • coveredby • covers • intersects GeoManager class GeoManager 为了支持地理查询,每个地理模型需要定义一个GeoManager。否则,SQL查询中的地理条件 将是无效的。即使模型 本身没有地理字段,但外键与其他模型字段时,也需要定义 GeoManager。例如下面有一个Address模型外键与一个Zipcode模型。
from django.contrib.gis.db import models
from django.contrib.localflavor.us.models importUSStateField
classAddress(models.Model):
    num
= models.IntegerField()
    street
= models.CharField(max_length=100)
    city
= models.CharField(max_length=100)
    state
=USStateField()
    zipcode
= models.ForeignKey(Zipcode)
    objects
= models.GeoManager()
在Address中仍然需定义GeoManager以便对Zipcode模型进行空间查询。
posted @ 2013-01-19 01:14  columbus2  阅读(1032)  评论(0编辑  收藏  举报