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!
To transform the geometries to a new CRS, use the to_crs method. The value can be anything accepted by pyproj. CRS. from_user_input() , such as an authority string (eg “EPSG:4326”) or a WKT string.
Coordinate Reference Systems CRS are important because the geometric shapes in a GeoSeries or GeoDataFrame object are simply a collection of coordinates in an arbitrary space. A CRS tells Python how those coordinates related to places on the Earth. CRS are referred to using codes called proj4 strings.
Changing the projection is really easy to do in Geopandas with . to_crs() -function. As an input for the function, you should define the column containing the geometries, i.e. geometry in this case, and a epgs value of the projection that you want to use.
to_crs(crs=None, epsg=None) Returns a GeoSeries with all geometries transformed to a new coordinate reference system. Transform all geometries in a GeoSeries to a different coordinate reference system. The crs attribute on the current GeoSeries must be set. Either crs or epsg may be specified for output.
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)
The format for Setting CRS in GeoPandas is now
gdf.crs = "EPSG:4326"
The earlier format is deprecated
ref: https://geopandas.org/projections.html
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With