GeoDjango ORM查找错误地将几何转换为SQL中不需要的SRID

时间:2016-11-11 18:48:17

标签: python django postgis geodjango

在下面的查询中,使用geometry变量的查找错误地将geometry转换为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在db a MultipolygonField()中,在db中默认为SRID 4326(WGS84)。 Krovak预测中geometryGEOSGeometry(SRID 5514)。为了使ST_Intersection工作,我需要在同一个投影中,所以我在相应的投影中添加了字段area_krovak。但查找=geometry中的area_krovak__intersects=geometry部分会产生以下SQL(当我打印.query时)

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

由于某些原因,Django将其转换为4326,因此无效。

1 个答案:

答案 0 :(得分: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)

使用适当的SRID添加output_field只是解决了它