我正在构建一个 REST API 来管理与地理相关的数据。
我的前端开发人员想要根据缩放级别以 geoJSON 格式检索多边形的质心。

我的多边形模型如下:

...
from django.contrib.gis.db import models as geomodels
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(default={})

API 目前返回如下内容:
"type": "FeatureCollection",
"features": [
 {
     "type": "Feature",
     "geometry": {
         "type": "Polygon",
         "coordinates": [[[..]]]
      }
  }]

我使用 rest_framework_gis.serializers.GeoFeatureModelSerializer 来序列化我的数据。

我看到以下获取质心的方法:
  • 向我的模型添加一个列质心:我不想这样做
  • 创建我的模型的数据库 View :Django 不管理数据库 View ,我不想编写自定义迁移
  • 使用相同的模型并将 extra(...) 添加到我的 orm 语句中:我尝试过但在序列化之前或之前事情变得困难,因为在模型中类型是 Polygon ,质心是 Point 。错误如下:
    TypeError:
        Cannot set Polygon SpatialProxy (POLYGON) with value of type:
        <class 'django.contrib.gis.geos.point.Point'>
    

  • 预期的输出应该是:
    "type": "FeatureCollection",
    "features": [
     {
         "type": "Feature",
         "geometry": {
             "type": "Point",
             "coordinates": [..]
          }
      }]
    

    你有什么意见 ?

    最佳答案

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

  • AsGeoJSON ,其中

  • Centroid() 其中

  • .annotate() 其中


  • 示例:
    以下查询:
    Polygon.objects.annotate(geometry=AsGeoJSON(Centroid('coordinates')))
    
    将一个名为 'geometry' 的字段添加到 Polygon 查询集中,该查询集将包含从给定模型的每个 coordinates 对象的 Polygon 字段计算的质心。

    关于python - Django - 以 geoJSON 格式获取多边形的质心,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40083521/

    10-13 01:11