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

2024-06-02 05:31:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的查询中,lookup with 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在dba中MultipolygonField(),在db中默认有srid4326(WGS84)。geometry是Krovak投影中的GEOSGeometry(SRID 5514)。为了使stu交集工作,我需要在相同的投影中同时使用这两个元素,所以我在相应的投影中添加了字段area_krovak。但是lookup中的=geometry部分area_krovak__intersects=geometry会产生以下SQL(当我打印.query

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

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


Tags: sql错误withtransformarealookup投影st
1条回答
网友
1楼 · 发布于 2024-06-02 05:31:38
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就解决了这个问题

相关问题 更多 >