我使用postgis实现了GeoDjango。
这是我的模特:
...
geometria = models.PolygonField(srid=4326, null=True)
...
当我打电话给 data.area 时,它会返回一个浮点数,但我没有关于它的测量单位的任何线索,这是一个问题,因为我想要测试它是否在平方米的预设区域中更大。
你能帮助我吗?
答案 0 :(得分:3)
如果您要处理地图上的大片区域,则应设置
geometria = models.PolygonField(srid=4326, null=True, geography=True)
如geodjango的文档https://docs.djangoproject.com/en/dev/ref/contrib/gis/model-api/#geography
中所述地理类型在PostGIS 1.5中,引入了地理类型 - 它 为表示的空间特征提供原生支持 地理坐标(例如,WGS84经度/纬度)。 [7]不同于 几何类型使用的平面,地理类型使用球形 表示其数据。距离和测量操作 在地理栏上执行自动采用大圆弧 计算和返回线性单位。换句话说,当ST_Distance 在两个地理位置上调用,返回以米为单位的值(如 如果在WGS84中的几何列上调用,则与度相反。)
如果您没有geography=True
,我们将事物存储为普通几何图形,我们需要将square degrees
(您获得的浮点结果)转换为您更喜欢的度量单位因为我们无法从地理坐标计算面积。我们可以改为在投影坐标空间中添加辅助方法来进行转换:
def get_acres(self):
"""
Returns the area in acres.
"""
# Convert our geographic polygons (in WGS84)
# into a local projection for New York (here EPSG:32118)
self.polygon.transform(32118)
meters_sq = self.polygon.area.sq_m
acres = meters_sq * 0.000247105381 # meters^2 to acres
return acres
我们使用哪种投影取决于数据的范围,以及我们对结果的准确程度:这里我已经用纽约部分的特定投影进行了说明,但如果您的数据不是特别准确,那么您可以很容易替换全局投影或只使用简单的公式。