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,而且我仍然没有找到以最佳方式序列化它的方法。
运气不好:/
您将点设置为geography,因此您无法使用自定义GeoFunc来应用 PostGISST_X和ST_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标准提供了一些非常方便的序列化技巧。
| 归档时间: |
|
| 查看次数: |
1838 次 |
| 最近记录: |