5

在我的模型中,我定义了一个多边形字段

polygon = models.PolygonField(srid=4326, geography=True, null=True, blank=True)

当我想确定多边形的面积时,我打电话

area_square_degrees = object.polygon.area

但是如何使用 GeoDjango 将平方度的结果转换为 m2?这个答案不起作用,因为area没有方法sq_m。是否有任何内置转换?

4

4 回答 4

5

您需要将数据转换为正确的空间参考系统。

area_square_local_units = object.polygon.transform(srid, clone=False).area

在英国,您可能会使用使用仪表的英国国家电网 SRID 27700。

area_square_meters = object.polygon.transform(27700, clone=False).area

您可能想要也可能不想克隆几何图形,具体取决于您是否需要在其未转换状态下对其进行任何其他操作。

文档在这里https://docs.djangoproject.com/en/1.8/ref/contrib/gis/geos/

于 2015-08-23T20:43:02.710 回答
3

我为此苦苦挣扎,因为我找不到干净的解决方案。诀窍是您必须使用 postgis 功能(因此它仅适用于 postgis..):

from django.contrib.gis.db.models.functions import Area
loc_obj = Location.objects.annotate(area_=Area("poly")).get(pk=??)  
# put the primary key of the object

print(loc_obj.area_)  # distance object, result should be in meters, but you can change to the unit you want, e.g  .mi for miles etc..

模型.py:

class Location(models.Model):
    poly = gis_models.PolygonField(srid=4326, geography=True)

如果您必须处理地理坐标而不是投影,我认为这是最好的方法。它确实处理了地球的曲线计算,即使距离/面积很大,结果也很精确

于 2017-09-01T09:43:25.743 回答
1

我需要一个应用程序来获取全球 poligons 的区域,如果我使用了无效的国家/地区投影,我得到了错误OGRException: OGR failure

我结束了使用 4326 投影(是默认投影)的OpenLayers 实现 ,以避免涉及每个国家/地区的特定投影。这是我的代码:

import math

def getCoordsM2(coordinates):
    d2r = 0.017453292519943295  # Degrees to radiant
    area = 0.0
    for coord in range(0, len(coordinates)):
        point_1 = coordinates[coord]
        point_2 = coordinates[(coord + 1) % len(coordinates)]
        area += ((point_2[0] - point_1[0]) * d2r) *\
            (2 + math.sin(point_1[1] * d2r) + math.sin(point_2[1] * d2r))
    area = area * 6378137.0 * 6378137.0 / 2.0
    return math.fabs(area)

def getGeometryM2(geometry):
    area = 0.0
    if geometry.num_coords > 2:
        # Outer ring
        area += getCoordsM2(geometry.coords[0])
        # Inner rings
        for counter, coordinates in enumerate(geometry.coords):
            if counter > 0:
                area -= getCoordsM2(coordinates)
    return area

只需将您的几何图形传递给getGeometryM2函数,您就完成了!我在我的 GeoDjango 模型中将此函数用作属性。希望能帮助到你!

于 2015-11-16T18:02:20.733 回答
-3

如果您所说的地球表面积,1平方度有12,365.1613平方公里。因此,将您的平方度数乘以 10^6 以转换为米。

于 2014-01-22T09:30:17.463 回答