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 就解决了它
在下面的查询中,使用 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 就解决了它