python - GeoPandas .to_crs() 不能作为函数的一部分工作,但可以在独立程序中使用
问题描述
我正在尝试将单个 GeoJSON 层点从 EPSG:4326 重新投影到 EPSG:3857。当我在一个独立的程序(如下)中单独运行以下代码时,输出与预期的一样。
geojsonSaveDir = 'path_to_input_file'
firePoints4326 = gpd.read_file(geojsonSaveDir)
firePointsReproject = firePoints4326.copy()
firePointsReproject['geometry'] = firePointsReproject['geometry'].to_crs(3857)
print(firePoints4326['geometry'].head())
print(firePointsReproject['geometry'].head())
firePointsReproject.crs = from_epsg(3857)
reprojectSaveDir = geojsonSaveDir.replace('.geojson', '') + '_3857'
firePointsReproject.to_file(reprojectSaveDir)
上述代码的输出是:
0 POINT (-61.56000 -11.96000)
1 POINT (-61.58000 -11.96000)
2 POINT (-59.21000 -11.66000)
3 POINT (-59.23000 -11.66000)
4 POINT (-51.55000 -11.28000)
Name: geometry, dtype: geometry
1 POINT (-6855054.243 -1341156.488)
2 POINT (-6591227.050 -1307038.377)
3 POINT (-6593453.440 -1307038.377)
4 POINT (-5738519.750 -1263874.866)
Name: geometry, dtype: geometry
但是,当我使用完全相同的代码创建函数时,输出是 EPSG:3857 中的 shapefile,其中所有点的坐标均为 0.00000、0.00000。大多数情况下,这甚至不会显示在 QGIS 中。此函数的输入参数是要重新投影的 GeoJSON 文件的路径。我对输出是 shapefile 很好,但只是无法弄清楚为什么重新投影不会像以前那样工作。
def pointReprojector(geojsonSaveDir):
firePoints4326 = gpd.read_file(geojsonSaveDir)
firePointsReproject = firePoints4326.copy()
firePointsReproject['geometry'] = firePointsReproject['geometry'].to_crs(epsg=3857)
print(firePoints4326['geometry'].head())
print(firePointsReproject['geometry'].head())
firePointsReproject.crs = from_epsg(3857)
reprojectSaveDir = geojsonSaveDir.replace('.geojson', '') + '_3857'
firePointsReproject.to_file(reprojectSaveDir)
return reprojectSaveDir
这个的输出是:
0 POINT (-61.56000 -11.96000)
1 POINT (-61.58000 -11.96000)
2 POINT (-59.21000 -11.66000)
3 POINT (-59.23000 -11.66000)
4 POINT (-51.55000 -11.28000)
Name: geometry, dtype: geometry
0 POINT (0.00000 0.00000)
1 POINT (0.00000 0.00000)
2 POINT (0.00000 0.00000)
3 POINT (0.00000 0.00000)
4 POINT (0.00000 0.00000)
Name: geometry, dtype: geometry
我对 GeoPandas 相当陌生,因此非常感谢任何帮助。让我知道是否需要更多信息。
解决方案
尝试改用这个:
def pointReprojector(geojsonSaveDir):
firePoints4326 = gpd.read_file(geojsonSaveDir)
firePointsReproject = firePoints4326.copy()
firePointsReproject['geometry'] = firePointsReproject['geometry'].to_crs('epsg:3857')
print(firePoints4326['geometry'].head())
print(firePointsReproject['geometry'].head())
#firePointsReproject.crs = from_epsg(3857)
reprojectSaveDir = geojsonSaveDir.replace('.geojson', '') + '_3857'
firePointsReproject.to_file(reprojectSaveDir)
return reprojectSaveDir
请注意,重新投影后无需设置 CRS。这就是为什么我评论了这条线。另外,我看到您对to_crs
函数 (to_crs(3857)
和.to_crs(epsg=3857)
) 使用了两种不同样式的输入。只要坚持这种输入方式,你就不会出错:to_crs("epsg:3857")
.
我用下载的 GeoJSON 尝试了上面的代码,结果很好 - 生成的 shapefile 在 QGIS 中非常完美。
推荐阅读
- spring-boot - Keycloak:使用 SpringBoot 进行访问令牌验证
- python - 如何使用 pytest 测试 python 控制台脚本输出?
- apache-kafka - 异常发生时Kafka Event收到10次
- mule - 有没有办法在 DataWeave 2.0 中修剪数字中不必要的零?
- python - 将数据帧索引移动一定数量
- python - 根据条件使用多索引更新熊猫数据框
- c - Visual Studio 编译错误退出状态 1
- java - 如何在 Java 中使用带有 CriteriaBuilder 的 sql 函数?
- python - python中的.doc到.docx的转换
- typescript - 更新的状态未反映在我的 onPress 事件中