Reputation: 7536
Given the following 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)
I need to set the CRS as I did with another GeoDataFrame (like this):
c=c.to_crs("+init=epsg:3857 +ellps=GRS80 +datum=GGRS87 +units=mi +no_defs")
I've tried this:
crs={'init': 'epsg:3857'}
and this:
hg=hg.to_crs("+init=epsg:3857 +ellps=GRS80 +datum=GGRS87 +units=mi +no_defs")
...but no luck.
Some important notes:
The other GeoDataFrame for which the above .to_crs method worked was from a shape file and the geometry column was for polygons, not points. Its 'geometry' values looked like this after the .to_crs method was applied:
POLYGON ((-5973.005380655156 3399.646267693398... and when I try the above with the hg GeoDataFrame, they still look like regular lat/long coordinates.
If/when this works out, I'll then concatenate these points with the polygon GeoDataFrame in order to plot both (points on top of polygons).
When I try concatenating the GeoDataFrames first before using the .to_crs method, and then I use the method on both the point and polygon rows at once, I get the following error:
ValueError: Cannot transform naive geometries. Please set a crs on the object first.
Thanks in advance!
Upvotes: 36
Views: 62595
Reputation: 3305
Geopandas API got cleaned up, and now works without surprises. Make sure to use the lastest stable version and read the docs.
Setting the CRS on a GeoDataFrame using its EPSG code is as simple as
gdf.set_crs(epsg=4326, inplace=True)
where gdf
is a geopandas.geodataframe.GeoDataFrame
. Watch out for the explicit inplace
!
So in the example above it would be:
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)
Upvotes: 69
Reputation: 141
The format for Setting CRS in GeoPandas is now
gdf.crs = "EPSG:4326"
The earlier format is deprecated
ref: https://geopandas.org/projections.html
Upvotes: 14
Reputation: 7536
The answer was here all along:
hg=hg.to_crs(c.crs)
This sets the crs for hg to that of c.
Upvotes: 2