3

我正在构建一个 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用来序列化我的数据。

我看到以下获取质心的方法:

  1. 向我的模型添加列质心:我不想这样做
  2. 创建我的模型的数据库视图:Django 不管理数据库视图,我不想编写自定义迁移
  3. 使用相同的模型并在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": [..]
      }
  }]

你有什么意见 ?

4

1 回答 1

4

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

  1. AsGeoJSON, 哪个

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

  2. Centroid()哪个

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

  3. .annotate()哪个

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


例子:

以下查询:

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

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

于 2017-06-19T09:20:20.660 回答