Django获取PointField的坐标值

Nar*_*nik 6 python gis django postgis geodjango

我想从以下点x获取坐标:yqueryset

user = User.objects.values('id', 'email', 'username', 'point').first()
Run Code Online (Sandbox Code Playgroud)

这些是我的models

from django.db.models import Model

from django.contrib.gis.db.models import PointField

class BasePointModel(Model):

    point = PointField(null=True, spatial_index=True, geography=True)

    class Meta:
        abstract = True

class User(AbstractUser, BasePointModel, HashableModel):  # type: ignore

    # First Name and Last Name do not cover name patterns
    # around the globe.
    name = CharField(_("Name of User"), blank=True, max_length=255)
    is_online = BooleanField(_("Is online"), default=False)
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

{'id': 85270,
 'email': 'username_0@email.com',
 'username': 'username_0',
 'point': <Point object at 0x7f8e061cc2b8>}
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到一个xand y,用 制作一个查询集values

我想要得到这样的东西:

{'id': 85270,
 'email': 'username_0@email.com',
 'username': 'username_0',
 'point__x': '-4.266398314110177',
 'point__y': '-39.39432682357033'}
Run Code Online (Sandbox Code Playgroud)

我发出从数据库返回 50,000 行的请求,我注意到由于数据序列化,性能变得越来越差。我想通过返回来最小化序列化values

PointField总是返回一个object,而且我仍然没有找到以最佳方式序列化它的方法。

Joh*_*fis 2

运气不好:/
您将点设置为geography,因此您无法使用自定义GeoFunc来应用 PostGISST_XST_Y注释查询,因为它们仅适用于geometry字段。

为了获取查询结果[lat, long]中这些点的值,我们可以用点的表示来注释查询并将它们作为值。为此,我们将使用数据库函数:valuesGeoJSONAsGeoJSON

user = User.objects.annotate(
    point_as_json=AsGeoJSON('point')
).values('id', 'email', 'username', 'point_as_json').first()
Run Code Online (Sandbox Code Playgroud)

这会给我们以下结果:

{
  'id': 85270,
  'email': 'username_0@email.com',
  'username': 'username_0',
  'point_as_json': {
    'type': 'Point',
    'coordinates': [-4.26639831, -39.39432682]
   }
}
Run Code Online (Sandbox Code Playgroud)

作为旁注,您可以考虑增强django-rest-framework` 并在其之上Django with 使用django-rest-framework-gis ,它根据GeoJSON标准提供了一些非常方便的序列化技巧。