Django - 以geoJSON格式获取多边形的质心
Django - Get centroid of polygon in geoJSON format
我正在构建一个 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 目前 returns 事情是这样的:
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [[[..]]]
}
}]
我使用 rest_framework_gis.serializers.GeoFeatureModelSerializer
序列化我的数据。
我看到以下获取质心的方法:
- 向我的模型添加一个列质心:我不想这样做
- 创建我的模型的数据库视图:Django 不管理数据库视图,我不想编写自定义迁移
使用相同的模型并在我的 orm 语句中添加一个 extra(...)
:我试过了,但是在序列化中或序列化之前事情变得很困难,因为在模型中类型是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
,其中
Accepts a single geographic field or expression and returns a GeoJSON representation of the geometry.
Centroid()
其中
Accepts a single geographic field or expression and returns the centroid value of the geometry.
.annotate()
其中
Annotates each object in the QuerySet with the provided list of query expressions.
[...]
Each argument to annotate()
is an annotation that will be added to each object in the QuerySet that is returned.
示例:
以下查询:
Polygon.objects.annotate(geometry=AsGeoJSON(Centroid('coordinates')))
将向 Polygon
查询集添加一个名为 'geometry'
的字段,该查询集将包含从给定模型的每个 Polygon
对象的 coordinates
字段计算出的质心。
我正在构建一个 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 目前 returns 事情是这样的:
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [[[..]]]
}
}]
我使用 rest_framework_gis.serializers.GeoFeatureModelSerializer
序列化我的数据。
我看到以下获取质心的方法:
- 向我的模型添加一个列质心:我不想这样做
- 创建我的模型的数据库视图:Django 不管理数据库视图,我不想编写自定义迁移
使用相同的模型并在我的 orm 语句中添加一个
extra(...)
:我试过了,但是在序列化中或序列化之前事情变得很困难,因为在模型中类型是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
,其中Accepts a single geographic field or expression and returns a GeoJSON representation of the geometry.
Centroid()
其中Accepts a single geographic field or expression and returns the centroid value of the geometry.
.annotate()
其中Annotates each object in the QuerySet with the provided list of query expressions.
[...]
Each argument toannotate()
is an annotation that will be added to each object in the QuerySet that is returned.
示例:
以下查询:
Polygon.objects.annotate(geometry=AsGeoJSON(Centroid('coordinates')))
将向 Polygon
查询集添加一个名为 'geometry'
的字段,该查询集将包含从给定模型的每个 Polygon
对象的 coordinates
字段计算出的质心。