2014-03-27 62 views
1

我想在Django改造幾何列如何變換幾何列,這裏是我的模型使用GeoDjango內置

class Network(models.Model): 
    name = models.CharField(max_length=50, blank=True) 
    alias = models.CharField(max_length=100, blank=True) 
    geometry = models.GeometryField(srid=3857, null=True, blank=True) 
    bbox = models.GeometryField(srid=3857, null=True, blank=True) 
    objects = models.GeoManager() 

    class Meta: 
     db_table = u'tbl_network' 

    def __unicode__(self): 
     return '%s' % self.name 

我試圖改變BBOX列,但GeoQuerySet自動tranforms 幾何

Network.objects.transform(srid=3857).values('geometry','bbox') 

上述django的查詢的SQL查詢輸出

SELECT ST_Transform("tbl_network"."geometry", 3857), "tbl_network"."bbox" FROM "tbl_network" 

所以我嘗試了不同的方式,現在我排除幾何欄上方的Django查詢

Network.objects.transform(srid=3857).values('bbox') 

SQL查詢輸出

SELECT "tbl_network"."bbox" FROM "tbl_network" 

現在GeoQuerySet完全無視變換函數。

所以我的問題是:我如何轉換特定的模型列?

我從這個Django的論壇,回覆,但我不明白什麼是與多個幾何列問題

「我看到這麼一號查詢作品:第二個不能做 變換。我認爲這個問題可能與你具有相同的PostGIS表2個 幾何列。

都是他們在POSTGIS的GEOMETRY_COLUMNS視圖中列出。 通常只有1個可以是默認的。在這種情況下的幾何形狀,所以 Geodjango/Postgis將其視爲空間專欄。但是當它到達bbox時,它不能識別它,並且不知道什麼是(012)當前),所以變換不起作用。

一種選擇是返回數據,然後將其轉換爲 將空間對象變爲python變量。 ?「

任何人都可以解釋這個答覆

回答

3

在你的模型,你有兩個幾何領域:。geometrybbox幾何領域的大多數方法(如變換)使用的字段作爲默認的一個呼叫該方法將隻影響該特定字段,並且第二個幾何字段將保持不變。

要轉換兩個幾何,必須調用兩次轉換方法,每個字段一次,可以使用field_name指定字段參數如django docs here中所述。

與您的模型,你可以做到以下幾點:

# Get network models 
queryset = Network.objects.all() 

# Transform geometry field 
queryset = queryset.transform(3857, field_name='geometry') 

# Transform bbox field 
queryset = queryset.transform(3857, field_name='bbox') 

此外,從讀你的榜樣,我如果使用bbox字段表示geometry領域的邊框疑惑。如果是這種情況,則存儲冗餘信息,您可以刪除bbox字段。只需使用GEOSGEometry extent property讓你的幾何形狀的邊框,那麼你也只需要改造的主要幾何:

# Network model with only one geometry field 
class Network(models.Model): 
    name = models.CharField(max_length=50, blank=True) 
    alias = models.CharField(max_length=100, blank=True) 
    geometry = models.GeometryField(srid=3857, null=True, blank=True) 
    objects = models.GeoManager() 

然後

# Transform geometry field (which is the default if there is only one geom field) 
queryset = Network.objects.all().tansform(3857) 

# Bbox coordinates of first geometry in new coordinates 
ntwork = queryset[0] 
bbox = ntwork.geometry.extent