2012-11-12 128 views
2

我已经使用postgis实现了GeoDjango。GeoDjango多边形区域

这里是我的模型:

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

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

你能帮我吗?

回答

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 

该突出我们使用依赖于数据的程度,以及我们如何准确需要的结果:在这里,我并以纽约部分地区的具体预测为例进行说明,但如果您的数据不是特别准确,则可以轻松替换全球预测或仅使用一个简单公式。

+1

self.polygon.area返回一个浮点数,因此没有sq_m属性 – rawbeans