从经度/纬度迁移到GeoDjango积分?

时间:2018-01-17 03:57:22

标签: django postgis

使用Django ORM,Postgres / PostGIS和Django迁移,如何将现有的longitudelatitude浮点字段转换为单个GeoDjango Point字段?

我正在寻找类似Location.objects.update(point=(F('longitude'), F('latitude')))的内容。

2 个答案:

答案 0 :(得分:4)

假设您有一个像

这样的PointField的对象
from django.contrib.gis.db import models

class Location(models.Model):
    longitude = models.FloatField()
    latitude = models.FloatField()
    point = models.PointField(geography=True, default='POINT(0.0 0.0)') #or similar
你可以这样做:

from django.contrib.gis.geos import Point

for l in Location.objects.all():
    l.point = Point(x=l.longitude, y=l.latitude, srid=4326)
    l.save()

或者如果您真的想要单个更新(但未经测试),则此单个语句应该有效:

Location.objects.all().update(point=Point(x=F('longitude'), y=F('latitude'), srid=4326))

注意:虽然我已经使用了GeoDjango和postgis,但我并不是它的专家。我不知道PointField在幕后做了什么......如果它创建了一个关系,那么它将无法在单个语句中工作,因为Django不允许在更新语句中跨表更新,你必须循环,如果它只是格式化数据然后它应该工作正常...我做了一点研究,似乎srid是唯一的关系,所以这应该没关系,因为创建静态关系很好在更新声明中。

从您上面发布的答案中抽取,您只需将其作为一个函数(例如,名为set_points)写入您的迁移文件中,然后将其添加到迁移的操作部分中以运行它:

migrations.RunPython(set_points),

迁移编写参考:

https://docs.djangoproject.com/en/2.0/howto/writing-migrations/

答案 1 :(得分:0)

我想我在https://stackoverflow.com/a/37487182/237091找到了解决方案。仍然会更喜欢不会掉到SQL的解决方案。