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

GeoDjango ORM lookup wrongly transforms geometry to unwanted SRID in SQL

在下面的查询中,使用 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)。 geometry 在克罗瓦克投影 (SRID 5514) 中是 GEOSGeometry。为了使 ST_Intersection 工作,我需要在同一个投影中使用它们,所以我在相应的投影中添加了字段 area_krovak。但是查找 area_krovak__intersects=geometry 中的 =geometry 部分导致以下 SQL (当我打印 .query

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

出于某种原因,Django 将其转换为 4326,因此它不起作用。

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 就解决了它