GeoPandas устанавливает CRS по точкам

Учитывая следующий GeoDataFrame:

h=pd.DataFrame({'zip':[19152,19047],
               'Lat':[40.058841,40.202162],
               'Lon':[-75.042164,-74.924594]})
crs='none'
geometry = [Point(xy) for xy in zip(h.Lon, h.Lat)]
hg = GeoDataFrame(h, crs=crs, geometry=geometry)
hg

       Lat          Lon     zip     geometry
0   40.058841   -75.042164  19152   POINT (-75.042164 40.058841)
1   40.202162   -74.924594  19047   POINT (-74.924594 40.202162)

Мне нужно установить CRS, как я сделал с другим GeoDataFrame (вот так):

c=c.to_crs("+init=epsg:3857 +ellps=GRS80 +datum=GGRS87 +units=mi +no_defs")

Я пробовал это:

crs={'init': 'epsg:3857'}

и это:

hg=hg.to_crs("+init=epsg:3857 +ellps=GRS80 +datum=GGRS87 +units=mi +no_defs")

... но не повезло.

Некоторые важные примечания:

  1. Другой GeoDataFrame, для которого работал вышеупомянутый метод .to_crs, был из файла формы, а столбец геометрии был для полигонов, а не точек. Его значения 'geometry' после применения метода .to_crs выглядели так:

    POLYGON ((-5973.005380655156 3399.646267693398 ... и когда я пробую описанное выше с hg GeoDataFrame, они по-прежнему выглядят как обычные координаты широты и долготы.

  2. Если / когда это сработает, я объединю эти точки с многоугольником GeoDataFrame, чтобы построить оба (точки поверх многоугольников).

  3. Когда я сначала пытаюсь объединить GeoDataFrames перед использованием метода .to_crs, а затем использую этот метод одновременно для точечных и многоугольных строк, я получаю следующую ошибку:

    ValueError: невозможно преобразовать наивную геометрию. Пожалуйста, сначала установите crs для объекта.

Заранее спасибо!


person Dance Party2    schedule 15.08.2016    source источник


Ответы (3)


API Geopandas был очищен и теперь работает без сюрпризов. Убедитесь, что вы используете самую последнюю стабильную версию и прочтите документы.

Установить CRS на GeoDataFrame с помощью кода EPSG так же просто, как

gdf.set_crs(epsg=4326, inplace=True)

где gdf - это geopandas.geodataframe.GeoDataFrame. Остерегайтесь явного inplace!

Итак, в приведенном выше примере это будет:

import pandas as pd
from shapely.geometry import Point
from geopandas import GeoDataFrame

df = pd.DataFrame({'zip':[19152,19047],
               'Lat':[40.058841,40.202162],
               'Lon':[-75.042164,-74.924594]})

geometry = [Point(xy) for xy in zip(df.Lon, df.Lat)]
gdf = GeoDataFrame(df, geometry=geometry)

gdf.set_crs(epsg=4326, inplace=True)
# ^ comment out to get a "Cannot transform naive geometries" error below

# project to merkator
gdf.to_crs(epsg=3395)

     zip        Lat        Lon                          geometry
0  19152  40.058841 -75.042164  POINT (-8353655.485 4846992.030)
1  19047  40.202162 -74.924594  POINT (-8340567.652 4867777.107)
person Ufos    schedule 30.08.2018
comment
GeoDataFrame(df, geometry=geometry, crs='EPSG:4326') тоже подойдет - person Ufos; 29.10.2020
comment
@JanPisl, он работает с последней стабильной версией геопанд (0.8.2). Что вы имеете в виду под недействительным? Какую версию Python и geopandas вы используете? - person Ufos; 01.02.2021
comment
Ладно, извини, я плохой! Пользуюсь 0.7. Позвольте мне исправить себя: если вы получите *** AttributeError: объект 'GeoDataFrame' не имеет атрибута 'set_crs', попробуйте ответить от shyam - person Jan Pisl; 01.02.2021

Формат настройки CRS в GeoPandas теперь

gdf.crs = "EPSG:4326"

Предыдущий формат устарел

ссылка: https://geopandas.org/projection.html

person shyam    schedule 27.05.2020
comment
в таких случаях лучше предложить и отредактировать уже принятый ответ или, по крайней мере, оставить комментарий. Я обновил свой ответ, изменения должны вступить в силу, как только кто-нибудь их рассмотрит. - person Ufos; 28.09.2020

Ответ все время был здесь:

hg=hg.to_crs(c.crs)

Это устанавливает crs для hg равным c.

person Dance Party2    schedule 15.08.2016
comment
Ответ тоже неверен. to_crs преобразует одну CRS в другую, а .crs = {...} устанавливает начальную CRS. - person Ufos; 30.08.2018
comment
@Ufos, ты тоже говоришь, ты полагаешь, что все ответы в этой ветке неверны? - person baxx; 22.02.2020
comment
@baxx мой другой комментарий был удален, так как ссылка в ответе была исправлена. Комментарий был: ссылка мертва. Итак, сейчас тоже не имеет смысла, но я не могу редактировать комментарий. - person Ufos; 26.02.2020
comment
Если вы проверите ссылку, которая сейчас работает, вы увидите, что to_crs используется для преобразования координат, а не для установки CRS. - person Ufos; 26.02.2020