簡體   English   中英

如何在GeoDjango中轉換多邊形?

[英]How to translate a polygon in GeoDjango?

我有一個包含多邊形字段的Place模型:

from django.contrib.gis.db import models

class Place(models.Model):
    area = models.PolygonField()

我想翻譯此Place模型的實例的area字段。

這是我現在正在做的事情:

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的“ db”。 沒有Python函數,這些是類(因此,名稱中的首字母大寫)允許您訪問數據庫系統的空間功能(通常由空間數據庫擴展(例如SQLite的空間數據庫或PostgreSQL的PostGIS)提供)。 請參閱GeoDjango文檔

此頁面上記錄的功能允許用戶訪問要在Django中的注釋聚合過濾器中使用的地理數據庫功能。

(強調我的。)

也就是說,這些只能在查詢中使用 ,因為空間計算工作被卸載到數據庫中。

那么,您可以做什么而不是做幾個查詢呢?

update查詢

如果直接在SQL中執行此操作,則可能會編寫UPDATE查詢。 Django ORM允許您使用update()方法從Django執行相同的操作。

它可能看起來像這樣(未經測試):

Place.objects.filter(pk=1).update(area=Translate('area', 0.001, 0.001))

如果仍然使用GeoDjango,則這可能是首選方式。

外部(Python)庫

如你所說,你可以使用一個外部庫,而不是GeoDjango內置的的Translate ,如shapely.affinity.translateshapely 但是,我懷疑它將接受GeoDjango的django.contrib.gis.geos.GEOSGeometry作為輸入,因此您可能必須通過GeoJSON或WKT來回轉換。

如果需要空間計算獨立於基礎數據庫系統,請使用此方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM