我已经使用 postgis 实现了 GeoDjango。
这是我的模型:
...
geometria = models.PolygonField(srid=4326, null=True)
...
当我调用data.area时,它返回一个浮点数,但我没有任何关于它的测量单位的线索,这是一个问题,因为我想测试它是否大于以平方米为单位的预设区域。
你能帮助我吗?
我已经使用 postgis 实现了 GeoDjango。
这是我的模型:
...
geometria = models.PolygonField(srid=4326, null=True)
...
当我调用data.area时,它返回一个浮点数,但我没有任何关于它的测量单位的线索,这是一个问题,因为我想测试它是否大于以平方米为单位的预设区域。
你能帮助我吗?
如果您正在处理地图上的大面积区域,则应设置
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
我们使用哪种投影取决于数据的范围,以及我们需要结果的准确程度:这里我用纽约部分地区的特定投影进行了说明,但如果您的数据不是特别准确,您可以轻松替换全局投影或仅使用简单的公式。