#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.