GeoPandas .to_crs() не будет работать как часть функции, но будет работать в отдельной программе

#python #geojson #geopandas

Вопрос:

Я пытаюсь перепроектировать один слой точек 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, где все точки имеют координаты 0,00000, 0,00000. В большинстве случаев это даже не отображается в QGIS. Входным параметром для этой функции является путь к файлу GeoJSON для повторного проецирования. Я в порядке с выводом шейп-файла, но просто не могу понять, почему перепроектирование не будет работать так, как раньше.

 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, поэтому буду очень признателен за любую помощь. Дайте мне знать, если потребуется дополнительная информация.

Ответ №1:

Попробуйте использовать это вместо:

 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, и он сработал просто отлично — полученный шейп-файл был идеальным в QGIS.