Django - 以geoJSON格式获取多边形的质心

时间:2016-10-17 10:04:22

标签: python django django-rest-framework postgis django-rest-framework-gis

我正在构建一个REST API来管理与地理相关的数据。 我的前端开发人员希望以geoJSON格式检索多边形的质心,具体取决于缩放级别。 我的多边形模型如下: ... 从django.contrib.gis.db导入模型作为地理模型 class Polygon(geomodels.Model):     fk_owner = models.ForeignKey(User,on_delete = models.DO_NOTHING,blank = True)     external_id = models.CharField(max_length = 25,unique = True)     func_type = models.CharField(max_length = 15)     coordinates = geomodels.PolygonField(srid = 3857)     properties = JSONField(默认= {}) API目前返回如下内容: “type”:“FeatureCollection”, “特征”: [  {      “type”:“Feature”,      “几何”:{          “type”:“Polygon”,          “坐标”:[[[..]]]       }   }] 我使用rest_framework_gis.serializers.GeoFeatureModelSerializer来序列化我的数据。 我看到了以下获得质心的方法: 向我的模型添加列质心:我不想这样做 创建我的模型的数据库视图:Django不管理数据库视图,我不想编写自定义迁移 使用相同的模型并在我的orm语句中添加一个额外的(...):我尝试过但在序列化之前或之前事情变得很难,因为在模型中类型是Polygon,而质心是Point。错误如下: 类型错误:     无法使用类型值设置Polygon SpatialProxy(POLYGON):     < class'django.contrib.gis.geos.point.Point'> 预期产量应为: “type”:“FeatureCollection”, “特征”: [  {      “type”:“Feature”,      “几何”:{          “type”:“Point”,          “坐标”:[..]       }   }] 你有什么意见 ?

1 个答案:

答案 0 :(得分:1)

您可以使用以下方法的组合:

  1. AsGeoJSON,其中
      

    接受单个地理字段或表达式,并返回几何体的GeoJSON表示。

  2. Centroid()
      

    接受单个地理字段或表达式,并返回几何体的质心值。

  3. .annotate()
      

    使用提供的查询表达式列表注释QuerySet中的每个对象。
      [...]
      annotate()的每个参数都是一个注释,将添加到返回的QuerySet中的每个对象。

  4. 示例:

    以下查询:

    Polygon.objects.annotate(geometry=AsGeoJSON(Centroid('coordinates')))
    

    会向'geometry'查询集添加一个名为Polygon的字段,该字段将包含根据给定模型的每个coordinates对象的Polygon字段计算的质心。