Geodjango:transform不正确地交换经/纬度

问题描述

我正在使用geodjango并按以下方式加载shapefile:

datasource = DataSource("/path/to/shape.shp")
for each in datasource[0]:
    geo = each.geom    
    geo.transform(4326)

在这里要做的是将几何转换为4326,以便可以将其记录在使用此SRID的数据库中。但是,发生了一件相当奇怪的事情。当我在本地运行此命令(使用GDAL 2.4.0,Django 3.0.6)时,此方法运行良好。这是经过变换的多边形的示例。

输入:

polyGON((141192.63413501 167690.231242441,141198.39365501 167695.515882441 ...

然后将其转换为:

polyGON((4.24376514198078 50.8195815928706,4.24384675060931 50.819629186136 ...

这很好。但是,当它在生产环境中运行(GDAL 3.0.4,Django 3.0.3)时,这将以非常奇怪的方式失败。没有错误消息,transform()函数完成了它的工作……但它会颠倒纬度和经度!所以我的输出变成:

polyGON((50.8195818670687 4.24376485512428,50.8196294603646 4.24384646375124 ...

我无法理解为什么会这样...?!一切似乎都很好,请期待这种非常奇怪的经/纬度交换。

解决方法

问题是您正在使用不同的环境进行开发和生产。

Django 3.0.3 / 3.0.6不会造成问题(但最好使用pip install django==3.0.* -U升级到最新的修补程序版本)。

但是GDAL创建了。在继续使用新版本之前,您至少需要阅读GDAL migration guide

3.0与您似乎遇到的轴有不兼容的更改。

您可以尝试建议使用here的方法:

import osgeo

# ... so something to create and SRS:
srs = SpatialReference()

if int(osgeo.__version__[0]) >= 3:
    # GDAL 3 changes axis order: https://github.com/OSGeo/gdal/issues/1546
    srs.SetAxisMappingStrategy(osgeo.osr.OAMS_TRADITIONAL_GIS_ORDER)

但是您的开发和生产环境必须始终匹配。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...