在下面的查询中,使用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预测中geometry
为GEOSGeometry
(SRID 5514)。为了使ST_Intersection工作,我需要在同一个投影中,所以我在相应的投影中添加了字段area_krovak
。但查找=geometry
中的area_krovak__intersects=geometry
部分会产生以下SQL(当我打印.query
时)
ST_Transform(ST_GeomFromEWKB('blabla'::bytea), 4326)
由于某些原因,Django将其转换为4326,因此无效。
答案 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
只是解决了它