4

我已经使用 postgis 实现了 GeoDjango。

这是我的模型:

  ...
  geometria = models.PolygonField(srid=4326, null=True)
  ...

当我调用data.area时,它返回一个浮点数,但我没有任何关于它的测量单位的线索,这是一个问题,因为我想测试它是否大于以平方米为单位的预设区域。

你能帮助我吗?

4

1 回答 1

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

我们使用哪种投影取决于数据的范围,以及我们需要结果的准确程度:这里我用纽约部分地区的特定投影进行了说明,但如果您的数据不是特别准确,您可以轻松替换全局投影或仅使用简单的公式。

于 2012-11-22T15:14:08.113 回答