2016-11-11 28 views
0

在下面的查詢中,使用geometry變量錯誤地將geometry轉換爲SQL中不需要的SRID。GeoDjango ORM查找將SQL錯誤地轉換爲SQL中的不需要的SRID

Buildings.objects.annotate(
    area_krovak=Transform('area', self.KROVAK_SRID), 
    intersection_area=RawSQL('ST_Area(ST_Intersection(ST_Transform(area, {krovak}), ST_GeomFromEWKB(\'\\x{district_geom}\')))'.format(district_geom=geometry.ewkb.hex(), krovak=5514), []) 
).filter(area_krovak__intersects=geometry) 

Building.area是分貝一個MultipolygonField(),在分貝有默認SRID 4326(WGS84)。 geometry在Krovak投影中是GEOSGeometry(SRID 5514)。爲了使ST_Intersection正常工作,我需要在同一個投影中,所以我在相應的投影中添加了字段area_krovak。但=geometry部分查找area_krovak__intersects=geometry導致下面的SQL(當我打印.query

ST_Transform(ST_GeomFromEWKB('blabla'::bytea), 4326) 

出於某種原因,Django的將其轉換爲4326,所以這是行不通的。

回答

0
Buildings.objects.annotate(
    area_krovak=Transform('area', self.KROVAK_SRID, output_field=MultiPolygonField(srid=5514)), 
    intersection_area=RawSQL('ST_Area(ST_Intersection(ST_Transform(area, {krovak}), ST_GeomFromEWKB(\'\\x{district_geom}\')))'.format(district_geom=geometry.ewkb.hex(), krovak=5514), []) 
).filter(area_krovak__intersects=geometry) 

添加output_field適當SRID只是解決了它