【问题标题】:GeoDjango: Calculate and save Polygon area in units upon object creationGeoDjango:在创建对象时以单位计算并保存多边形区域
【发布时间】:2021-09-14 03:31:39
【问题描述】:

我正在努力将多边形的面积保存到数据库中。我希望能够计算面积将其转换为正确的单位,最后将其保存在表格中,但直到现在我还没有找到正确的方法。

到目前为止,我有以下模型,我在其中以平方度计算并保存面积。

class Parcel(models.Model):

    srid = settings.SRID

    geometry =  models.GeometryField(srid=srid, geography=True)
    area = models.FloatField(blank=False, null=True)

    def save(self, *args, **kwargs):
        self.area = self.geometry.area
        super(Parcel, self).save()

为了使用我在其他地方做的英亩面积:

p = Parcel.objects.annotate(area_=Area('geometry')).get(id=parcel_id)
parcel_area = p.area_.standard/1000

但是这个操作有点繁重,因为它会计算所有地块的面积,然后得到所需的地块,而且它不会使用或保存数据库中的面积(英亩)。

我看到有些人转换为具有正确单位的网格,但这对我不起作用,因为我的多边形来自地球各地。

谢谢!

【问题讨论】:

    标签: area geodjango


    【解决方案1】:

    我认为最好的方法是根据 utm 等公制坐标系计算以 m² 为单位的面积。

    这是一个计算它的函数:

    def get_sqm_by_wgs84_polygon(geom: GEOSGeometry) -> float:
        def get_utm_by_wgs_84(cent_lon, cent_lat):
            utm_zone_num = int(math.floor((cent_lon + 180) / 6) + 1)
            utm_zone_hemi = 6 if cent_lat >= 0 else 7
            utm_epsg = 32000 + utm_zone_hemi * 100 + utm_zone_num
            return utm_epsg
    
        lon = geom.centroid.x
        lat = geom.centroid.y
        epsg_code = get_utm_by_wgs_84(lon, lat)
        transformed_geom = geom.transform(epsg_code, clone=True)
        area = transformed_geom.area
        return area
    

    在您的模型中,您可以在创建时保存它:

    class Parcel(models.Model):
    
        srid = settings.SRID
    
        geometry =  models.GeometryField(srid=srid, geography=True)
        area = models.FloatField(blank=False, null=True)
    
        def save(self, *args, **kwargs):
            self.area = get_sqm_by_wgs84_polygon(self.geometry)
            super(Parcel, self).save()
    

    此方法仅适用于 WGS84 (EPSG:4326) 作为输入。从度到米。

    【讨论】:

      猜你喜欢
      • 2012-11-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      相关资源
      最近更新 更多