python - 如何在 GeoDjango 中翻译多边形?
问题描述
我有一个Place
具有多边形字段的模型:
from django.contrib.gis.db import models
class Place(models.Model):
area = models.PolygonField()
我想翻译这个模型area
的一个实例的字段。Place
这是我现在的做法:
from django.contrib.gis.db.models.functions import Translate
place = Place.objects.get(pk=1)
place.area = Place.objects.filter(pk=place.pk).annotate(new_area=Translate('area', 0.001, 0.001)).first().new_area
place.save()
这似乎很hacky。我认为应该有一种方法可以通过以下方式做到这一点:
place = Place.objects.get(pk=1)
place.area = Translate(place.area, 0.001, 0.001)
place.save()
但这会引发异常。
我应该使用一些图书馆吗?哪一个适用于 GeoDjango 及其模型/字段?
更好的方法是什么?
解决方案
请注意django.contrib.gis.db.models.functions
. 没有 Python 函数,这些是类(因此名称中的首字母大写)允许您访问数据库系统的空间函数(通常由空间数据库扩展提供,如 SQLite 的 spatialite 或 PostGIS for PostgreSQL)。请参阅GeoDjango 文档
此页面上记录的函数允许用户访问地理数据库函数以在 Django中的注释、聚合或过滤器中使用。
(强调我的。)
也就是说,这些只能在查询中使用,作为卸载到数据库的空间计算工作。
那么,除了进行多次查询之外,您还能做什么呢?
update
询问
如果您直接在 SQL 中执行此操作,您可能会编写一个UPDATE
查询。Django ORM 允许您使用 Djangoupdate()
方法执行相同的操作。
它可能看起来像这样(未经测试):
Place.objects.filter(pk=1).update(area=Translate('area', 0.001, 0.001))
如果您仍然使用 GeoDjango,这可能是首选方式。
外部(Python)库
正如您所建议的,您可以使用外部库而不是 GeoDjango 的Translate
,例如shapely.affinity.translate
来自shapely
library。但是,我怀疑它是否会接受 GeoDjangodjango.contrib.gis.geos.GEOSGeometry
作为输入,因此您可能必须通过 GeoJSON 或 WKT 来回转换。
如果您需要空间计算独立于底层数据库系统,请使用此方法。
推荐阅读
- java - 如何在由 String 标识的类上调用 main 方法
- firebase - 如何使用 Firebase 存储实现 CDN?
- python - Scrapy 403 未知原因,scrapy 挂在 shell 中
- python - 无法理解错误:OSError: [Errno 9] Bad file descriptor
- c# - UserPrincipal.当前超时
- node.js - 保护您的 API 密钥不被窃取或滥用
- amazon-ec2 - 与 --force-new-deployment 选项一起使用时,ECS update-service 命令是否会将容器实例状态标记为耗尽?
- python - Python:访问我的超类的实例
- angular - 在 Angular 中执行 HTTP 请求时未显示加载微调器
- c++ - 制作
Mac 上的标头错误