【问题标题】:GeoDjango ORM lookup wrongly transforms geometry to unwanted SRID in SQLGeoDjango ORM 查找错误地将几何转换为 SQL 中不需要的 SRID
【发布时间】:2016-11-11 18:48:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: python django postgis geodjango


    【解决方案1】:
    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 即可解决问题

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      相关资源
      最近更新 更多